From b15ac12f5f1f9a17c0427d4d793d5966f966f9c6 Mon Sep 17 00:00:00 2001 From: rdulmina Date: Mon, 27 Jan 2025 16:30:03 +0530 Subject: [PATCH 1/5] Desugar field access expression to if statement expression --- .../compiler/desugar/Desugar.java | 101 +++++++++++++++++- 1 file changed, 97 insertions(+), 4 deletions(-) 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 049701b1cd49..a4b39301f777 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 @@ -6339,12 +6339,13 @@ public void visit(BLangSimpleVarRef varRefExpr) { @Override public void visit(BLangFieldBasedAccess.BLangPrefixedFieldBasedAccess prefixedFieldBasedAccess) { - rewriteFieldBasedAccess(prefixedFieldBasedAccess); + rewriteFieldBasedAccess(prefixedFieldBasedAccess, true); } - private void rewriteFieldBasedAccess(BLangFieldBasedAccess fieldAccessExpr) { + private void rewriteFieldBasedAccess(BLangFieldBasedAccess fieldAccessExpr, boolean prefixedFieldBased) { if (safeNavigate(fieldAccessExpr)) { - result = rewriteExpr(rewriteSafeNavigationExpr(fieldAccessExpr)); + result = prefixedFieldBased? rewriteExpr(rewriteSafeNavigationExpr(fieldAccessExpr)) : + rewriteExpr(rewriteSafeFieldBasedAccessExpr(fieldAccessExpr)); return; } @@ -6438,7 +6439,7 @@ private void rewriteFieldBasedAccess(BLangFieldBasedAccess fieldAccessExpr) { @Override public void visit(BLangFieldBasedAccess fieldAccessExpr) { - rewriteFieldBasedAccess(fieldAccessExpr); + rewriteFieldBasedAccess(fieldAccessExpr, false); } private BLangNode rewriteObjectMemberAccessAsField(BLangFieldBasedAccess fieldAccessExpr) { @@ -10048,6 +10049,98 @@ private boolean safeNavigate(BLangAccessExpression accessExpr) { return false; } + private BLangExpression rewriteSafeFieldBasedAccessExpr(BLangAccessExpression accessExpr) { + /* + * Following is the structure of the safe navigation desugar. + * Before : + * type A { + * B b; + * } + * type B { + * int c; + * } + * int? res = a?.b?.c + * + * After desugar : + * any|error temp_result; + * temp_result = a; + * if temp_result !is error? { + * temp_result = ( temp_result).b; + * if temp_result !is error? { + * temp_result = ( temp_result).c; + * } + * } + * int? res = temp_result; + */ + Location pos = accessExpr.pos; + // Create block statement to hold desugared statements. + BLangBlockStmt blockStmt = ASTBuilderUtil.createBlockStmt(pos); + + // Create a temp variable to hold the intermediate result of the access expression. + String matchTempResultVarName = GEN_VAR_PREFIX.value + "temp_result"; + BLangSimpleVariableDef tempResultVarDef = createVarDef(matchTempResultVarName, symTable.anyOrErrorType, + null, pos); + blockStmt.addStatement(tempResultVarDef); + BLangSimpleVarRef tempResultVarRef = ASTBuilderUtil.createVariableRef(pos, tempResultVarDef.var.symbol); + + createNestedIfForAccessExpression(blockStmt, accessExpr, tempResultVarRef, pos); + + BLangStatementExpression stmtExpr = createStatementExpression(blockStmt, + types.addConversionExprIfRequired(tempResultVarRef, accessExpr.getBType())); + stmtExpr.setBType(accessExpr.getBType()); + return stmtExpr; + } + + private BLangIf createNestedIfForAccessExpression(BLangBlockStmt blockStmt, BLangAccessExpression accessExpr, + BLangSimpleVarRef tempResultVarRef, Location pos) { + NodeKind kind = accessExpr.expr.getKind(); + if (kind == NodeKind.FIELD_BASED_ACCESS_EXPR) { + BLangIf ifStmt = createNestedIfForAccessExpression(blockStmt, (BLangAccessExpression) accessExpr.expr, + tempResultVarRef, pos); + blockStmt = ifStmt.body; + } else { + // this else block only reach one time in the recursive execution + // this will assign the initial value for the `tempResultVarRef` eg: `temp_result = a;` in the sample + blockStmt.addStatement(ASTBuilderUtil.createAssignmentStmt(pos, tempResultVarRef, accessExpr.expr)); + } + + // Condition + BLangType testTypeNode = null; + if (accessExpr.errorSafeNavigation && accessExpr.nilSafeNavigation) { + testTypeNode = getErrorOrNillTypeNode(); + } else if (accessExpr.errorSafeNavigation) { + testTypeNode = getErrorTypeNode(); + } else if (accessExpr.nilSafeNavigation) { + testTypeNode = getNillTypeNode(); + } + + BLangExpression conditionExpr; + if (testTypeNode == null) { + conditionExpr = getBooleanLiteral(true); + } else { + BLangTypeTestExpr isNilOrErrorTest = createTypeCheckExpr(pos, tempResultVarRef, testTypeNode); + isNilOrErrorTest.isNegation = true; + isNilOrErrorTest.setBType(symTable.booleanType); + conditionExpr = isNilOrErrorTest; + } + + // If body + BLangAccessExpression tempAccessExpr = nodeCloner.cloneNode(accessExpr); + BType type = types.getSafeType(accessExpr.expr.getBType(), true, true); + tempAccessExpr.expr = types.addConversionExprIfRequired(tempResultVarRef, type); + tempAccessExpr.errorSafeNavigation = false; + tempAccessExpr.nilSafeNavigation = false; + BLangAssignment assignmentStmt = + ASTBuilderUtil.createAssignmentStmt(symTable.builtinPos, tempResultVarRef, tempAccessExpr); + BLangBlockStmt ifBody = ASTBuilderUtil.createBlockStmt(symTable.builtinPos); + ifBody.addStatement(assignmentStmt); + + BLangIf ifStmt = ASTBuilderUtil.createIfStmt(pos, blockStmt); + ifStmt.setCondition(conditionExpr); + ifStmt.body = ifBody; + return ifStmt; + } + private BLangExpression rewriteSafeNavigationExpr(BLangAccessExpression accessExpr) { BType originalExprType = accessExpr.getBType(); // Create a temp variable to hold the intermediate result of the acces expression. From dfd8485150f527988d6277678b2c7d5fde0391e3 Mon Sep 17 00:00:00 2001 From: rdulmina Date: Tue, 28 Jan 2025 15:45:52 +0530 Subject: [PATCH 2/5] Add tests --- .../expressions/access/FieldAccessTest.java | 5 +++++ .../expressions/access/field_access.bal | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/expressions/access/FieldAccessTest.java b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/expressions/access/FieldAccessTest.java index 1c719f4eb2aa..c73f5c9f0d1c 100644 --- a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/expressions/access/FieldAccessTest.java +++ b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/expressions/access/FieldAccessTest.java @@ -310,6 +310,11 @@ public void testValidXMLmapFieldAccess() { BRunUtil.invoke(result, "testValidXMLmapFieldAccess"); } + @Test + public void testLargeChainingFieldAccess() { + BRunUtil.invoke(result, "testLargeChainingFieldAccess"); + } + @Test(dataProvider = "fieldAccessOnJsonTypedRecordFields") public void testFieldAccessOnJsonTypedRecordFields(String function) { BRunUtil.invoke(result, function); diff --git a/tests/jballerina-unit-test/src/test/resources/test-src/expressions/access/field_access.bal b/tests/jballerina-unit-test/src/test/resources/test-src/expressions/access/field_access.bal index 515be89f868a..d817a6f7bb4e 100644 --- a/tests/jballerina-unit-test/src/test/resources/test-src/expressions/access/field_access.bal +++ b/tests/jballerina-unit-test/src/test/resources/test-src/expressions/access/field_access.bal @@ -544,6 +544,25 @@ function testValidXMLmapFieldAccess() { assertEquals(y, null); } +function testLargeChainingFieldAccess() { + // This test is to check the performance of the field access chaining and possible OOM and large method errors + json a = { "a": "b" }; + any|error b = a?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b; + any|error c = a?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b; + any|error d = a?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b; + any|error e = a?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b; + any|error f = a?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b; + any|error g = a?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b; + any|error h = a?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b; + any|error i = a?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b; + any|error j = a?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b; + any|error k = a?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b; + assertEquals(b, ()); + assertEquals(c, ()); + assertEquals(d, ()); + assertEquals(e, ()); +} + isolated function isEqual(anydata|error val1, anydata|error val2) returns boolean { if (val1 is anydata && val2 is anydata) { return (val1 == val2); From 959f1e4f294cad3c23629e6f72306bb52f630937 Mon Sep 17 00:00:00 2001 From: rdulmina Date: Tue, 28 Jan 2025 16:45:54 +0530 Subject: [PATCH 3/5] Update test case --- .../expressions/access/field_access.bal | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/tests/jballerina-unit-test/src/test/resources/test-src/expressions/access/field_access.bal b/tests/jballerina-unit-test/src/test/resources/test-src/expressions/access/field_access.bal index d817a6f7bb4e..8287e51f51be 100644 --- a/tests/jballerina-unit-test/src/test/resources/test-src/expressions/access/field_access.bal +++ b/tests/jballerina-unit-test/src/test/resources/test-src/expressions/access/field_access.bal @@ -547,20 +547,12 @@ function testValidXMLmapFieldAccess() { function testLargeChainingFieldAccess() { // This test is to check the performance of the field access chaining and possible OOM and large method errors json a = { "a": "b" }; - any|error b = a?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b; - any|error c = a?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b; - any|error d = a?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b; - any|error e = a?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b; - any|error f = a?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b; - any|error g = a?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b; - any|error h = a?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b; - any|error i = a?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b; - any|error j = a?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b; - any|error k = a?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b; - assertEquals(b, ()); - assertEquals(c, ()); - assertEquals(d, ()); - assertEquals(e, ()); + anydata|error b = a?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b; + anydata|error c = a?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b; + anydata|error d = a?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b?.b; + assertTrue(b is ()); + assertTrue(c is ()); + assertTrue(d is ()); } isolated function isEqual(anydata|error val1, anydata|error val2) returns boolean { From bdc4935872332c2ca3b3b02db2150f36a51e1575 Mon Sep 17 00:00:00 2001 From: rdulmina Date: Wed, 29 Jan 2025 10:04:43 +0530 Subject: [PATCH 4/5] Fix checkstyle --- .../java/org/wso2/ballerinalang/compiler/desugar/Desugar.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 a4b39301f777..8202b3f90192 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 @@ -6344,7 +6344,7 @@ public void visit(BLangFieldBasedAccess.BLangPrefixedFieldBasedAccess prefixedFi private void rewriteFieldBasedAccess(BLangFieldBasedAccess fieldAccessExpr, boolean prefixedFieldBased) { if (safeNavigate(fieldAccessExpr)) { - result = prefixedFieldBased? rewriteExpr(rewriteSafeNavigationExpr(fieldAccessExpr)) : + result = prefixedFieldBased ? rewriteExpr(rewriteSafeNavigationExpr(fieldAccessExpr)) : rewriteExpr(rewriteSafeFieldBasedAccessExpr(fieldAccessExpr)); return; } From 69fa3d8a253601a08c9be9cb0c16d0ade2fcde0b Mon Sep 17 00:00:00 2001 From: rdulmina Date: Mon, 3 Feb 2025 15:05:25 +0530 Subject: [PATCH 5/5] Remove unwanted node cloning --- .../org/wso2/ballerinalang/compiler/desugar/Desugar.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) 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 8202b3f90192..ea96237bc157 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 @@ -10125,13 +10125,12 @@ private BLangIf createNestedIfForAccessExpression(BLangBlockStmt blockStmt, BLan } // If body - BLangAccessExpression tempAccessExpr = nodeCloner.cloneNode(accessExpr); BType type = types.getSafeType(accessExpr.expr.getBType(), true, true); - tempAccessExpr.expr = types.addConversionExprIfRequired(tempResultVarRef, type); - tempAccessExpr.errorSafeNavigation = false; - tempAccessExpr.nilSafeNavigation = false; + accessExpr.expr = types.addConversionExprIfRequired(tempResultVarRef, type); + accessExpr.errorSafeNavigation = false; + accessExpr.nilSafeNavigation = false; BLangAssignment assignmentStmt = - ASTBuilderUtil.createAssignmentStmt(symTable.builtinPos, tempResultVarRef, tempAccessExpr); + ASTBuilderUtil.createAssignmentStmt(symTable.builtinPos, tempResultVarRef, accessExpr); BLangBlockStmt ifBody = ASTBuilderUtil.createBlockStmt(symTable.builtinPos); ifBody.addStatement(assignmentStmt);