Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix handling of "\" escape character in identifier names #41540

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/publish_timestamped_release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ on:
push:
branches:
- query-grouping-aggregation
- identifier_unescaping
workflow_dispatch:

jobs:
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/pull_request_ubuntu_build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ on:
- native-build
- revert-client-decl-master
- query-grouping-aggregation
- identifier_unescaping

jobs:
ubuntu_build:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -603,7 +603,7 @@ private void loadTableType(MethodVisitor mv, BTableType bType) {
mv.visitInsn(DUP);
mv.visitLdcInsn((long) i);
mv.visitInsn(L2I);
mv.visitLdcInsn(Utils.unescapeJava(fieldName));
mv.visitLdcInsn(fieldName);
mv.visitInsn(AASTORE);
i += 1;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
*/
package org.wso2.ballerinalang.compiler.desugar;

import io.ballerina.identifier.Utils;
import io.ballerina.tools.diagnostics.Location;
import org.ballerinalang.model.TreeBuilder;
import org.ballerinalang.model.elements.Flag;
Expand Down Expand Up @@ -625,9 +624,9 @@ private void generateClosureForDefaultValues(String closureName, String paramNam
if (symbol.getKind() == SymbolKind.INVOKABLE_TYPE) {
BInvokableTypeSymbol invokableTypeSymbol = (BInvokableTypeSymbol) symbol;
updateFunctionParams(function, invokableTypeSymbol.params, paramName);
invokableTypeSymbol.defaultValues.put(Utils.unescapeBallerina(paramName), varSymbol);
invokableTypeSymbol.defaultValues.put(paramName, varSymbol);
} else {
((BRecordTypeSymbol) symbol).defaultValues.put(Utils.unescapeBallerina(paramName), varSymbol);
((BRecordTypeSymbol) symbol).defaultValues.put(paramName, varSymbol);
lambdaFunction.function.flagSet.add(Flag.RECORD);
}
env.enclPkg.symbol.scope.define(function.symbol.name, function.symbol);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
*/
package org.wso2.ballerinalang.compiler.desugar;

import io.ballerina.identifier.Utils;
import io.ballerina.runtime.api.constants.RuntimeConstants;
import io.ballerina.tools.diagnostics.Location;
import org.ballerinalang.compiler.CompilerPhase;
Expand Down Expand Up @@ -1770,8 +1769,8 @@ private void createVarDefStmts(BLangRecordVariable parentRecordVariable, BLangBl
List<BLangRecordVariableKeyValue> variableList = parentRecordVariable.variableList;
for (BLangRecordVariableKeyValue recordFieldKeyValue : variableList) {
BLangVariable variable = recordFieldKeyValue.valueBindingPattern;
BLangLiteral indexExpr = ASTBuilderUtil.createLiteral(variable.pos, symTable.stringType,
Utils.unescapeJava(recordFieldKeyValue.key.value));
BLangLiteral indexExpr =
ASTBuilderUtil.createLiteral(variable.pos, symTable.stringType, recordFieldKeyValue.key.value);

if (recordFieldKeyValue.valueBindingPattern.getKind() == NodeKind.VARIABLE) {
createSimpleVarDefStmt((BLangSimpleVariable) recordFieldKeyValue.valueBindingPattern, parentBlockStmt,
Expand Down Expand Up @@ -2826,7 +2825,7 @@ private void createVarRefAssignmentStmts(BLangRecordVarRef parentRecordVarRef, B
for (BLangRecordVarRefKeyValue varRefKeyValue : variableRefList) {
BLangExpression expression = varRefKeyValue.variableReference;
BLangLiteral indexExpr = ASTBuilderUtil.createLiteral(expression.pos, symTable.stringType,
Utils.unescapeJava(varRefKeyValue.variableName.getValue()));
varRefKeyValue.variableName.getValue());

if (NodeKind.SIMPLE_VARIABLE_REF == expression.getKind() ||
NodeKind.FIELD_BASED_ACCESS_EXPR == expression.getKind() ||
Expand Down Expand Up @@ -6118,12 +6117,12 @@ private List<String> getNamesOfUserSpecifiedRecordFields(List<RecordLiteralNode.
if (field.isKeyValueField()) {
BLangExpression key = ((BLangRecordLiteral.BLangRecordKeyValueField) field).key.expr;
if (key.getKind() == NodeKind.LITERAL) {
fieldNames.add(Utils.unescapeBallerina(((BLangLiteral) key).value.toString()));
fieldNames.add(((BLangLiteral) key).value.toString());
} else if (key.getKind() == NodeKind.SIMPLE_VARIABLE_REF) {
fieldNames.add(Utils.unescapeBallerina(((BLangSimpleVarRef) key).variableName.value));
fieldNames.add(((BLangSimpleVarRef) key).variableName.value);
}
} else if (field.getKind() == NodeKind.SIMPLE_VARIABLE_REF) {
fieldNames.add(Utils.unescapeBallerina(((BLangSimpleVarRef) field).variableName.value));
fieldNames.add(((BLangSimpleVarRef) field).variableName.value);
} else {
addRequiredFieldsFromSpreadOperator(field, fieldNames);
}
Expand All @@ -6140,7 +6139,7 @@ private void addRequiredFieldsFromSpreadOperator(RecordLiteralNode.RecordField f
return;
}
for (BField bField : ((BRecordType) type).fields.values()) {
fieldNames.add(Utils.unescapeBallerina(bField.name.value));
fieldNames.add(bField.name.value);
}
}

Expand Down Expand Up @@ -6179,7 +6178,7 @@ private BLangRecordLiteral.BLangRecordKeyValueField createRecordKeyValueField(Lo
BLangExpression expression) {
BLangRecordLiteral.BLangRecordKeyValueField member = new BLangRecordLiteral.BLangRecordKeyValueField();
member.key = new BLangRecordLiteral.BLangRecordKey(ASTBuilderUtil.createLiteral(pos, symTable.stringType,
Utils.unescapeJava(fieldName)));
fieldName));
member.valueExpr = types.addConversionExprIfRequired(expression, expression.getBType());
return member;
}
Expand Down Expand Up @@ -6349,8 +6348,7 @@ private void rewriteFieldBasedAccess(BLangFieldBasedAccess fieldAccessExpr) {
fieldAccessExpr.expr = types.addConversionExprIfRequired(fieldAccessExpr.expr, varRefType);
}

BLangLiteral stringLit = createStringLiteral(fieldAccessExpr.field.pos,
Utils.unescapeJava(fieldAccessExpr.field.value));
BLangLiteral stringLit = createStringLiteral(fieldAccessExpr.field.pos, fieldAccessExpr.field.value);
BType refType = Types.getImpliedType(varRefType);
int varRefTypeTag = refType.tag;
if (varRefTypeTag == TypeTags.OBJECT ||
Expand Down Expand Up @@ -6780,7 +6778,7 @@ private BLangStatementExpression createStmtExpr(BLangInvocation invocation) {
continue;
}

BInvokableSymbol invokableSymbol = defaultValues.get(Utils.unescapeBallerina(paramName));
BInvokableSymbol invokableSymbol = defaultValues.get(paramName);
BLangInvocation closureInvocation = getFunctionPointerInvocation(invokableSymbol);
for (int m = 0; m < invokableSymbol.params.size(); m++) {
String langLibFuncParam = invokableSymbol.params.get(m).name.value;
Expand Down Expand Up @@ -6829,8 +6827,8 @@ public void visit(BLangErrorConstructorExpr errorConstructorExpr) {
} else {
for (BLangNamedArgsExpression namedArg : errorConstructorExpr.namedArgs) {
BLangRecordLiteral.BLangRecordKeyValueField member = new BLangRecordLiteral.BLangRecordKeyValueField();
member.key = new BLangRecordLiteral.BLangRecordKey(ASTBuilderUtil.createLiteral(namedArg.name.pos,
symTable.stringType, Utils.unescapeJava(namedArg.name.value)));
member.key = new BLangRecordLiteral.BLangRecordKey(
ASTBuilderUtil.createLiteral(namedArg.name.pos, symTable.stringType, namedArg.name.value));

if (Types.getImpliedType(recordLiteral.getBType()).tag == TypeTags.RECORD) {
member.valueExpr = types.addConversionExprIfRequired(namedArg.expr, symTable.anyType);
Expand Down Expand Up @@ -10573,8 +10571,8 @@ private BLangRecordLiteral rewriteMappingConstructor(BLangRecordLiteral mappingC
if (key.computedKey) {
keyExpr = origKey;
} else {
keyExpr = origKey.getKind() == NodeKind.SIMPLE_VARIABLE_REF ? createStringLiteral(pos,
Utils.unescapeJava(((BLangSimpleVarRef) origKey).variableName.value)) :
keyExpr = origKey.getKind() == NodeKind.SIMPLE_VARIABLE_REF ?
createStringLiteral(pos, ((BLangSimpleVarRef) origKey).variableName.value) :
((BLangLiteral) origKey);
}

Expand All @@ -10587,7 +10585,7 @@ private BLangRecordLiteral rewriteMappingConstructor(BLangRecordLiteral mappingC
} else if (field.getKind() == NodeKind.SIMPLE_VARIABLE_REF) {
BLangSimpleVarRef varRefField = (BLangSimpleVarRef) field;
rewrittenFields.add(ASTBuilderUtil.createBLangRecordKeyValue(
rewriteExpr(createStringLiteral(pos, Utils.unescapeJava(varRefField.variableName.value))),
rewriteExpr(createStringLiteral(pos, varRefField.variableName.value)),
rewriteExpr(varRefField)));
} else {
BLangRecordLiteral.BLangRecordSpreadOperatorField spreadOpField =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -913,7 +913,7 @@ private void createAnonymousTypeDefForConstantDeclaration(BLangConstant constant

// Create a new anonymous type definition.
BLangTypeDefinition typeDef = (BLangTypeDefinition) TreeBuilder.createTypeDefinition();
this.anonTypeNameSuffixes.push(constantNode.name.value);
this.anonTypeNameSuffixes.push(constantNode.name.originalValue);
String genName = anonymousModelHelper.getNextAnonymousTypeKey(packageID, anonTypeNameSuffixes);
this.anonTypeNameSuffixes.pop();
IdentifierNode anonTypeGenName = createIdentifier(symTable.builtinPos, genName, constantNode.name.value);
Expand Down Expand Up @@ -979,7 +979,7 @@ public BLangNode transform(TypeDefinitionNode typeDefNode) {
typeDef.markdownDocumentationAttachment =
createMarkdownDocumentationAttachment(getDocumentationString(typeDefNode.metadata()));

this.anonTypeNameSuffixes.push(typeDef.name.value);
this.anonTypeNameSuffixes.push(typeDef.name.originalValue);
typeDef.typeNode = createTypeNode(typeDefNode.typeDescriptor());
this.anonTypeNameSuffixes.pop();

Expand Down Expand Up @@ -1577,7 +1577,7 @@ private void populateFunctionNode(BLangIdentifier name, NodeList<Token> qualifie
//Set method qualifiers
setFunctionQualifiers(bLFunction, qualifierList);
// Set function signature
this.anonTypeNameSuffixes.push(name.value);
this.anonTypeNameSuffixes.push(name.originalValue);
populateFuncSignature(bLFunction, functionSignature);
this.anonTypeNameSuffixes.pop();

Expand Down Expand Up @@ -1782,10 +1782,10 @@ public BLangNode transform(NamedWorkerDeclarationNode namedWorkerDeclNode) {
String workerOriginalName = workerName;
if (workerName.startsWith(IDENTIFIER_LITERAL_PREFIX)) {
bLFunction.defaultWorkerName.setOriginalValue(workerName);
workerName = Utils.unescapeUnicodeCodepoints(workerName.substring(1));
workerName = workerName.substring(1);
}

bLFunction.defaultWorkerName.value = workerName;
bLFunction.defaultWorkerName.value = Utils.unescapeBallerina(workerName);
bLFunction.defaultWorkerName.pos = getPosition(namedWorkerDeclNode.workerName());

NodeList<AnnotationNode> annotations = namedWorkerDeclNode.annotations();
Expand Down Expand Up @@ -3881,7 +3881,7 @@ public BLangConstant transformEnumMember(EnumMemberNode member, Boolean publicQu

BLangIdentifier memberName = (BLangIdentifier) transform(member.identifier());
bLangConstant.setName(memberName);
this.anonTypeNameSuffixes.push(memberName.value);
this.anonTypeNameSuffixes.push(memberName.originalValue);

BLangExpression deepLiteral;
if (member.constExprNode().isPresent()) {
Expand All @@ -3905,7 +3905,7 @@ public BLangConstant transformEnumMember(EnumMemberNode member, Boolean publicQu
literal.originalValue = null;
typeNodeAssociated.addValue(deepLiteral);
bLangConstant.associatedTypeDefinition = createTypeDefinitionWithTypeNode(typeNodeAssociated,
memberName.value);
memberName.originalValue);
} else {
bLangConstant.associatedTypeDefinition = null;
}
Expand Down Expand Up @@ -5489,7 +5489,8 @@ private BLangNode createActionOrExpression(Node actionOrExpression) {
BLangSimpleVarRef bLVarRef = (BLangSimpleVarRef) TreeBuilder.createSimpleVariableReferenceNode();
bLVarRef.pos = getPosition(actionOrExpression);
bLVarRef.pkgAlias = this.createIdentifier(nameReference[0].getPosition(), nameReference[0].getValue());
bLVarRef.variableName = this.createIdentifier(nameReference[1].getPosition(), nameReference[1].getValue());
bLVarRef.variableName =
this.createIdentifier(nameReference[1].getPosition(), nameReference[1].originalValue);
return bLVarRef;
} else if (actionOrExpression.kind() == SyntaxKind.BRACED_EXPRESSION) {
BLangGroupExpr group = (BLangGroupExpr) TreeBuilder.createGroupExpressionNode();
Expand Down Expand Up @@ -6060,10 +6061,10 @@ private BLangIdentifier createIdentifier(Location pos, String value, String orig
}

if (value.startsWith(IDENTIFIER_LITERAL_PREFIX)) {
bLIdentifer.setValue(Utils.unescapeUnicodeCodepoints(value.substring(1)));
bLIdentifer.setValue(Utils.unescapeBallerina(value.substring(1)));
bLIdentifer.setLiteral(true);
} else {
bLIdentifer.setValue(Utils.unescapeUnicodeCodepoints(value));
bLIdentifer.setValue(Utils.unescapeBallerina(value));
bLIdentifer.setLiteral(false);
}
bLIdentifer.setOriginalValue(originalValue);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
*/
package org.wso2.ballerinalang.compiler.semantics.analyzer;

import io.ballerina.identifier.Utils;
import io.ballerina.tools.diagnostics.Location;
import org.ballerinalang.compiler.CompilerPhase;
import org.ballerinalang.model.elements.Flag;
Expand Down Expand Up @@ -2424,8 +2423,7 @@ public void visit(BLangRecordLiteral recordLiteral, AnalyzerData data) {
}
}

LinkedHashMap<String, BField> fieldsInRecordType = getUnescapedFieldList(spreadExprRecordType.fields);

LinkedHashMap<String, BField> fieldsInRecordType = spreadExprRecordType.fields;
for (Object fieldName : names) {
if (!fieldsInRecordType.containsKey(fieldName) && !isSpreadExprRecordTypeSealed) {
this.dlog.error(spreadOpExpr.pos,
Expand Down Expand Up @@ -2476,24 +2474,21 @@ public void visit(BLangRecordLiteral recordLiteral, AnalyzerData data) {

if (keyExpr.getKind() == NodeKind.SIMPLE_VARIABLE_REF) {
String name = ((BLangSimpleVarRef) keyExpr).variableName.value;
String unescapedName = Utils.unescapeJava(name);
if (names.contains(unescapedName)) {
if (names.contains(name)) {
this.dlog.error(keyExpr.pos, DiagnosticErrorCode.DUPLICATE_KEY_IN_MAPPING_CONSTRUCTOR,
Types.getImpliedType(recordLiteral.expectedType).getKind().typeName(),
unescapedName);
} else if (inclusiveTypeSpreadField != null && !neverTypedKeys.contains(unescapedName)) {
Types.getImpliedType(recordLiteral.expectedType).getKind().typeName(), name);
} else if (inclusiveTypeSpreadField != null && !neverTypedKeys.contains(name)) {
this.dlog.error(keyExpr.pos,
DiagnosticErrorCode.POSSIBLE_DUPLICATE_OF_FIELD_SPECIFIED_VIA_SPREAD_OP,
unescapedName, inclusiveTypeSpreadField);
DiagnosticErrorCode.POSSIBLE_DUPLICATE_OF_FIELD_SPECIFIED_VIA_SPREAD_OP, name,
inclusiveTypeSpreadField);
}

if (!isInferredRecordForMapCET && isOpenRecord
&& !((BRecordType) referredType).fields.containsKey(name)) {
dlog.error(keyExpr.pos, DiagnosticErrorCode.INVALID_RECORD_LITERAL_IDENTIFIER_KEY,
unescapedName);
dlog.error(keyExpr.pos, DiagnosticErrorCode.INVALID_RECORD_LITERAL_IDENTIFIER_KEY, name);
}

names.add(unescapedName);
names.add(name);
} else if (keyExpr.getKind() == NodeKind.LITERAL || keyExpr.getKind() == NodeKind.NUMERIC_LITERAL) {
Object name = ((BLangLiteral) keyExpr).value;
if (names.contains(name)) {
Expand All @@ -2519,16 +2514,7 @@ public void visit(BLangRecordLiteral recordLiteral, AnalyzerData data) {
public void visit(BLangRecordLiteral.BLangRecordVarNameField node, AnalyzerData data) {
visit((BLangSimpleVarRef) node, data);
}

private LinkedHashMap<String, BField> getUnescapedFieldList(LinkedHashMap<String, BField> fieldMap) {
LinkedHashMap<String, BField> newMap = new LinkedHashMap<>();
for (String key : fieldMap.keySet()) {
newMap.put(Utils.unescapeJava(key), fieldMap.get(key));
}

return newMap;
}


@Override
public void visit(BLangSimpleVarRef varRefExpr, AnalyzerData data) {
switch (varRefExpr.parent.getKind()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1725,7 +1725,7 @@ public BType transform(BLangUserDefinedType userDefinedTypeNode, AnalyzerData da
if (!missingNodesHelper.isMissingNode(pkgAlias) && !missingNodesHelper.isMissingNode(typeName) &&
!symbolEnter.isUnknownTypeRef(userDefinedTypeNode)
&& typeResolver.isNotUnknownTypeRef(userDefinedTypeNode)) {
dlog.error(userDefinedTypeNode.pos, data.diagCode, typeName);
dlog.error(userDefinedTypeNode.pos, data.diagCode, names.originalNameFromIdNode(typeNameIdentifier));
}
return symTable.semanticError;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
*/
package org.wso2.ballerinalang.compiler.semantics.analyzer;

import io.ballerina.identifier.Utils;
import io.ballerina.tools.diagnostics.DiagnosticCode;
import io.ballerina.tools.diagnostics.Location;
import org.ballerinalang.model.TreeBuilder;
Expand Down Expand Up @@ -3226,7 +3225,7 @@ public void visit(BLangSimpleVarRef varRefExpr, AnalyzerData data) {
}
} else {
varRefExpr.symbol = symbol; // Set notFoundSymbol
logUndefinedSymbolError(varRefExpr.pos, varName.value);
logUndefinedSymbolError(varRefExpr.pos, names.originalNameFromIdNode(identifier).value);
}
}

Expand Down Expand Up @@ -9183,8 +9182,8 @@ private BType checkRecordIndexBasedAccess(BLangIndexBasedAccess accessExpr, BRec
case TypeTags.STRING:
case TypeTags.CHAR_STRING:
if (isConstExpr(indexExpr)) {
String fieldName = Utils.escapeSpecialCharacters(getConstFieldName(indexExpr));
actualType = checkRecordRequiredFieldAccess(accessExpr, Names.fromString(fieldName), record, data);
String fieldName = getConstFieldName(indexExpr);
actualType = checkRecordRequiredFieldAccess(accessExpr, names.fromString(fieldName), record, data);
if (actualType != symTable.semanticError) {
return actualType;
}
Expand Down
Loading