From 239c0be998a4386803d1c0fb846146dfa909a03c Mon Sep 17 00:00:00 2001 From: poorna2152 Date: Thu, 2 Nov 2023 22:04:08 +0530 Subject: [PATCH] Fix failing test cases --- .../compiler/bir/codegen/JvmTypeGen.java | 3 +- .../compiler/desugar/ClosureGenerator.java | 3 +- .../compiler/desugar/Desugar.java | 26 ++++++--------- .../compiler/parser/BLangNodeBuilder.java | 14 ++++---- .../semantics/analyzer/CodeAnalyzer.java | 32 ++++++------------- .../semantics/analyzer/SymbolResolver.java | 2 +- .../semantics/analyzer/TypeChecker.java | 5 ++- .../semantics/analyzer/TypeResolver.java | 9 ++++-- .../evaluation/IdentifierModifier.java | 6 ++-- .../variable/NamedCompoundVariable.java | 6 ++++ .../java/io/ballerina/identifier/Utils.java | 14 +++----- .../literals/IdentifierLiteralTest.java | 4 +-- .../test/identifiers/IdentifierTest.java | 6 ++-- .../identifier_with_escape_char.bal | 7 ++-- 14 files changed, 61 insertions(+), 76 deletions(-) diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/JvmTypeGen.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/JvmTypeGen.java index 205bc5b5779e..b2d993196bc9 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/JvmTypeGen.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/JvmTypeGen.java @@ -18,7 +18,6 @@ package org.wso2.ballerinalang.compiler.bir.codegen; import io.ballerina.identifier.Utils; -import org.apache.commons.lang3.StringEscapeUtils; import org.ballerinalang.compiler.BLangCompilerException; import org.ballerinalang.model.elements.PackageID; import org.ballerinalang.model.symbols.SymbolKind; @@ -653,7 +652,7 @@ private void loadTableType(MethodVisitor mv, BTableType bType) { mv.visitInsn(DUP); mv.visitLdcInsn((long) i); mv.visitInsn(L2I); - mv.visitLdcInsn(StringEscapeUtils.unescapeJava(fieldName)); + mv.visitLdcInsn(fieldName); mv.visitInsn(AASTORE); i += 1; } diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/desugar/ClosureGenerator.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/desugar/ClosureGenerator.java index cb167d786dd7..8aa761430a34 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/desugar/ClosureGenerator.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/desugar/ClosureGenerator.java @@ -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; @@ -556,7 +555,7 @@ private BLangExpression createClosureForDefaultValue(String closureName, String env.enclPkg.symbol.scope.define(function.symbol.name, function.symbol); env.enclPkg.functions.add(function); env.enclPkg.topLevelNodes.add(function); - symbol.defaultValues.put(Utils.unescapeBallerina(paramName), varSymbol); + symbol.defaultValues.put(paramName, varSymbol); return returnStmt.expr; } diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/desugar/Desugar.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/desugar/Desugar.java index 20deedc98a6f..06dda16b8886 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/desugar/Desugar.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/desugar/Desugar.java @@ -17,10 +17,8 @@ */ 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.apache.commons.lang3.StringEscapeUtils; import org.ballerinalang.compiler.CompilerPhase; import org.ballerinalang.model.TreeBuilder; import org.ballerinalang.model.elements.AttachPoint; @@ -1819,9 +1817,8 @@ private void createVarDefStmts(BLangRecordVariable parentRecordVariable, BLangBl List variableList = parentRecordVariable.variableList; for (BLangRecordVariableKeyValue recordFieldKeyValue : variableList) { BLangVariable variable = recordFieldKeyValue.valueBindingPattern; - BLangLiteral indexExpr = ASTBuilderUtil.createLiteral(variable.pos, symTable.stringType, - StringEscapeUtils.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, @@ -2864,8 +2861,7 @@ private void createVarRefAssignmentStmts(BLangRecordVarRef parentRecordVarRef, B for (BLangRecordVarRefKeyValue varRefKeyValue : variableRefList) { BLangExpression expression = varRefKeyValue.variableReference; BLangLiteral indexExpr = ASTBuilderUtil.createLiteral(expression.pos, symTable.stringType, - StringEscapeUtils.unescapeJava( - varRefKeyValue.variableName.getValue())); + varRefKeyValue.variableName.getValue()); if (NodeKind.SIMPLE_VARIABLE_REF == expression.getKind() || NodeKind.FIELD_BASED_ACCESS_EXPR == expression.getKind() || @@ -6055,8 +6051,7 @@ private void rewriteFieldBasedAccess(BLangFieldBasedAccess fieldAccessExpr) { fieldAccessExpr.expr = addConversionExprIfRequired(fieldAccessExpr.expr, varRefType); } - BLangLiteral stringLit = createStringLiteral(fieldAccessExpr.field.pos, - StringEscapeUtils.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 || @@ -6481,7 +6476,7 @@ private BLangStatementExpression createStmtExpr(BLangInvocation invocation) { continue; } - BInvokableSymbol invokableSymbol = defaultValues.get(Utils.unescapeBallerina(paramName)); + BInvokableSymbol invokableSymbol = defaultValues.get(paramName); BLangInvocation closureInvocation = getInvocation(invokableSymbol); for (int m = 0; m < invokableSymbol.params.size(); m++) { String langLibFuncParam = invokableSymbol.params.get(m).name.value; @@ -6530,8 +6525,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, StringEscapeUtils.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 = addConversionExprIfRequired(namedArg.expr, symTable.anyType); @@ -10347,8 +10342,8 @@ private BLangRecordLiteral rewriteMappingConstructor(BLangRecordLiteral mappingC if (key.computedKey) { keyExpr = origKey; } else { - keyExpr = origKey.getKind() == NodeKind.SIMPLE_VARIABLE_REF ? createStringLiteral(pos, - StringEscapeUtils.unescapeJava(((BLangSimpleVarRef) origKey).variableName.value)) : + keyExpr = origKey.getKind() == NodeKind.SIMPLE_VARIABLE_REF ? + createStringLiteral(pos, ((BLangSimpleVarRef) origKey).variableName.value) : ((BLangLiteral) origKey); } @@ -10361,8 +10356,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, - StringEscapeUtils.unescapeJava(varRefField.variableName.value))), + rewriteExpr(createStringLiteral(pos, varRefField.variableName.value)), rewriteExpr(varRefField))); } else { BLangRecordLiteral.BLangRecordSpreadOperatorField spreadOpField = diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/parser/BLangNodeBuilder.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/parser/BLangNodeBuilder.java index eaf924ef3a3b..02abee994364 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/parser/BLangNodeBuilder.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/parser/BLangNodeBuilder.java @@ -902,7 +902,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); @@ -967,7 +967,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(); @@ -1569,7 +1569,7 @@ private void populateFunctionNode(BLangIdentifier name, NodeList 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(); @@ -1765,10 +1765,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 annotations = namedWorkerDeclNode.annotations(); @@ -3843,7 +3843,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()) { @@ -3868,7 +3868,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; } diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/CodeAnalyzer.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/CodeAnalyzer.java index 889e815a1e11..cba9efa720aa 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/CodeAnalyzer.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/CodeAnalyzer.java @@ -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; @@ -2326,8 +2325,7 @@ public void visit(BLangRecordLiteral recordLiteral, AnalyzerData data) { } } - LinkedHashMap fieldsInRecordType = getUnescapedFieldList(spreadExprRecordType.fields); - + LinkedHashMap fieldsInRecordType = spreadExprRecordType.fields; for (Object fieldName : names) { if (!fieldsInRecordType.containsKey(fieldName) && !isSpreadExprRecordTypeSealed) { this.dlog.error(spreadOpExpr.pos, @@ -2378,24 +2376,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)) { @@ -2421,16 +2416,7 @@ public void visit(BLangRecordLiteral recordLiteral, AnalyzerData data) { public void visit(BLangRecordLiteral.BLangRecordVarNameField node, AnalyzerData data) { visit((BLangSimpleVarRef) node, data); } - - private LinkedHashMap getUnescapedFieldList(LinkedHashMap fieldMap) { - LinkedHashMap 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()) { diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/SymbolResolver.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/SymbolResolver.java index b85535897fb9..ab0f1b928285 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/SymbolResolver.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/SymbolResolver.java @@ -1716,7 +1716,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; } diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/TypeChecker.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/TypeChecker.java index 40fbad6c0f37..8f488a1ab528 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/TypeChecker.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/TypeChecker.java @@ -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; @@ -2990,7 +2989,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); } } @@ -8901,7 +8900,7 @@ private BType checkRecordIndexBasedAccess(BLangIndexBasedAccess accessExpr, BRec case TypeTags.STRING: case TypeTags.CHAR_STRING: if (isConstExpr(indexExpr)) { - String fieldName = Utils.escapeSpecialCharacters(getConstFieldName(indexExpr)); + String fieldName = getConstFieldName(indexExpr); actualType = checkRecordRequiredFieldAccess(accessExpr, names.fromString(fieldName), record, data); if (actualType != symTable.semanticError) { return actualType; diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/TypeResolver.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/TypeResolver.java index 4bc173e89a1b..356362d9209a 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/TypeResolver.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/TypeResolver.java @@ -1840,10 +1840,15 @@ public BType defineTypeDefinition(BLangTypeDefinition typeDefinition, BType reso BSymbol typeDefSymbol = Symbols.createTypeDefinitionSymbol(Flags.asMask(typeDefinition.flagSet), names.fromIdNode(typeDefinition.name), env.enclPkg.packageID, resolvedType, env.scope.owner, typeDefinition.name.pos, symEnter.getOrigin(typeDefinition.name.value)); + if (!PackageID.isLangLibPackageID(env.enclPkg.packageID)) { + typeDefSymbol.originalName = names.originalNameFromIdNode(typeDefinition.name); + } typeDefSymbol.markdownDocumentation = symEnter.getMarkdownDocAttachment(typeDefinition.markdownDocumentationAttachment); - BTypeSymbol typeSymbol = new BTypeSymbol(SymTag.TYPE_REF, typeDefSymbol.flags, typeDefSymbol.name, - typeDefSymbol.pkgID, typeDefSymbol.type, typeDefSymbol.owner, typeDefSymbol.pos, typeDefSymbol.origin); + BTypeSymbol typeSymbol = + new BTypeSymbol(SymTag.TYPE_REF, typeDefSymbol.flags, typeDefSymbol.name, typeDefSymbol.originalName, + typeDefSymbol.pkgID, typeDefSymbol.type, typeDefSymbol.owner, typeDefSymbol.pos, + typeDefSymbol.origin); typeSymbol.markdownDocumentation = typeDefSymbol.markdownDocumentation; ((BTypeDefinitionSymbol) typeDefSymbol).referenceType = new BTypeReferenceType(resolvedType, typeSymbol, typeDefSymbol.type.flags); diff --git a/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/evaluation/IdentifierModifier.java b/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/evaluation/IdentifierModifier.java index e8bc44238d1e..3f0dc331e6a5 100644 --- a/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/evaluation/IdentifierModifier.java +++ b/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/evaluation/IdentifierModifier.java @@ -22,8 +22,6 @@ import io.ballerina.compiler.syntax.tree.TreeModifier; import io.ballerina.identifier.Utils; -import static io.ballerina.identifier.Utils.unescapeUnicodeCodepoints; - /** * Identifier specific expression modifier implementation. */ @@ -39,7 +37,7 @@ public IdentifierToken transform(IdentifierToken identifier) { identifierText = identifierText.substring(1); } // Processes escaped unicode codepoints. - String unescapedIdentifier = unescapeUnicodeCodepoints(identifierText); + String unescapedIdentifier = Utils.unescapeBallerina(identifierText); // Encodes the user provided identifier in order to be aligned with JVM runtime identifiers. NonTerminalNode parent = identifier.parent(); @@ -58,7 +56,7 @@ public static String encodeIdentifier(String identifier, IdentifierType type) { if (identifier.startsWith(QUOTED_IDENTIFIER_PREFIX)) { identifier = identifier.substring(1); } - identifier = Utils.unescapeUnicodeCodepoints(identifier); + identifier = Utils.unescapeBallerina(identifier); return type == IdentifierType.METHOD_NAME ? Utils.encodeFunctionIdentifier(identifier) : Utils.encodeNonFunctionIdentifier(identifier); } diff --git a/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/variable/NamedCompoundVariable.java b/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/variable/NamedCompoundVariable.java index 514645e7d418..8362d170c5aa 100644 --- a/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/variable/NamedCompoundVariable.java +++ b/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/variable/NamedCompoundVariable.java @@ -66,6 +66,12 @@ public Value getChildByName(String name) throws DebugVariableException { } if (!namedChildVariables.containsKey(name)) { + for (Map.Entry childVariable : namedChildVariables.entrySet()) { + String escaped = childVariable.getKey().replaceAll("\\$0092(\\$0092)?", "$1"); + if (escaped.equals(name)) { + return childVariable.getValue(); + } + } throw new DebugVariableException("No child variables found with name: '" + name + "'"); } return namedChildVariables.get(name); diff --git a/misc/identifier-util/src/main/java/io/ballerina/identifier/Utils.java b/misc/identifier-util/src/main/java/io/ballerina/identifier/Utils.java index 461da3c79f35..d724d32ba570 100644 --- a/misc/identifier-util/src/main/java/io/ballerina/identifier/Utils.java +++ b/misc/identifier-util/src/main/java/io/ballerina/identifier/Utils.java @@ -44,17 +44,14 @@ private Utils() { private static String encodeSpecialCharacters(String identifier) { StringBuilder sb = new StringBuilder(); - int index = 0; - while (index < identifier.length()) { + char[] characters = identifier.toCharArray(); + for (char character: characters) { String formattedString; - if (identifier.charAt(index) == '\\' && (index + 1 < identifier.length()) && - (formattedString = getFormattedStringForQuotedIdentifiers(identifier.charAt(index + 1))) != null) { + if ((formattedString = getFormattedStringForQuotedIdentifiers(character)) != null) { String unicodePoint = CHAR_PREFIX + formattedString; sb.append(unicodePoint); - index += 2; } else { - sb.append(identifier.charAt(index)); - index++; + sb.append(character); } } return sb.toString(); @@ -72,8 +69,7 @@ public static String escapeSpecialCharacters(String identifier) { private static String encodeIdentifier(String identifier) { if (identifier.contains(ESCAPE_PREFIX)) { - identifier = encodeSpecialCharacters(identifier); - return unescapeJava(identifier); + return encodeSpecialCharacters(identifier); } return identifier; } diff --git a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/expressions/literals/IdentifierLiteralTest.java b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/expressions/literals/IdentifierLiteralTest.java index b1058647495b..2b900fc99817 100644 --- a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/expressions/literals/IdentifierLiteralTest.java +++ b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/expressions/literals/IdentifierLiteralTest.java @@ -98,7 +98,7 @@ public void testTryToAccessUndefinedGlobalVarWithIdentifierLiteral() { CompileResult resultNeg = BCompileUtil.compile("test-src/expressions/literals/identifierliteral" + "/identifier-literal-undefined-variable-negative.bal"); Assert.assertEquals(resultNeg.getErrorCount(), 1); - BAssertUtil.validateError(resultNeg, 0, "undefined symbol 'global\\ v\\ \\\"\\ ar'", 5, 12); + BAssertUtil.validateError(resultNeg, 0, "undefined symbol '\'global\\ v\\ \\\"\\ ar'", 5, 12); } @Test(description = "Test wrong character in identifier literal") @@ -116,7 +116,7 @@ public void testIdentifierLiteralWithWrongCharacter() { BAssertUtil.validateError(resultNeg, i++, "invalid escape sequence '\\'", 4, 9); BAssertUtil.validateError(resultNeg, i++, "invalid escape sequence '\\'", 6, 12); BAssertUtil.validateError(resultNeg, i++, "missing semicolon token", 7, 1); - BAssertUtil.validateError(resultNeg, i++, "undefined symbol 'global\\ v\\ ar'", 7, 12); + BAssertUtil.validateError(resultNeg, i++, "undefined symbol '\'global\\ v\\ ar'", 7, 12); Assert.assertEquals(resultNeg.getErrorCount(), i); } diff --git a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/identifiers/IdentifierTest.java b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/identifiers/IdentifierTest.java index 9d1083d2b133..ba4a0e9d02cd 100644 --- a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/identifiers/IdentifierTest.java +++ b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/identifiers/IdentifierTest.java @@ -78,9 +78,9 @@ public void testInvalidImportOnMultipleFiles() { public void testEscapedIdentifier() { CompileResult result = BCompileUtil.compile("test-src/identifiers/identifier_with_escape_char.bal"); int index = 0; - validateError(result, index++, "redeclared symbol 'a3'", 20, 9); - validateError(result, index++, "redeclared symbol 'student-performance'", 22, 9); - validateError(result, index++, "redeclared symbol 'resource\\1path'", 24, 12); + validateError(result, index++, "redeclared symbol 'a3'", 23, 9); + validateError(result, index++, "redeclared symbol 'student-performance'", 25, 9); + validateError(result, index++, "redeclared symbol 'resource\\1path'", 27, 12); assertEquals(result.getErrorCount(), index); } diff --git a/tests/jballerina-unit-test/src/test/resources/test-src/identifiers/identifier_with_escape_char.bal b/tests/jballerina-unit-test/src/test/resources/test-src/identifiers/identifier_with_escape_char.bal index 17322b11e3b8..57cec50658c8 100644 --- a/tests/jballerina-unit-test/src/test/resources/test-src/identifiers/identifier_with_escape_char.bal +++ b/tests/jballerina-unit-test/src/test/resources/test-src/identifiers/identifier_with_escape_char.bal @@ -13,7 +13,10 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -import ballerina/io; + +public function bar(string x) returns string { + return x; +} public function foo() { int a\3 = 0; @@ -22,5 +25,5 @@ public function foo() { int student\u{002D}performance = 2; string resource\\1path = "https:\\"; string resource\u{005c}1path = "http"; - io:println(resource\\1path); + _ = bar(resource\\1path); }