Skip to content

Commit d7b62aa

Browse files
committed
Handle union type with nil or error in field for data mapper
1 parent ab94309 commit d7b62aa

File tree

9 files changed

+221
-30
lines changed

9 files changed

+221
-30
lines changed

flow-model-generator/modules/flow-model-generator-ls-extension/src/test/java/io/ballerina/flowmodelgenerator/extension/DataMappingModelTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ protected Object[] getConfigsList() {
146146
{Path.of("function_def7.json")},
147147
{Path.of("variable53.json")},
148148
{Path.of("variable55.json")},
149+
{Path.of("variable56.json")},
149150
};
150151
}
151152

flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/data_mapper_model/config/union2.json

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -91,17 +91,11 @@
9191
"typeName": "Elephant",
9292
"kind": "record",
9393
"ref": "-2143678211"
94-
},
95-
{
96-
"name": "animal",
97-
"displayName": "animal",
98-
"typeName": "()",
99-
"kind": "()"
10094
}
10195
],
10296
"name": "animal",
10397
"displayName": "animal",
104-
"typeName": "Dog|Elephant|()",
98+
"typeName": "Dog|Elephant",
10599
"kind": "union",
106100
"optional": false,
107101
"ref": "1484"

flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/data_mapper_model/config/union3.json

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -91,17 +91,11 @@
9191
"typeName": "Elephant",
9292
"kind": "record",
9393
"ref": "-2143678211"
94-
},
95-
{
96-
"name": "animal",
97-
"displayName": "animal",
98-
"typeName": "()",
99-
"kind": "()"
10094
}
10195
],
10296
"name": "animal",
10397
"displayName": "animal",
104-
"typeName": "Dog|Elephant|()",
98+
"typeName": "Dog|Elephant",
10599
"kind": "union",
106100
"optional": false,
107101
"ref": "1484"

flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/data_mapper_model/config/union4.json

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -108,17 +108,11 @@
108108
"typeName": "Elephant",
109109
"kind": "record",
110110
"ref": "-2143678211"
111-
},
112-
{
113-
"name": "animal",
114-
"displayName": "animal",
115-
"typeName": "()",
116-
"kind": "()"
117111
}
118112
],
119113
"name": "animal",
120114
"displayName": "animal",
121-
"typeName": "Dog|Elephant|()",
115+
"typeName": "Dog|Elephant",
122116
"kind": "union",
123117
"optional": false,
124118
"ref": "1484"

flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/data_mapper_model/config/union5.json

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -91,17 +91,11 @@
9191
"typeName": "Elephant",
9292
"kind": "record",
9393
"ref": "-2143678211"
94-
},
95-
{
96-
"name": "animal",
97-
"displayName": "animal",
98-
"typeName": "()",
99-
"kind": "()"
10094
}
10195
],
10296
"name": "animal",
10397
"displayName": "animal",
104-
"typeName": "Dog|Elephant|()",
98+
"typeName": "Dog|Elephant",
10599
"kind": "union",
106100
"optional": false,
107101
"ref": "1484"
Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
{
2+
"source": "variable34.bal",
3+
"description": "Sample diagram node",
4+
"codedata": {
5+
"node": "VARIABLE",
6+
"lineRange": {
7+
"fileName": "variable34.bal",
8+
"startLine": {
9+
"line": 25,
10+
"offset": 12
11+
},
12+
"endLine": {
13+
"line": 25,
14+
"offset": 35
15+
}
16+
},
17+
"sourceCode": "Student student = {};"
18+
},
19+
"position": {
20+
"line": 23,
21+
"offset": 12
22+
},
23+
"propertyKey": "expression",
24+
"targetField": "student",
25+
"model": {
26+
"inputs": [
27+
{
28+
"name": "CONST",
29+
"displayName": "CONST",
30+
"typeName": "string",
31+
"kind": "string",
32+
"category": "constant"
33+
},
34+
{
35+
"fields": [],
36+
"name": "myStudent",
37+
"displayName": "myStudent",
38+
"typeName": "Student",
39+
"kind": "record",
40+
"category": "module-variable",
41+
"ref": "545732303"
42+
}
43+
],
44+
"output": {
45+
"fields": [],
46+
"name": "student",
47+
"displayName": "student",
48+
"typeName": "UserInfo",
49+
"kind": "record",
50+
"ref": "1889977605"
51+
},
52+
"mappings": [],
53+
"refs": {
54+
"-262167728": {
55+
"fields": [
56+
{
57+
"name": "username",
58+
"displayName": "username",
59+
"typeName": "string",
60+
"kind": "string",
61+
"optional": false
62+
},
63+
{
64+
"name": "password",
65+
"displayName": "password",
66+
"typeName": "string",
67+
"kind": "string",
68+
"optional": false
69+
},
70+
{
71+
"name": "'record",
72+
"displayName": "'record",
73+
"typeName": "string",
74+
"kind": "string",
75+
"optional": false
76+
},
77+
{
78+
"name": "data",
79+
"displayName": "data",
80+
"typeName": "json",
81+
"kind": "json",
82+
"optional": false
83+
},
84+
{
85+
"name": "info",
86+
"displayName": "info",
87+
"typeName": "any",
88+
"kind": "any",
89+
"optional": false
90+
}
91+
],
92+
"typeName": "Student?",
93+
"kind": "record"
94+
},
95+
"545732303": {
96+
"fields": [
97+
{
98+
"name": "username",
99+
"displayName": "username",
100+
"typeName": "string",
101+
"kind": "string",
102+
"optional": false
103+
},
104+
{
105+
"name": "password",
106+
"displayName": "password",
107+
"typeName": "string",
108+
"kind": "string",
109+
"optional": false
110+
},
111+
{
112+
"name": "'record",
113+
"displayName": "'record",
114+
"typeName": "string",
115+
"kind": "string",
116+
"optional": false
117+
},
118+
{
119+
"name": "data",
120+
"displayName": "data",
121+
"typeName": "json",
122+
"kind": "json",
123+
"optional": false
124+
},
125+
{
126+
"name": "info",
127+
"displayName": "info",
128+
"typeName": "any",
129+
"kind": "any",
130+
"optional": false
131+
}
132+
],
133+
"typeName": "Student",
134+
"kind": "record"
135+
},
136+
"1889977605": {
137+
"fields": [
138+
{
139+
"name": "username",
140+
"displayName": "username",
141+
"typeName": "string",
142+
"kind": "string",
143+
"optional": false
144+
},
145+
{
146+
"name": "password",
147+
"displayName": "password",
148+
"typeName": "string",
149+
"kind": "string",
150+
"optional": false
151+
},
152+
{
153+
"fields": [],
154+
"name": "student",
155+
"displayName": "student",
156+
"typeName": "Student?",
157+
"kind": "record",
158+
"optional": false,
159+
"ref": "-262167728"
160+
}
161+
],
162+
"typeName": "UserInfo",
163+
"kind": "record"
164+
}
165+
}
166+
}
167+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import ballerina/http;
2+
3+
type UserInfo record {|
4+
string username;
5+
string password;
6+
Student? student;
7+
|};
8+
9+
type Student record {|
10+
string username;
11+
string password;
12+
string 'record;
13+
json data;
14+
any info;
15+
|};
16+
17+
const string CONST = "CONST";
18+
Student myStudent = {};
19+
20+
service OASServiceType on new http:Listener(9090) {
21+
22+
resource function get pet() returns int|http:NotFound {
23+
do {
24+
Student? student1 = {};
25+
Student student2 = {};
26+
UserInfo userInfo = {};
27+
} on fail error e {
28+
return http:NOT_FOUND;
29+
}
30+
}
31+
}

misc/diagram-util/src/main/java/org/ballerinalang/diagramutil/connector/models/connector/ReferenceType.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,13 +236,19 @@ public static RefType fromSemanticSymbol(TypeSymbol symbol, String name, ModuleI
236236
return arrayType;
237237
} else if (kind == TypeDescKind.UNION) {
238238
UnionTypeSymbol unionTypeSymbol = (UnionTypeSymbol) symbol;
239+
List<TypeSymbol> typeSymbols = filterNilOrError(unionTypeSymbol);
240+
if (typeSymbols.size() == 1) {
241+
TypeSymbol soleTypeSymbol = typeSymbols.getFirst();
242+
ModuleID soleModuleId = getModuleID(soleTypeSymbol, moduleID);
243+
return fromSemanticSymbol(soleTypeSymbol, unionTypeSymbol.signature(), soleModuleId, typeDefSymbols);
244+
}
239245
RefUnionType unionType = new RefUnionType(name);
240246
unionType.hashCode = typeHash;
241247
unionType.key = typeKey;
242248
unionType.moduleInfo = moduleID != null ? createTypeInfo(moduleID) : null;
243249
visitedTypeMap.put(typeKey, unionType);
244250

245-
for (TypeSymbol memberTypeSymbol : unionTypeSymbol.memberTypeDescriptors()) {
251+
for (TypeSymbol memberTypeSymbol : typeSymbols) {
246252
String memberTypeName = memberTypeSymbol.getName().orElse("");
247253
ModuleID memberModuleId = getModuleID(memberTypeSymbol, moduleID);
248254
RefType memberType = fromSemanticSymbol(memberTypeSymbol, memberTypeName,
@@ -328,6 +334,16 @@ public static RefType fromSemanticSymbol(TypeSymbol symbol, String name, ModuleI
328334
"Unsupported type kind: " + kind + " for symbol: " + symbol.getName().orElse("unknown"));
329335
}
330336

337+
private static List<TypeSymbol> filterNilOrError(UnionTypeSymbol unionTypeSymbol) {
338+
List<TypeSymbol> filteredMembers = new ArrayList<>();
339+
for (TypeSymbol member : unionTypeSymbol.memberTypeDescriptors()) {
340+
if (member.typeKind() != TypeDescKind.NIL && member.typeKind() != TypeDescKind.ERROR) {
341+
filteredMembers.add(member);
342+
}
343+
}
344+
return filteredMembers;
345+
}
346+
331347
private static RefType getPrimitiveType(TypeDescKind kind) {
332348
String primitiveTypeName = getPrimitiveTypeName(kind);
333349
if (primitiveTypeName == null) {

misc/diagram-util/src/test/java/org/ballerinalang/diagramutil/RefTypeTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public void getRefTypeForSymbol(Path jsonPath) throws IOException {
8686
String refTypeJson = gson.toJson(refType).concat(System.lineSeparator());
8787
String expectedRefTypeJson = gson.toJson(jsonObject.get("refType")).concat(System.lineSeparator());
8888
if (!refTypeJson.equals(expectedRefTypeJson)) {
89-
// updateConfig(jsonPath, refTypeJson);
89+
updateConfig(jsonPath, refTypeJson);
9090
Assert.fail(
9191
String.format("Reference type JSON does not match.\n Expected : %s\n Received %s",
9292
expectedRefTypeJson, refTypeJson));

0 commit comments

Comments
 (0)