From 31939a7b66cea47e1cc86901c7ea2e1cc6659013 Mon Sep 17 00:00:00 2001 From: Nipuna Fernando Date: Fri, 2 Feb 2024 16:49:40 +0530 Subject: [PATCH 1/3] Add location to field in intersected records --- .../compiler/semantics/analyzer/Types.java | 2 +- .../api/test/symbols/ErrorTypeSymbolTest.java | 46 +++++++++++++++++++ .../symbols/error_type_symbol_test.bal | 20 ++++++++ 3 files changed, 67 insertions(+), 1 deletion(-) diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/Types.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/Types.java index 0e71020f9c7f..0e015c126916 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/Types.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/Types.java @@ -5619,7 +5619,7 @@ private boolean populateFields(IntersectionContext intersectionContext, BRecordT intersectionFieldType, newTypeSymbol, lhsRecordField.pos, SOURCE); } - newTypeFields.put(key, new BField(name, null, recordFieldSymbol)); + newTypeFields.put(key, new BField(name, recordFieldSymbol.pos, recordFieldSymbol)); newTypeSymbol.scope.define(name, recordFieldSymbol); } return true; diff --git a/tests/ballerina-compiler-api-test/src/test/java/io/ballerina/semantic/api/test/symbols/ErrorTypeSymbolTest.java b/tests/ballerina-compiler-api-test/src/test/java/io/ballerina/semantic/api/test/symbols/ErrorTypeSymbolTest.java index f14143d90a0b..c497f4573ccc 100644 --- a/tests/ballerina-compiler-api-test/src/test/java/io/ballerina/semantic/api/test/symbols/ErrorTypeSymbolTest.java +++ b/tests/ballerina-compiler-api-test/src/test/java/io/ballerina/semantic/api/test/symbols/ErrorTypeSymbolTest.java @@ -19,10 +19,15 @@ package io.ballerina.semantic.api.test.symbols; import io.ballerina.compiler.api.SemanticModel; +import io.ballerina.compiler.api.impl.symbols.BallerinaErrorTypeSymbol; +import io.ballerina.compiler.api.impl.symbols.BallerinaIntersectionTypeSymbol; +import io.ballerina.compiler.api.impl.symbols.BallerinaRecordTypeSymbol; +import io.ballerina.compiler.api.impl.symbols.BallerinaTypeReferenceTypeSymbol; import io.ballerina.compiler.api.symbols.Documentable; import io.ballerina.compiler.api.symbols.Documentation; import io.ballerina.compiler.api.symbols.ErrorTypeSymbol; import io.ballerina.compiler.api.symbols.ModuleSymbol; +import io.ballerina.compiler.api.symbols.RecordFieldSymbol; import io.ballerina.compiler.api.symbols.Symbol; import io.ballerina.compiler.api.symbols.SymbolKind; import io.ballerina.compiler.api.symbols.TypeDefinitionSymbol; @@ -41,6 +46,7 @@ import org.wso2.ballerinalang.compiler.util.Names; import java.util.List; +import java.util.Map; import java.util.Optional; import static io.ballerina.semantic.api.test.util.SemanticAPITestUtils.getDefaultModulesSemanticModel; @@ -133,6 +139,46 @@ public Object[][] getTypeRefErrorType() { }; } + @Test(dataProvider = "IntersectionErrorTypeProvider") + public void testFieldDescriptorsOfErrorIntersection(int line, int offset, String expectedErrorType, + List expectedFieldNames) { + Optional symbol = model.symbol(srcFile, LinePosition.from(line, offset)); + assertTrue(symbol.isPresent()); + + Symbol ballerinaTypeDefinitionSymbol = symbol.get(); + assertEquals(ballerinaTypeDefinitionSymbol.kind(), SymbolKind.TYPE); + assertTrue(ballerinaTypeDefinitionSymbol.getName().isPresent()); + assertEquals(ballerinaTypeDefinitionSymbol.getName().get(), expectedErrorType); + + TypeSymbol ballerinaIntersectionTypeSymbol = + ((BallerinaTypeReferenceTypeSymbol) ballerinaTypeDefinitionSymbol).typeDescriptor(); + assertEquals(ballerinaIntersectionTypeSymbol.kind(), SymbolKind.TYPE); + + TypeSymbol ballerinaErrorTypeSymbol = + ((BallerinaIntersectionTypeSymbol) ballerinaIntersectionTypeSymbol).effectiveTypeDescriptor(); + assertEquals(ballerinaErrorTypeSymbol.kind(), SymbolKind.TYPE); + + TypeSymbol ballerinaRecordTypeSymbol = + ((BallerinaErrorTypeSymbol) ballerinaErrorTypeSymbol).detailTypeDescriptor(); + assertEquals(ballerinaRecordTypeSymbol.kind(), SymbolKind.TYPE); + + Map stringRecordFieldSymbolMap = + ((BallerinaRecordTypeSymbol) ballerinaRecordTypeSymbol).fieldDescriptors(); + List actualFieldNames = stringRecordFieldSymbolMap.keySet().stream().toList(); + assertEquals(actualFieldNames.size(), expectedFieldNames.size()); + for (int i = 0; i < actualFieldNames.size(); i++) { + assertEquals(actualFieldNames.get(i), expectedFieldNames.get(i)); + } + } + + @DataProvider(name = "IntersectionErrorTypeProvider") + public Object[][] getIntersectionErrorType() { + return new Object[][]{ + {62, 4, "SimpleIntersectionError", List.of("msg", "value")}, + {63, 4, "MultipleIntersectionError", List.of("flag", "msg", "value")} + }; + } + private void assertModuleInfo(ModuleSymbol module) { assertEquals(module.id().orgName(), Names.ANON_ORG.toString()); assertEquals(module.id().moduleName(), PackageID.DEFAULT.toString()); diff --git a/tests/ballerina-compiler-api-test/src/test/resources/test-src/symbols/error_type_symbol_test.bal b/tests/ballerina-compiler-api-test/src/test/resources/test-src/symbols/error_type_symbol_test.bal index aa5194d7aa0c..48b257f558ba 100644 --- a/tests/ballerina-compiler-api-test/src/test/resources/test-src/symbols/error_type_symbol_test.bal +++ b/tests/ballerina-compiler-api-test/src/test/resources/test-src/symbols/error_type_symbol_test.bal @@ -43,3 +43,23 @@ function test() { CancelledError distinctErr; IntersectionError intersectionErr; } + +type ErrorDetail1 record { + string msg; + int value?; +}; + +type ErrorDetail2 record {| + *ErrorDetail1; + boolean flag; +|}; + +type SimpleError error; +type InclusionError error; + +type SimpleIntersectionError distinct error & error & error; +type MultipleIntersectionError InclusionError & error & SimpleError & error; +function testMultipleIntersectionError() { + SimpleIntersectionError simpleErr; + MultipleIntersectionError multipleErr; +} From 39110258ca6cb3f48e8a8a538c5ed90c91d7d6bc Mon Sep 17 00:00:00 2001 From: Nipuna Fernando Date: Tue, 6 Feb 2024 09:29:36 +0530 Subject: [PATCH 2/3] Add union type to error symbol test --- .../test/resources/test-src/symbols/error_type_symbol_test.bal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ballerina-compiler-api-test/src/test/resources/test-src/symbols/error_type_symbol_test.bal b/tests/ballerina-compiler-api-test/src/test/resources/test-src/symbols/error_type_symbol_test.bal index 48b257f558ba..1ca615fd2154 100644 --- a/tests/ballerina-compiler-api-test/src/test/resources/test-src/symbols/error_type_symbol_test.bal +++ b/tests/ballerina-compiler-api-test/src/test/resources/test-src/symbols/error_type_symbol_test.bal @@ -51,7 +51,7 @@ type ErrorDetail1 record { type ErrorDetail2 record {| *ErrorDetail1; - boolean flag; + boolean|int flag; |}; type SimpleError error; From f9b150ab1d4e385004eb5a8008d52891c9b502de Mon Sep 17 00:00:00 2001 From: Nipuna Fernando Date: Wed, 7 Feb 2024 14:09:06 +0530 Subject: [PATCH 3/3] Use field position of the symbol for intersection --- .../wso2/ballerinalang/compiler/semantics/analyzer/Types.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/Types.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/Types.java index 0e015c126916..3f3639bb13ae 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/Types.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/Types.java @@ -5616,7 +5616,7 @@ private boolean populateFields(IntersectionContext intersectionContext, BRecordT invokableSymbol.flags = tsymbol.flags; } else { recordFieldSymbol = new BVarSymbol(intersectionFlags, name, env.enclPkg.packageID, - intersectionFieldType, newTypeSymbol, lhsRecordField.pos, SOURCE); + intersectionFieldType, newTypeSymbol, lhsRecordField.symbol.pos, SOURCE); } newTypeFields.put(key, new BField(name, recordFieldSymbol.pos, recordFieldSymbol));