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 1398f14a277d..f1a30baf5f2d 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 @@ -498,6 +498,11 @@ public void visit(BLangFunction funcNode, AnalyzerData data) { //set function param flag to final funcNode.symbol.params.forEach(param -> param.flags |= Flags.FUNCTION_FINAL); + BVarSymbol restParamSym = funcNode.symbol.restParam; + if (restParamSym != null) { + restParamSym.flags |= Flags.FUNCTION_FINAL; + } + if (!funcNode.flagSet.contains(Flag.WORKER)) { // annotation validation for workers is done for the invocation. funcNode.annAttachments.forEach(annotationAttachment -> { diff --git a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/types/finaltypes/FinalAccessTest.java b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/types/finaltypes/FinalAccessTest.java index db77c3b08be6..6e2c009e072f 100644 --- a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/types/finaltypes/FinalAccessTest.java +++ b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/types/finaltypes/FinalAccessTest.java @@ -47,16 +47,21 @@ public void setup() { public void testFinalFailCase() { CompileResult compileResultNegative = BCompileUtil.compile( "test-src/types/finaltypes/test_implicitly_final_negative.bal"); - Assert.assertEquals(compileResultNegative.getErrorCount(), 8); - BAssertUtil.validateError(compileResultNegative, 0, "cannot assign a value to function argument 'a'", 11, 5); - BAssertUtil.validateError(compileResultNegative, 1, "cannot assign a value to function argument 'a'", 17, 5); - BAssertUtil.validateError(compileResultNegative, 2, "cannot assign a value to function argument 'f'", 22, 5); - BAssertUtil.validateError(compileResultNegative, 3, "cannot assign a value to function argument 's'", 23, 5); - BAssertUtil.validateError(compileResultNegative, 4, "cannot assign a value to function argument 'b'", 24, 5); - BAssertUtil.validateError(compileResultNegative, 5, "cannot assign a value to function argument 'j'", 25, 5); - BAssertUtil.validateError(compileResultNegative, 6, "cannot assign a value to function argument 'a'", 38, 5); - BAssertUtil.validateError(compileResultNegative, 7, "invalid assignment: 'listener' declaration is final", + int i = 0; + BAssertUtil.validateError(compileResultNegative, i++, "cannot assign a value to function argument 'a'", 11, 5); + BAssertUtil.validateError(compileResultNegative, i++, "cannot assign a value to function argument 'a'", 17, 5); + BAssertUtil.validateError(compileResultNegative, i++, "cannot assign a value to function argument 'f'", 22, 5); + BAssertUtil.validateError(compileResultNegative, i++, "cannot assign a value to function argument 's'", 23, 5); + BAssertUtil.validateError(compileResultNegative, i++, "cannot assign a value to function argument 'b'", 24, 5); + BAssertUtil.validateError(compileResultNegative, i++, "cannot assign a value to function argument 'j'", 25, 5); + BAssertUtil.validateError(compileResultNegative, i++, "cannot assign a value to function argument 'a'", 38, 5); + BAssertUtil.validateError(compileResultNegative, i++, "invalid assignment: 'listener' declaration is final", 45, 5); + BAssertUtil.validateError(compileResultNegative, i++, "cannot assign a value to function argument 'p2'", 49, 5); + BAssertUtil.validateError(compileResultNegative, i++, "cannot assign a value to function argument 'b'", 53, 9); + BAssertUtil.validateError(compileResultNegative, i++, "cannot assign a value to function argument 'b'", 59, 9); + BAssertUtil.validateError(compileResultNegative, i++, "cannot assign a value to function argument 'b'", 66, 9); + Assert.assertEquals(compileResultNegative.getErrorCount(), i); } @Test diff --git a/tests/jballerina-unit-test/src/test/resources/test-src/types/finaltypes/test_implicitly_final_negative.bal b/tests/jballerina-unit-test/src/test/resources/test-src/types/finaltypes/test_implicitly_final_negative.bal index bc5e6a8db91b..d7de92a7a443 100644 --- a/tests/jballerina-unit-test/src/test/resources/test-src/types/finaltypes/test_implicitly_final_negative.bal +++ b/tests/jballerina-unit-test/src/test/resources/test-src/types/finaltypes/test_implicitly_final_negative.bal @@ -44,3 +44,25 @@ listener test:MockListener ml = new (8080); public function testChangingListenerVariableAfterDefining() { ml = new test:MockListener(8081); } + +function testRestParamFinal(string p1, string... p2) { + p2 = ["a", "b"]; +} + +function (int a, int... b) testModuleLevelRestParamFinal = function (int i, int... b) { + b = []; + }; + +public function testLocalLevelRestParamFinal() { + int[] arr = []; + function (int a, int... b) func = function (int i, int... b) { + b = arr; + }; +} + +public function testLocalLevelRestParamFinalWithVar() { + int[] arr = []; + var func = function (int i, int... b) { + b = arr; + }; +}