From 69753c0ec3fca2787839ac24e21a421abba42eae Mon Sep 17 00:00:00 2001 From: mindula Date: Wed, 22 May 2024 14:11:23 +0530 Subject: [PATCH 1/2] Fix bad sad error in semantic analyzer --- .../compiler/semantics/analyzer/SemanticAnalyzer.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/SemanticAnalyzer.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/SemanticAnalyzer.java index cf9cd9884090..a9a7b139d73b 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/SemanticAnalyzer.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/SemanticAnalyzer.java @@ -1876,7 +1876,8 @@ private void handleDeclaredWithVar(BLangVariable variable, AnalyzerData data) { handleWildCardBindingVariable(simpleVariable, currentEnv); long ownerSymTag = currentEnv.scope.owner.tag; - if ((ownerSymTag & SymTag.INVOKABLE) == SymTag.INVOKABLE || (ownerSymTag & SymTag.LET) == SymTag.LET) { + if ((ownerSymTag & SymTag.INVOKABLE) == SymTag.INVOKABLE || (ownerSymTag & SymTag.LET) == SymTag.LET || + (ownerSymTag & SymTag.PACKAGE) == SymTag.PACKAGE) { // This is a variable declared in a function, an action or a resource // If the variable is parameter then the variable symbol is already defined if (simpleVariable.symbol == null) { From 94f32c2f7f352617351547fa007c54ea2ecb7703 Mon Sep 17 00:00:00 2001 From: mindula Date: Wed, 22 May 2024 14:11:51 +0530 Subject: [PATCH 2/2] Add tests --- .../test/query/GroupByClauseTest.java | 3 ++- .../test/query/MultipleLetClauseTest.java | 3 ++- .../query/group_by_clause_with_list_ctr.bal | 19 +++++++++++++++++++ .../test-src/query/multiple-let-clauses.bal | 18 ++++++++++++++++++ 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/query/GroupByClauseTest.java b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/query/GroupByClauseTest.java index e6cb778128a3..87e68e0bc1cc 100644 --- a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/query/GroupByClauseTest.java +++ b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/query/GroupByClauseTest.java @@ -174,7 +174,8 @@ public Object[] dataToTestGroupByClauseWithListCtr() { "testGroupbyVarDefsAndSelectWithGroupingKeysFromClause1", "testGroupByVarDefsAndSelectWithGroupingKeysWithJoinClause1", "testGroupByVarDefsAndSelectWithGroupingKeysWithJoinClause2", - "testGroupByVarAndSelectWithNonGroupingKeysWithJoinClause1" + "testGroupByVarAndSelectWithNonGroupingKeysWithJoinClause1", + "testModuleLevelGroupBy" }; } diff --git a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/query/MultipleLetClauseTest.java b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/query/MultipleLetClauseTest.java index f22c725e1629..a2ae26c87b6a 100644 --- a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/query/MultipleLetClauseTest.java +++ b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/query/MultipleLetClauseTest.java @@ -105,7 +105,8 @@ public Object[] getFuncNames() { "testwildcardBindingPatternInLetClause", "testQueryInLetClauseAsAClosure1", "testQueryInLetClauseAsAClosure2", - "testQueryInLetClauseAsAClosure3" + "testQueryInLetClauseAsAClosure3", + "testModuleLevelLetClause" }; } diff --git a/tests/jballerina-unit-test/src/test/resources/test-src/query/group_by_clause_with_list_ctr.bal b/tests/jballerina-unit-test/src/test/resources/test-src/query/group_by_clause_with_list_ctr.bal index 7746f588cd7d..6a0e186ca729 100644 --- a/tests/jballerina-unit-test/src/test/resources/test-src/query/group_by_clause_with_list_ctr.bal +++ b/tests/jballerina-unit-test/src/test/resources/test-src/query/group_by_clause_with_list_ctr.bal @@ -2246,6 +2246,25 @@ function assertEquality(anydata expected, anydata actual) { panic error("expected '" + expected.toString() + "', found '" + actual.toString() + "'"); } +type Person record {| + string fname; + string lname; + int id; +|}; + +Person[] person = []; + +var v1 = from var st in person + group by var name = st.fname + st.lname + select name; + +function testModuleLevelGroupBy() { + var v2 = from var st in person + group by var name = st.fname + st.lname + select name; + var v3 = v1; +} + // TODO: Add test cases readonly types // TODO: use a client // TODO: xml langlib function diff --git a/tests/jballerina-unit-test/src/test/resources/test-src/query/multiple-let-clauses.bal b/tests/jballerina-unit-test/src/test/resources/test-src/query/multiple-let-clauses.bal index 045c1ed04c79..5eea92cd0c31 100644 --- a/tests/jballerina-unit-test/src/test/resources/test-src/query/multiple-let-clauses.bal +++ b/tests/jballerina-unit-test/src/test/resources/test-src/query/multiple-let-clauses.bal @@ -374,3 +374,21 @@ function assertEquality(any|error expected, any|error actual) { panic error(ASSERTION_ERROR_REASON, message = "expected '" + expectedValAsString + "', found '" + actualValAsString + "'"); } + +type Student record {| + string fname; + string lname; + int id; +|}; + +Student[] students = []; + +var v1 = from var st in students + let var name = st.fname + st.lname + select name; + +function testModuleLevelLetClause() { + var v2 = from var st in students + let var name = st.fname + st.lname + select name; +}