diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/java/io/ballerina/flowmodelgenerator/extension/DataMappingModelTest.java b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/java/io/ballerina/flowmodelgenerator/extension/DataMappingModelTest.java index fe79803800..08ca10c239 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/java/io/ballerina/flowmodelgenerator/extension/DataMappingModelTest.java +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/java/io/ballerina/flowmodelgenerator/extension/DataMappingModelTest.java @@ -146,6 +146,7 @@ protected Object[] getConfigsList() { {Path.of("function_def7.json")}, {Path.of("variable53.json")}, {Path.of("variable55.json")}, + {Path.of("variable56.json")}, }; } diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/data_mapper_model/config/union2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/data_mapper_model/config/union2.json index 31be390087..3766fbd5e9 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/data_mapper_model/config/union2.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/data_mapper_model/config/union2.json @@ -91,17 +91,11 @@ "typeName": "Elephant", "kind": "record", "ref": "-2143678211" - }, - { - "name": "animal", - "displayName": "animal", - "typeName": "()", - "kind": "()" } ], "name": "animal", "displayName": "animal", - "typeName": "Dog|Elephant|()", + "typeName": "Dog|Elephant", "kind": "union", "optional": false, "ref": "1484" diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/data_mapper_model/config/union3.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/data_mapper_model/config/union3.json index 7e37c4adcb..df42188913 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/data_mapper_model/config/union3.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/data_mapper_model/config/union3.json @@ -91,17 +91,11 @@ "typeName": "Elephant", "kind": "record", "ref": "-2143678211" - }, - { - "name": "animal", - "displayName": "animal", - "typeName": "()", - "kind": "()" } ], "name": "animal", "displayName": "animal", - "typeName": "Dog|Elephant|()", + "typeName": "Dog|Elephant", "kind": "union", "optional": false, "ref": "1484" diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/data_mapper_model/config/union4.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/data_mapper_model/config/union4.json index 53626d68eb..d53d2b2b29 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/data_mapper_model/config/union4.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/data_mapper_model/config/union4.json @@ -108,17 +108,11 @@ "typeName": "Elephant", "kind": "record", "ref": "-2143678211" - }, - { - "name": "animal", - "displayName": "animal", - "typeName": "()", - "kind": "()" } ], "name": "animal", "displayName": "animal", - "typeName": "Dog|Elephant|()", + "typeName": "Dog|Elephant", "kind": "union", "optional": false, "ref": "1484" diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/data_mapper_model/config/union5.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/data_mapper_model/config/union5.json index 9022b368ad..48596df182 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/data_mapper_model/config/union5.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/data_mapper_model/config/union5.json @@ -91,17 +91,11 @@ "typeName": "Elephant", "kind": "record", "ref": "-2143678211" - }, - { - "name": "animal", - "displayName": "animal", - "typeName": "()", - "kind": "()" } ], "name": "animal", "displayName": "animal", - "typeName": "Dog|Elephant|()", + "typeName": "Dog|Elephant", "kind": "union", "optional": false, "ref": "1484" diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/data_mapper_model/config/variable56.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/data_mapper_model/config/variable56.json new file mode 100644 index 0000000000..431763196b --- /dev/null +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/data_mapper_model/config/variable56.json @@ -0,0 +1,167 @@ +{ + "source": "variable34.bal", + "description": "Sample diagram node", + "codedata": { + "node": "VARIABLE", + "lineRange": { + "fileName": "variable34.bal", + "startLine": { + "line": 25, + "offset": 12 + }, + "endLine": { + "line": 25, + "offset": 35 + } + }, + "sourceCode": "Student student = {};" + }, + "position": { + "line": 23, + "offset": 12 + }, + "propertyKey": "expression", + "targetField": "student", + "model": { + "inputs": [ + { + "name": "CONST", + "displayName": "CONST", + "typeName": "string", + "kind": "string", + "category": "constant" + }, + { + "fields": [], + "name": "myStudent", + "displayName": "myStudent", + "typeName": "Student", + "kind": "record", + "category": "module-variable", + "ref": "545732303" + } + ], + "output": { + "fields": [], + "name": "student", + "displayName": "student", + "typeName": "UserInfo", + "kind": "record", + "ref": "1889977605" + }, + "mappings": [], + "refs": { + "-262167728": { + "fields": [ + { + "name": "username", + "displayName": "username", + "typeName": "string", + "kind": "string", + "optional": false + }, + { + "name": "password", + "displayName": "password", + "typeName": "string", + "kind": "string", + "optional": false + }, + { + "name": "'record", + "displayName": "'record", + "typeName": "string", + "kind": "string", + "optional": false + }, + { + "name": "data", + "displayName": "data", + "typeName": "json", + "kind": "json", + "optional": false + }, + { + "name": "info", + "displayName": "info", + "typeName": "any", + "kind": "any", + "optional": false + } + ], + "typeName": "Student?", + "kind": "record" + }, + "545732303": { + "fields": [ + { + "name": "username", + "displayName": "username", + "typeName": "string", + "kind": "string", + "optional": false + }, + { + "name": "password", + "displayName": "password", + "typeName": "string", + "kind": "string", + "optional": false + }, + { + "name": "'record", + "displayName": "'record", + "typeName": "string", + "kind": "string", + "optional": false + }, + { + "name": "data", + "displayName": "data", + "typeName": "json", + "kind": "json", + "optional": false + }, + { + "name": "info", + "displayName": "info", + "typeName": "any", + "kind": "any", + "optional": false + } + ], + "typeName": "Student", + "kind": "record" + }, + "1889977605": { + "fields": [ + { + "name": "username", + "displayName": "username", + "typeName": "string", + "kind": "string", + "optional": false + }, + { + "name": "password", + "displayName": "password", + "typeName": "string", + "kind": "string", + "optional": false + }, + { + "fields": [], + "name": "student", + "displayName": "student", + "typeName": "Student?", + "kind": "record", + "optional": false, + "ref": "-262167728" + } + ], + "typeName": "UserInfo", + "kind": "record" + } + } + } +} diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/data_mapper_model/source/variable34.bal b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/data_mapper_model/source/variable34.bal new file mode 100644 index 0000000000..97747843bb --- /dev/null +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/data_mapper_model/source/variable34.bal @@ -0,0 +1,31 @@ +import ballerina/http; + +type UserInfo record {| + string username; + string password; + Student? student; +|}; + +type Student record {| + string username; + string password; + string 'record; + json data; + any info; +|}; + +const string CONST = "CONST"; +Student myStudent = {}; + +service OASServiceType on new http:Listener(9090) { + + resource function get pet() returns int|http:NotFound { + do { + Student? student1 = {}; + Student student2 = {}; + UserInfo userInfo = {}; + } on fail error e { + return http:NOT_FOUND; + } + } +} diff --git a/misc/diagram-util/src/main/java/org/ballerinalang/diagramutil/connector/models/connector/ReferenceType.java b/misc/diagram-util/src/main/java/org/ballerinalang/diagramutil/connector/models/connector/ReferenceType.java index 40e8acba2e..55ca95d31a 100644 --- a/misc/diagram-util/src/main/java/org/ballerinalang/diagramutil/connector/models/connector/ReferenceType.java +++ b/misc/diagram-util/src/main/java/org/ballerinalang/diagramutil/connector/models/connector/ReferenceType.java @@ -236,13 +236,19 @@ public static RefType fromSemanticSymbol(TypeSymbol symbol, String name, ModuleI return arrayType; } else if (kind == TypeDescKind.UNION) { UnionTypeSymbol unionTypeSymbol = (UnionTypeSymbol) symbol; + List typeSymbols = filterNilOrError(unionTypeSymbol); + if (typeSymbols.size() == 1) { + TypeSymbol soleTypeSymbol = typeSymbols.getFirst(); + ModuleID soleModuleId = getModuleID(soleTypeSymbol, moduleID); + return fromSemanticSymbol(soleTypeSymbol, unionTypeSymbol.signature(), soleModuleId, typeDefSymbols); + } RefUnionType unionType = new RefUnionType(name); unionType.hashCode = typeHash; unionType.key = typeKey; unionType.moduleInfo = moduleID != null ? createTypeInfo(moduleID) : null; visitedTypeMap.put(typeKey, unionType); - for (TypeSymbol memberTypeSymbol : unionTypeSymbol.memberTypeDescriptors()) { + for (TypeSymbol memberTypeSymbol : typeSymbols) { String memberTypeName = memberTypeSymbol.getName().orElse(""); ModuleID memberModuleId = getModuleID(memberTypeSymbol, moduleID); RefType memberType = fromSemanticSymbol(memberTypeSymbol, memberTypeName, @@ -328,6 +334,16 @@ public static RefType fromSemanticSymbol(TypeSymbol symbol, String name, ModuleI "Unsupported type kind: " + kind + " for symbol: " + symbol.getName().orElse("unknown")); } + private static List filterNilOrError(UnionTypeSymbol unionTypeSymbol) { + List filteredMembers = new ArrayList<>(); + for (TypeSymbol member : unionTypeSymbol.memberTypeDescriptors()) { + if (member.typeKind() != TypeDescKind.NIL && member.typeKind() != TypeDescKind.ERROR) { + filteredMembers.add(member); + } + } + return filteredMembers; + } + private static RefType getPrimitiveType(TypeDescKind kind) { String primitiveTypeName = getPrimitiveTypeName(kind); if (primitiveTypeName == null) { diff --git a/misc/diagram-util/src/test/java/org/ballerinalang/diagramutil/RefTypeTest.java b/misc/diagram-util/src/test/java/org/ballerinalang/diagramutil/RefTypeTest.java index a6573ebad9..226c0fd2bc 100644 --- a/misc/diagram-util/src/test/java/org/ballerinalang/diagramutil/RefTypeTest.java +++ b/misc/diagram-util/src/test/java/org/ballerinalang/diagramutil/RefTypeTest.java @@ -86,7 +86,7 @@ public void getRefTypeForSymbol(Path jsonPath) throws IOException { String refTypeJson = gson.toJson(refType).concat(System.lineSeparator()); String expectedRefTypeJson = gson.toJson(jsonObject.get("refType")).concat(System.lineSeparator()); if (!refTypeJson.equals(expectedRefTypeJson)) { -// updateConfig(jsonPath, refTypeJson); + updateConfig(jsonPath, refTypeJson); Assert.fail( String.format("Reference type JSON does not match.\n Expected : %s\n Received %s", expectedRefTypeJson, refTypeJson));