From 794e5ff371c05de3a346fc91b3ce32c76592f28e Mon Sep 17 00:00:00 2001 From: dulaj Date: Wed, 29 Jan 2025 23:02:17 +0530 Subject: [PATCH 1/6] Refactor source code generation for updateType API --- .../flowmodelgenerator/core/TypesManager.java | 59 +--- .../core/utils/SourceCodeGenerator.java | 255 ++++++++++++++++++ 2 files changed, 258 insertions(+), 56 deletions(-) create mode 100644 flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/utils/SourceCodeGenerator.java diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/TypesManager.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/TypesManager.java index d8fcb90c7..61b85b86a 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/TypesManager.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/TypesManager.java @@ -46,6 +46,7 @@ import io.ballerina.compiler.syntax.tree.SyntaxTree; import io.ballerina.flowmodelgenerator.core.model.ModuleInfo; import io.ballerina.flowmodelgenerator.core.model.TypeData; +import io.ballerina.flowmodelgenerator.core.utils.SourceCodeGenerator; import io.ballerina.flowmodelgenerator.core.utils.CommonUtils; import io.ballerina.flowmodelgenerator.core.utils.TypeTransformer; import io.ballerina.flowmodelgenerator.core.utils.TypeUtils; @@ -160,7 +161,8 @@ public JsonElement updateType(Path filePath, TypeData typeData) { textEditsMap.put(filePath, textEdits); // Regenerate code snippet for the type - String codeSnippet = createCodeSnippet(typeData); + SourceCodeGenerator sourceCodeGenerator = new SourceCodeGenerator(); + String codeSnippet = sourceCodeGenerator.generateCodeSnippetForType(typeData); SyntaxTree syntaxTree = this.typeDocument.syntaxTree(); LineRange lineRange = typeData.codedata().lineRange(); @@ -176,14 +178,6 @@ public JsonElement updateType(Path filePath, TypeData typeData) { return gson.toJsonTree(textEditsMap); } - private String createCodeSnippet(TypeData typeData) { - return switch (typeData.codedata().node()) { - case RECORD -> createRecordTypeDefCodeSnippet(typeData); - // TODO: Handle other kinds of type: service-decl, array, union, error, future, map, stream, intersection - default -> ""; - }; - } - private void addMemberTypes(TypeSymbol typeSymbol, Map symbolMap) { // Record switch (typeSymbol.typeKind()) { @@ -411,53 +405,6 @@ private void addDependencyTypes(TypeSymbol typeSymbol, Map refer } } - private String createRecordTypeDefCodeSnippet(TypeData typeData) { - StringBuilder recordBuilder = new StringBuilder(); - - // Add documentation if present - if (typeData.metadata().description() != null && !typeData.metadata().description().isEmpty()) { - recordBuilder.append(CommonUtils.convertToBalDocs(typeData.metadata().description())); - } - - // Add type name - recordBuilder.append("type ") - .append(typeData.name()) - .append(" record {|\n"); - - // Add includes - for (String include : typeData.includes()) { - recordBuilder.append("*").append(include).append(";\n"); - } - - // Add members - - typeData.members().forEach(member -> { - if (member.docs() != null && !member.docs().isEmpty()) { - recordBuilder.append(CommonUtils.convertToBalDocs(member.docs())); - } - - recordBuilder - .append(member.type()) - .append(" ") - .append(member.name()) - .append((member.defaultValue() != null && !member.defaultValue().isEmpty()) ? - " = " + member.defaultValue() : "") - .append(";\n"); - }); - - // Add rest member if present - Optional.ofNullable(typeData.restMember()).ifPresent(restMember -> { - recordBuilder - .append(restMember.type()) - .append("...;\n"); - }); - - // Close the record - recordBuilder.append("|};\n"); - - return recordBuilder.toString(); - } - record TypeDataWithRefs(Object type, List refs) { } } diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/utils/SourceCodeGenerator.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/utils/SourceCodeGenerator.java new file mode 100644 index 000000000..1ec834e3d --- /dev/null +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/utils/SourceCodeGenerator.java @@ -0,0 +1,255 @@ +/* + * Copyright (c) 2025, WSO2 LLC. (http://www.wso2.com) + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package io.ballerina.flowmodelgenerator.core.utils; + +import com.google.gson.Gson; +import io.ballerina.flowmodelgenerator.core.model.Member; +import io.ballerina.flowmodelgenerator.core.model.NodeKind; +import io.ballerina.flowmodelgenerator.core.model.TypeData; + +import java.util.Map; +import java.util.Optional; + +/** + * Code snippet generator. + * + * @since 2.0.0 + */ +public class SourceCodeGenerator { + private final Gson gson = new Gson(); + + public String generateCodeSnippetForType(TypeData typeData) { + NodeKind nodeKind = typeData.codedata().node(); + return switch (nodeKind) { + case SERVICE_DECLARATION, CLASS -> ""; // TODO: Implement this + case ENUM -> generateEnumCodeSnippet(typeData); + default -> generateTypeDefCodeSnippet(typeData); + }; + } + + private String generateEnumCodeSnippet(TypeData typeData) { + return null; + } + + private String generateTypeDefCodeSnippet(TypeData typeData) { + StringBuilder stringBuilder = new StringBuilder(); + + // Add documentation if present + if (typeData.metadata().description() != null && !typeData.metadata().description().isEmpty()) { + stringBuilder.append(CommonUtils.convertToBalDocs(typeData.metadata().description())); + } + + // Add type name + stringBuilder.append("type ") + .append(typeData.name()) + .append(" "); + + generateTypeDescriptor(typeData, stringBuilder); + + return stringBuilder.append(";\n").toString(); + } + + private void generateTypeDescriptor(Object typeDescriptor, StringBuilder stringBuilder) { + if (typeDescriptor instanceof String) { // Type reference + stringBuilder.append((String) typeDescriptor); + return; + } + + TypeData typeData; + if (typeDescriptor instanceof Map) { + String json = gson.toJson(typeDescriptor); + typeData = gson.fromJson(json, TypeData.class); + } else { + typeData = (TypeData) typeDescriptor; + } + + switch (typeData.codedata().node()) { + case RECORD -> generateRecordTypeDescriptor(typeData, stringBuilder); + case ARRAY -> generateArrayTypeDescriptor(typeData, stringBuilder); + case MAP -> generateMapTypeDescriptor(typeData, stringBuilder); + case STREAM -> generateStreamTypeDescriptor(typeData, stringBuilder); + case FUTURE -> generateFutureTypeDescriptor(typeData, stringBuilder); + case TYPEDESC -> generateTypedescTypeDescriptor(typeData, stringBuilder); + case ERROR -> generateErrorTypeDescriptor(typeData, stringBuilder); + case UNION -> generateUnionTypeDescriptor(typeData, stringBuilder); + case INTERSECTION -> generateIntersectionTypeDescriptor(typeData, stringBuilder); + case OBJECT -> generateObjectTypeDescriptor(typeData, stringBuilder); + case TABLE -> generateTableTypeDescriptor(typeData, stringBuilder); + default -> throw new UnsupportedOperationException("Unsupported type descriptor: " + typeDescriptor); + } + } + + private void generateObjectTypeDescriptor(TypeData typeData, StringBuilder stringBuilder) { + stringBuilder.append("object {"); + + // Add fields + for (Member member : typeData.members()) { + generateMember(member, stringBuilder, false); + } + + // TODO: Add functions + stringBuilder.append("\n}"); + } + + private void generateRecordTypeDescriptor(TypeData typeData, StringBuilder stringBuilder) { + // Assumption: a record is always a closed records + stringBuilder.append("record {|"); + + // Add inclusions + typeData.includes().forEach(include -> stringBuilder.append("\n\t*").append(include).append(";")); + + // Add fields + for (Member member : typeData.members()) { + generateMember(member, stringBuilder, true); + } + + // Add rest field + Optional.ofNullable(typeData.restMember()).ifPresent(restMember -> { + stringBuilder.append("\n\t"); + generateTypeDescriptor(restMember.type(), stringBuilder); + stringBuilder.append(" ...;"); + }); + stringBuilder.append("\n|}"); + } + + private void generateMember(Member member, StringBuilder stringBuilder, boolean withDefaultValue) { + if (member.docs() != null && !member.docs().isEmpty()) { + stringBuilder + .append("\n\t") + .append(CommonUtils.convertToBalDocs(member.docs())); + } else { + stringBuilder.append("\n"); + } + stringBuilder.append("\t"); + generateTypeDescriptor(member.type(), stringBuilder); + stringBuilder.append(" ").append(member.name()); + + if (withDefaultValue) { + stringBuilder.append((member.defaultValue() != null && !member.defaultValue().isEmpty()) ? + " = " + member.defaultValue() : ""); + } + stringBuilder.append(";"); + } + + private void generateTableTypeDescriptor(TypeData typeData, StringBuilder stringBuilder) { + if (!typeData.members().isEmpty()) { + stringBuilder.append("table<"); + generateTypeDescriptor(typeData.members().getFirst().type(), stringBuilder); + stringBuilder.append(">"); + + if (typeData.members().size() > 1) { + stringBuilder.append(" key<"); + generateTypeDescriptor(typeData.members().get(1).type(), stringBuilder); + stringBuilder.append(">"); + } + + // TODO: key specifier is not yet supported + } + } + + private void generateIntersectionTypeDescriptor(TypeData typeData, StringBuilder stringBuilder) { + if (typeData.members().size() <= 1) { + return; + } + for (Member member : typeData.members()) { + if (member.type() instanceof TypeData) { + if (((TypeData) member.type()).codedata().node() == NodeKind.INTERSECTION) { + stringBuilder.append("("); + generateTypeDescriptor(member.type(), stringBuilder); + stringBuilder.append(")"); + } else { + generateTypeDescriptor(member.type(), stringBuilder); + } + } else { + generateTypeDescriptor(member.type(), stringBuilder); + } + stringBuilder.append(" & "); + } + } + + private void generateUnionTypeDescriptor(TypeData typeData, StringBuilder stringBuilder) { + if (typeData.members().size() <= 1) { + return; + } + for (int i = 0; i < typeData.members().size(); i++) { + Member member = typeData.members().get(i); + if (member.type() instanceof TypeData) { + if (((TypeData) member.type()).codedata().node() == NodeKind.UNION) { + stringBuilder.append("("); + generateTypeDescriptor(member.type(), stringBuilder); + stringBuilder.append(")"); + } else { + generateTypeDescriptor(member.type(), stringBuilder); + } + } else { + generateTypeDescriptor(member.type(), stringBuilder); + } + if (i < typeData.members().size() - 1) { + stringBuilder.append("|"); + } + } + } + + private void generateErrorTypeDescriptor(TypeData typeData, StringBuilder stringBuilder) { + if (typeData.members().size() == 1) { + stringBuilder.append("error<"); + generateTypeDescriptor(typeData.members().getFirst().type(), stringBuilder); + stringBuilder.append(">"); + } + } + + private void generateTypedescTypeDescriptor(TypeData typeData, StringBuilder stringBuilder) { + if (typeData.members().size() == 1) { + stringBuilder.append("typedesc<"); + generateTypeDescriptor(typeData.members().getFirst().type(), stringBuilder); + stringBuilder.append(">"); + } + } + + private void generateFutureTypeDescriptor(TypeData typeData, StringBuilder stringBuilder) { + if (typeData.members().size() == 1) { + stringBuilder.append("future<"); + generateTypeDescriptor(typeData.members().getFirst().type(), stringBuilder); + stringBuilder.append(">"); + } + } + + private void generateStreamTypeDescriptor(TypeData typeData, StringBuilder stringBuilder) { + if (typeData.members().size() == 1) { + stringBuilder.append("stream<"); + generateTypeDescriptor(typeData.members().getFirst().type(), stringBuilder); + stringBuilder.append(">"); + } + } + + private void generateMapTypeDescriptor(TypeData typeData, StringBuilder stringBuilder) { + if (typeData.members().size() == 1) { + stringBuilder.append("map<"); + generateTypeDescriptor(typeData.members().getFirst().type(), stringBuilder); + stringBuilder.append(">"); + } + } + + private void generateArrayTypeDescriptor(TypeData typeData, StringBuilder stringBuilder) { + if (typeData.members().size() == 1) { + generateTypeDescriptor(typeData.members().getFirst().type(), stringBuilder); + } + stringBuilder.append("[]"); + } +} From 73c5a28693d07ca6b19ce7864ce723de2ab109e9 Mon Sep 17 00:00:00 2001 From: dulaj Date: Wed, 29 Jan 2025 23:02:49 +0530 Subject: [PATCH 2/6] Fix tests and add tests for union and table type definitions --- .../typesmanager/CreateAndUpdateTypeTest.java | 2 + .../config/create_record_type1.json | 34 ++-- .../config/create_record_type2.json | 34 ++-- .../config/create_table_type.json | 148 ++++++++++++++++++ .../config/create_union_type.json | 104 ++++++++++++ .../config/update_record_type1.json | 2 +- .../config/update_record_type2.json | 2 +- .../config/update_record_type3.json | 2 +- 8 files changed, 291 insertions(+), 37 deletions(-) create mode 100644 flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/create_table_type.json create mode 100644 flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/create_union_type.json diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/java/io/ballerina/flowmodelgenerator/extension/typesmanager/CreateAndUpdateTypeTest.java b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/java/io/ballerina/flowmodelgenerator/extension/typesmanager/CreateAndUpdateTypeTest.java index 3defc8220..dff78e296 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/java/io/ballerina/flowmodelgenerator/extension/typesmanager/CreateAndUpdateTypeTest.java +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/java/io/ballerina/flowmodelgenerator/extension/typesmanager/CreateAndUpdateTypeTest.java @@ -71,6 +71,8 @@ protected Object[] getConfigsList() { {Path.of("update_record_type1.json")}, {Path.of("update_record_type2.json")}, {Path.of("update_record_type3.json")}, + {Path.of("create_union_type.json")}, + {Path.of("create_table_type.json")}, }; } diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/create_record_type1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/create_record_type1.json index fda31ca4a..bec164c80 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/create_record_type1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/create_record_type1.json @@ -58,6 +58,22 @@ } }, "members": [ + { + "kind": "FIELD", + "refs": [], + "type": "int", + "name": "id", + "docs": "id of the person", + "defaultValue": "12" + }, + { + "kind": "FIELD", + "refs": [], + "type": "string", + "name": "name", + "docs": "name of the person", + "defaultValue": "\"John Doe\"" + }, { "kind": "FIELD", "refs": [ @@ -77,22 +93,6 @@ "name": "dob", "docs": "date of birth", "defaultValue": "getDefaultDob()" - }, - { - "kind": "FIELD", - "refs": [], - "type": "string", - "name": "name", - "docs": "name of the person", - "defaultValue": "\"John Doe\"" - }, - { - "kind": "FIELD", - "refs": [], - "type": "int", - "name": "id", - "docs": "id of the person", - "defaultValue": "12" } ], "includes": [] @@ -110,7 +110,7 @@ "character": 0 } }, - "newText": "# Person record\n# Used to represent person object\ntype Person record {|\n# addresses of the person\nAddress[] addresses = [];\n# date of birth\ntime:Utc dob = getDefaultDob();\n# name of the person\nstring name = \"John Doe\";\n# id of the person\nint id = 12;\n|};\n" + "newText": "# Person record\n# Used to represent person object\ntype Person record {|\n\t# id of the person\n\tint id = 12;\n\t# name of the person\n\tstring name = \"John Doe\";\n\t# addresses of the person\n\tAddress[] addresses = [];\n\t# date of birth\n\ttime:Utc dob = getDefaultDob();\n|};\n" } ] } diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/create_record_type2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/create_record_type2.json index ef9bdd639..f81f0aaea 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/create_record_type2.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/create_record_type2.json @@ -58,6 +58,22 @@ } }, "members": [ + { + "kind": "FIELD", + "refs": [], + "type": "int", + "name": "id", + "docs": "id of the person", + "defaultValue": "12" + }, + { + "kind": "FIELD", + "refs": [], + "type": "string", + "name": "name", + "docs": "name of the person", + "defaultValue": "\"John Doe\"" + }, { "kind": "FIELD", "refs": [ @@ -77,22 +93,6 @@ "name": "dob", "docs": "date of birth", "defaultValue": "getDefaultDob()" - }, - { - "kind": "FIELD", - "refs": [], - "type": "string", - "name": "name", - "docs": "name of the person", - "defaultValue": "\"John Doe\"" - }, - { - "kind": "FIELD", - "refs": [], - "type": "int", - "name": "id", - "docs": "id of the person", - "defaultValue": "12" } ], "includes": [ @@ -113,7 +113,7 @@ "character": 0 } }, - "newText": "# Person record\n# Used to represent person object\ntype Person record {|\n*Employee;\n*User;\n# addresses of the person\nAddress[] addresses = [];\n# date of birth\ntime:Utc dob = getDefaultDob();\n# name of the person\nstring name = \"John Doe\";\n# id of the person\nint id = 12;\n|};\n" + "newText": "# Person record\n# Used to represent person object\ntype Person record {|\n\t*Employee;\n\t*User;\n\t# id of the person\n\tint id = 12;\n\t# name of the person\n\tstring name = \"John Doe\";\n\t# addresses of the person\n\tAddress[] addresses = [];\n\t# date of birth\n\ttime:Utc dob = getDefaultDob();\n|};\n" } ] } diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/create_table_type.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/create_table_type.json new file mode 100644 index 000000000..c2ac3fb0e --- /dev/null +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/create_table_type.json @@ -0,0 +1,148 @@ +{ + "filePath": "test_pack1/types.bal", + "description": "Create a new table type", + "type": { + "name": "AddressTable", + "editable": true, + "metadata": { + "label": "AddressTable", + "description": "" + }, + "codedata": { + "node": "TABLE", + "lineRange": { + "fileName": "types.bal", + "startLine": { + "line": 67, + "offset": 5 + }, + "endLine": { + "line": 67, + "offset": 17 + } + } + }, + "properties": { + "name": { + "metadata": { + "label": "Type name", + "description": "Unique name to identify the type" + }, + "valueType": "IDENTIFIER", + "value": "AddressTable", + "optional": false, + "editable": true, + "advanced": false + }, + "description": { + "metadata": { + "label": "Type description", + "description": "Detailed description about the type" + }, + "valueType": "STRING", + "value": "", + "optional": false, + "editable": true, + "advanced": false + }, + "isArray": { + "metadata": { + "label": "Is array type", + "description": "Is this type an array or list value" + }, + "valueType": "FLAG", + "value": "false", + "optional": true, + "editable": true, + "advanced": true + }, + "arraySize": { + "metadata": { + "label": "Size of the array", + "description": "Array dimensions" + }, + "valueType": "STRING", + "value": "", + "optional": false, + "editable": false, + "advanced": false + } + }, + "members": [ + { + "kind": "TYPE", + "refs": [ + "Address" + ], + "type": "Address", + "name": "rowType" + }, + { + "kind": "TYPE", + "refs": [], + "type": { + "editable": false, + "codedata": { + "node": "UNION" + }, + "properties": { + "isArray": { + "metadata": { + "label": "Is array type", + "description": "Is this type an array or list value" + }, + "valueType": "FLAG", + "value": "false", + "optional": true, + "editable": true, + "advanced": true + }, + "arraySize": { + "metadata": { + "label": "Size of the array", + "description": "Array dimensions" + }, + "valueType": "STRING", + "value": "", + "optional": false, + "editable": false, + "advanced": false + } + }, + "members": [ + { + "kind": "TYPE", + "refs": [], + "type": "string", + "name": "string" + }, + { + "kind": "TYPE", + "refs": [], + "type": "int", + "name": "int" + } + ] + }, + "name": "keyConstraintType" + } + ] + }, + "output": { + "test_pack1/types.bal": [ + { + "range": { + "start": { + "line": 67, + "character": 0 + }, + "end": { + "line": 67, + "character": 49 + } + }, + "newText": "type AddressTable table
key;\n" + } + ] + } +} diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/create_union_type.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/create_union_type.json new file mode 100644 index 000000000..7e9dfaeee --- /dev/null +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/create_union_type.json @@ -0,0 +1,104 @@ +{ + "filePath": "test_pack1/types.bal", + "description": "Create a new union type", + "type": { + "name": "Misc", + "editable": true, + "metadata": { + "label": "Misc", + "description": "" + }, + "codedata": { + "node": "UNION" + }, + "properties": { + "name": { + "metadata": { + "label": "Type name", + "description": "Unique name to identify the type" + }, + "valueType": "IDENTIFIER", + "value": "Misc", + "optional": false, + "editable": true, + "advanced": false + }, + "description": { + "metadata": { + "label": "Type description", + "description": "Detailed description about the type" + }, + "valueType": "STRING", + "value": "", + "optional": false, + "editable": true, + "advanced": false + }, + "isArray": { + "metadata": { + "label": "Is array type", + "description": "Is this type an array or list value" + }, + "valueType": "FLAG", + "value": "false", + "optional": true, + "editable": true, + "advanced": true + }, + "arraySize": { + "metadata": { + "label": "Size of the array", + "description": "Array dimensions" + }, + "valueType": "STRING", + "value": "", + "optional": false, + "editable": false, + "advanced": false + } + }, + "members": [ + { + "kind": "TYPE", + "refs": [ + "Color" + ], + "type": "Color", + "name": "Color" + }, + { + "kind": "TYPE", + "refs": [ + "Employees" + ], + "type": "Employees", + "name": "Employees" + }, + { + "kind": "TYPE", + "refs": [ + "Person" + ], + "type": "Person", + "name": "Person" + } + ] + }, + "output": { + "test_pack1/types.bal": [ + { + "range": { + "start": { + "line": 68, + "character": 0 + }, + "end": { + "line": 68, + "character": 0 + } + }, + "newText": "type Misc Color|Employees|Person;\n" + } + ] + } +} diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/update_record_type1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/update_record_type1.json index 50378cc07..febd82438 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/update_record_type1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/update_record_type1.json @@ -101,7 +101,7 @@ "character": 3 } }, - "newText": "type Employee record {|\nPerson user;\nint id;\n|};\n" + "newText": "type Employee record {|\n\tPerson user;\n\tint id;\n|};\n" } ] } diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/update_record_type2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/update_record_type2.json index dfccf1bea..3b654f717 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/update_record_type2.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/update_record_type2.json @@ -104,7 +104,7 @@ "character": 3 } }, - "newText": "type Employee record {|\n*Person;\n*User;\nPerson user;\nint id;\n|};\n" + "newText": "type Employee record {|\n\t*Person;\n\t*User;\n\tPerson user;\n\tint id;\n|};\n" } ] } diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/update_record_type3.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/update_record_type3.json index 8f107cc77..3e7bae216 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/update_record_type3.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/update_record_type3.json @@ -104,7 +104,7 @@ "character": 3 } }, - "newText": "type Employee record {|\n*Person;\nPerson user;\nint id = 23;\n|};\n" + "newText": "type Employee record {|\n\t*Person;\n\tPerson user;\n\tint id = 23;\n|};\n" } ] } From 8cd3df071b3c8a8604cf42126155cfab133eddbd Mon Sep 17 00:00:00 2001 From: dulaj Date: Wed, 29 Jan 2025 23:20:28 +0530 Subject: [PATCH 3/6] Add complex record type tests --- .../typesmanager/CreateAndUpdateTypeTest.java | 2 + .../config/create_record_type3.json | 252 ++++++++++++++ .../config/update_record_type4.json | 310 ++++++++++++++++++ 3 files changed, 564 insertions(+) create mode 100644 flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/create_record_type3.json create mode 100644 flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/update_record_type4.json diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/java/io/ballerina/flowmodelgenerator/extension/typesmanager/CreateAndUpdateTypeTest.java b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/java/io/ballerina/flowmodelgenerator/extension/typesmanager/CreateAndUpdateTypeTest.java index dff78e296..2cf025185 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/java/io/ballerina/flowmodelgenerator/extension/typesmanager/CreateAndUpdateTypeTest.java +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/java/io/ballerina/flowmodelgenerator/extension/typesmanager/CreateAndUpdateTypeTest.java @@ -68,9 +68,11 @@ protected Object[] getConfigsList() { return new Object[][]{ {Path.of("create_record_type1.json")}, {Path.of("create_record_type2.json")}, + {Path.of("create_record_type3.json")}, {Path.of("update_record_type1.json")}, {Path.of("update_record_type2.json")}, {Path.of("update_record_type3.json")}, + {Path.of("update_record_type4.json")}, {Path.of("create_union_type.json")}, {Path.of("create_table_type.json")}, }; diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/create_record_type3.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/create_record_type3.json new file mode 100644 index 000000000..1dd3f2f13 --- /dev/null +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/create_record_type3.json @@ -0,0 +1,252 @@ +{ + "filePath": "test_pack2/types.bal", + "description": "Create a new record type", + "type": { + "name": "User", + "editable": true, + "metadata": { + "label": "User", + "description": "User record type\nSimple record type with docs, anonymous field types (union, record)" + }, + "codedata": { + "node": "RECORD" + }, + "properties": { + "name": { + "metadata": { + "label": "Type name", + "description": "Unique name to identify the type" + }, + "valueType": "IDENTIFIER", + "value": "User", + "optional": false, + "editable": true, + "advanced": false + }, + "description": { + "metadata": { + "label": "Type description", + "description": "Detailed description about the type" + }, + "valueType": "STRING", + "value": "User record type\nSimple record type with docs, anonymous field types (union, record)", + "optional": false, + "editable": true, + "advanced": false + }, + "isArray": { + "metadata": { + "label": "Is array type", + "description": "Is this type an array or list value" + }, + "valueType": "FLAG", + "value": "false", + "optional": true, + "editable": true, + "advanced": true + }, + "arraySize": { + "metadata": { + "label": "Size of the array", + "description": "Array dimensions" + }, + "valueType": "STRING", + "value": "", + "optional": true, + "editable": true, + "advanced": true + } + }, + "members": [ + { + "kind": "FIELD", + "refs": [], + "type": { + "editable": false, + "codedata": { + "node": "RECORD" + }, + "properties": { + "isArray": { + "metadata": { + "label": "Is array type", + "description": "Is this type an array or list value" + }, + "valueType": "FLAG", + "value": "false", + "optional": true, + "editable": true, + "advanced": true + }, + "arraySize": { + "metadata": { + "label": "Size of the array", + "description": "Array dimensions" + }, + "valueType": "STRING", + "value": "", + "optional": true, + "editable": true, + "advanced": true + } + }, + "members": [ + { + "kind": "FIELD", + "refs": [], + "type": "int", + "name": "iA", + "docs": "" + }, + { + "kind": "FIELD", + "refs": [], + "type": { + "editable": false, + "codedata": { + "node": "RECORD" + }, + "properties": { + "isArray": { + "metadata": { + "label": "Is array type", + "description": "Is this type an array or list value" + }, + "valueType": "FLAG", + "value": "false", + "optional": true, + "editable": true, + "advanced": true + }, + "arraySize": { + "metadata": { + "label": "Size of the array", + "description": "Array dimensions" + }, + "valueType": "STRING", + "value": "", + "optional": true, + "editable": true, + "advanced": true + } + }, + "members": [ + { + "kind": "FIELD", + "refs": [], + "type": "int", + "name": "iiA", + "docs": "" + } + ], + "includes": [] + }, + "name": "iB", + "docs": "" + } + ], + "includes": [] + }, + "name": "field1", + "docs": "Anonymous nested record type" + }, + { + "kind": "FIELD", + "refs": [], + "type": { + "editable": false, + "codedata": { + "node": "UNION" + }, + "properties": { + "isArray": { + "metadata": { + "label": "Is array type", + "description": "Is this type an array or list value" + }, + "valueType": "FLAG", + "value": "false", + "optional": true, + "editable": true, + "advanced": true + }, + "arraySize": { + "metadata": { + "label": "Size of the array", + "description": "Array dimensions" + }, + "valueType": "STRING", + "value": "", + "optional": false, + "editable": false, + "advanced": false + } + }, + "members": [ + { + "kind": "TYPE", + "refs": [], + "type": "xml", + "name": "xml" + }, + { + "kind": "TYPE", + "refs": [ + "UserAddress" + ], + "type": "UserAddress", + "name": "UserAddress" + }, + { + "kind": "TYPE", + "refs": [ + "City" + ], + "type": "City", + "name": "City" + } + ] + }, + "name": "address", + "docs": "Union of of type-refs and a built-in type" + }, + { + "kind": "FIELD", + "refs": [], + "type": "string", + "name": "name", + "docs": "Name of the employee" + }, + { + "kind": "FIELD", + "refs": [], + "type": "int", + "name": "age", + "docs": "Age of the employee" + } + ], + "restMember": { + "kind": "FIELD", + "refs": [], + "type": "anydata" + }, + "includes": [] + }, + "output": { + "test_pack2/types.bal": [ + { + "range": { + "start": { + "line": 4, + "character": 0 + }, + "end": { + "line": 4, + "character": 0 + } + }, + "newText": "# User record type\n# Simple record type with docs, anonymous field types (union, record)\ntype User record {|\n\t# Anonymous nested record type\n\trecord {|\n\tint iA;\n\trecord {|\n\tint iiA;\n|} iB;\n|} field1;\n\t# Union of of type-refs and a built-in type\n\txml|UserAddress|City address;\n\t# Name of the employee\n\tstring name;\n\t# Age of the employee\n\tint age;\n\tanydata ...;\n|};\n" + } + ] + } +} diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/update_record_type4.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/update_record_type4.json new file mode 100644 index 000000000..b911520ae --- /dev/null +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/update_record_type4.json @@ -0,0 +1,310 @@ +{ + "filePath": "test_pack2/records.bal", + "description": "Update a complex record type", + "type": { + "name": "User", + "editable": true, + "metadata": { + "label": "User", + "description": "User record type\nSimple record type with docs, anonymous field types (union, record)" + }, + "codedata": { + "node": "RECORD", + "lineRange": { + "fileName": "records.bal", + "startLine": { + "line": 4, + "offset": 5 + }, + "endLine": { + "line": 4, + "offset": 9 + } + } + }, + "properties": { + "name": { + "metadata": { + "label": "Type name", + "description": "Unique name to identify the type" + }, + "valueType": "IDENTIFIER", + "value": "User", + "optional": false, + "editable": true, + "advanced": false + }, + "description": { + "metadata": { + "label": "Type description", + "description": "Detailed description about the type" + }, + "valueType": "STRING", + "value": "User record type\nSimple record type with docs, anonymous field types (union, record)", + "optional": false, + "editable": true, + "advanced": false + }, + "isArray": { + "metadata": { + "label": "Is array type", + "description": "Is this type an array or list value" + }, + "valueType": "FLAG", + "value": "false", + "optional": true, + "editable": true, + "advanced": true + }, + "arraySize": { + "metadata": { + "label": "Size of the array", + "description": "Array dimensions" + }, + "valueType": "STRING", + "value": "", + "optional": true, + "editable": true, + "advanced": true + } + }, + "members": [ + { + "kind": "FIELD", + "refs": [], + "type": { + "editable": false, + "codedata": { + "node": "RECORD" + }, + "properties": { + "isArray": { + "metadata": { + "label": "Is array type", + "description": "Is this type an array or list value" + }, + "valueType": "FLAG", + "value": "false", + "optional": true, + "editable": true, + "advanced": true + }, + "arraySize": { + "metadata": { + "label": "Size of the array", + "description": "Array dimensions" + }, + "valueType": "STRING", + "value": "", + "optional": true, + "editable": true, + "advanced": true + } + }, + "members": [ + { + "kind": "FIELD", + "refs": [], + "type": { + "editable": false, + "codedata": { + "node": "UNION" + }, + "properties": { + "isArray": { + "metadata": { + "label": "Is array type", + "description": "Is this type an array or list value" + }, + "valueType": "FLAG", + "value": "false", + "optional": true, + "editable": true, + "advanced": true + }, + "arraySize": { + "metadata": { + "label": "Size of the array", + "description": "Array dimensions" + }, + "valueType": "STRING", + "value": "", + "optional": false, + "editable": false, + "advanced": false + } + }, + "members": [ + { + "kind": "TYPE", + "refs": [ + "City" + ], + "type": "City", + "name": "string" + }, + { + "kind": "TYPE", + "refs": [ + "UserAddress" + ], + "type": "UserAddress", + "name": "int" + } + ] + }, + "name": "iA", + "docs": "" + }, + { + "kind": "FIELD", + "refs": [], + "type": { + "editable": false, + "codedata": { + "node": "RECORD" + }, + "properties": { + "isArray": { + "metadata": { + "label": "Is array type", + "description": "Is this type an array or list value" + }, + "valueType": "FLAG", + "value": "false", + "optional": true, + "editable": true, + "advanced": true + }, + "arraySize": { + "metadata": { + "label": "Size of the array", + "description": "Array dimensions" + }, + "valueType": "STRING", + "value": "", + "optional": true, + "editable": true, + "advanced": true + } + }, + "members": [ + { + "kind": "FIELD", + "refs": [], + "type": "int", + "name": "iiA", + "docs": "" + } + ], + "includes": [] + }, + "name": "iB", + "docs": "" + } + ], + "includes": [] + }, + "name": "field1", + "docs": "Anonymous nested record type" + }, + { + "kind": "FIELD", + "refs": [], + "type": { + "editable": false, + "codedata": { + "node": "UNION" + }, + "properties": { + "isArray": { + "metadata": { + "label": "Is array type", + "description": "Is this type an array or list value" + }, + "valueType": "FLAG", + "value": "false", + "optional": true, + "editable": true, + "advanced": true + }, + "arraySize": { + "metadata": { + "label": "Size of the array", + "description": "Array dimensions" + }, + "valueType": "STRING", + "value": "", + "optional": false, + "editable": false, + "advanced": false + } + }, + "members": [ + { + "kind": "TYPE", + "refs": [], + "type": "xml", + "name": "xml" + }, + { + "kind": "TYPE", + "refs": [ + "UserAddress" + ], + "type": "UserAddress", + "name": "UserAddress" + }, + { + "kind": "TYPE", + "refs": [ + "City" + ], + "type": "City", + "name": "City" + } + ] + }, + "name": "address", + "docs": "Union of of type-refs and a built-in type" + }, + { + "kind": "FIELD", + "refs": [], + "type": "string", + "name": "name", + "docs": "Name of the employee" + }, + { + "kind": "FIELD", + "refs": [], + "type": "int", + "name": "age", + "docs": "Age of the employee" + } + ], + "restMember": { + "kind": "FIELD", + "refs": [], + "type": "anydata" + }, + "includes": [] + }, + "output": { + "test_pack2/records.bal": [ + { + "range": { + "start": { + "line": 2, + "character": 0 + }, + "end": { + "line": 13, + "character": 2 + } + }, + "newText": "# User record type\n# Simple record type with docs, anonymous field types (union, record)\ntype User record {|\n\t# Anonymous nested record type\n\trecord {|\n\tCity|UserAddress iA;\n\trecord {|\n\tint iiA;\n|} iB;\n|} field1;\n\t# Union of of type-refs and a built-in type\n\txml|UserAddress|City address;\n\t# Name of the employee\n\tstring name;\n\t# Age of the employee\n\tint age;\n\tanydata ...;\n|};\n" + } + ] + } +} From 0e9b3be545703a429cc748ffe94ffb4e22509649 Mon Sep 17 00:00:00 2001 From: dulaj Date: Wed, 29 Jan 2025 23:54:24 +0530 Subject: [PATCH 4/6] Fix defaultValue of enum members --- .../flowmodelgenerator/core/TypesManager.java | 2 +- .../core/utils/TypeTransformer.java | 13 +++++++++---- .../types_manager/config/get_enum_type1.json | 6 +++--- .../types_manager/config/get_enum_type2.json | 10 ++++++---- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/TypesManager.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/TypesManager.java index 61b85b86a..e827fb045 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/TypesManager.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/TypesManager.java @@ -46,8 +46,8 @@ import io.ballerina.compiler.syntax.tree.SyntaxTree; import io.ballerina.flowmodelgenerator.core.model.ModuleInfo; import io.ballerina.flowmodelgenerator.core.model.TypeData; -import io.ballerina.flowmodelgenerator.core.utils.SourceCodeGenerator; import io.ballerina.flowmodelgenerator.core.utils.CommonUtils; +import io.ballerina.flowmodelgenerator.core.utils.SourceCodeGenerator; import io.ballerina.flowmodelgenerator.core.utils.TypeTransformer; import io.ballerina.flowmodelgenerator.core.utils.TypeUtils; import io.ballerina.projects.Document; diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/utils/TypeTransformer.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/utils/TypeTransformer.java index 647a2a6ae..929dfff3b 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/utils/TypeTransformer.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/utils/TypeTransformer.java @@ -231,12 +231,17 @@ public Object transform(EnumSymbol enumSymbol) { Member.MemberBuilder memberBuilder = new Member.MemberBuilder(); enumSymbol.members().forEach(enumMember -> { String name = enumMember.getName().get(); - Member member = memberBuilder + ConstantValue constValue = (ConstantValue) enumMember.constValue(); + String constValueAsString = "\"" + constValue.value() +"\""; + memberBuilder .name(name) .kind(Member.MemberKind.NAME) - .type(((ConstantValue) enumMember.constValue()).value().toString()) - .refs(List.of()) - .build(); + .type(constValueAsString) + .refs(List.of()); + if (!constValue.value().equals(enumMember.getName().get())) { + memberBuilder.defaultValue(constValueAsString); + } + Member member = memberBuilder.build(); members.putIfAbsent(name, member); }); typeDataBuilder.members(members); diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/get_enum_type1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/get_enum_type1.json index 50aeca6aa..126f87fa4 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/get_enum_type1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/get_enum_type1.json @@ -65,19 +65,19 @@ { "kind": "NAME", "refs": [], - "type": "RED", + "type": "\"RED\"", "name": "RED" }, { "kind": "NAME", "refs": [], - "type": "YELLOW", + "type": "\"YELLOW\"", "name": "YELLOW" }, { "kind": "NAME", "refs": [], - "type": "GREEN", + "type": "\"GREEN\"", "name": "GREEN" } ] diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/get_enum_type2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/get_enum_type2.json index 6ce22c73a..54bbf18ca 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/get_enum_type2.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/get_enum_type2.json @@ -65,14 +65,16 @@ { "kind": "NAME", "refs": [], - "type": "male", - "name": "MALE" + "type": "\"male\"", + "name": "MALE", + "defaultValue": "\"male\"" }, { "kind": "NAME", "refs": [], - "type": "female", - "name": "FEMALE" + "type": "\"female\"", + "name": "FEMALE", + "defaultValue": "\"female\"" } ] }, From b961e93a86e4168f6e60d57bc321ec2fb1a44e1d Mon Sep 17 00:00:00 2001 From: dulaj Date: Wed, 29 Jan 2025 23:55:00 +0530 Subject: [PATCH 5/6] Implement enum source code generation --- .../core/utils/SourceCodeGenerator.java | 26 +++++- .../typesmanager/CreateAndUpdateTypeTest.java | 5 +- .../config/create_enum_type.json | 83 +++++++++++++++++++ 3 files changed, 111 insertions(+), 3 deletions(-) create mode 100644 flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/create_enum_type.json diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/utils/SourceCodeGenerator.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/utils/SourceCodeGenerator.java index 1ec834e3d..da4ca75c4 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/utils/SourceCodeGenerator.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/utils/SourceCodeGenerator.java @@ -44,7 +44,31 @@ public String generateCodeSnippetForType(TypeData typeData) { } private String generateEnumCodeSnippet(TypeData typeData) { - return null; + StringBuilder stringBuilder = new StringBuilder(); + + // Add documentation if present + if (typeData.metadata().description() != null && !typeData.metadata().description().isEmpty()) { + stringBuilder.append(CommonUtils.convertToBalDocs(typeData.metadata().description())); + } + + // Add enum names + stringBuilder.append("enum ") + .append(typeData.name()) + .append(" {"); + + // Add enum values + for (int i = 0; i < typeData.members().size(); i++) { + Member member = typeData.members().get(i); + stringBuilder.append("\n\t") + .append(member.name()) + .append((member.defaultValue() != null && !member.defaultValue().isEmpty()) ? + " = " + member.defaultValue() : ""); + if (i < typeData.members().size() - 1) { + stringBuilder.append(","); + } + } + + return stringBuilder.append("\n}\n").toString(); } private String generateTypeDefCodeSnippet(TypeData typeData) { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/java/io/ballerina/flowmodelgenerator/extension/typesmanager/CreateAndUpdateTypeTest.java b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/java/io/ballerina/flowmodelgenerator/extension/typesmanager/CreateAndUpdateTypeTest.java index 2cf025185..c2dfe70a0 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/java/io/ballerina/flowmodelgenerator/extension/typesmanager/CreateAndUpdateTypeTest.java +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/java/io/ballerina/flowmodelgenerator/extension/typesmanager/CreateAndUpdateTypeTest.java @@ -69,12 +69,13 @@ protected Object[] getConfigsList() { {Path.of("create_record_type1.json")}, {Path.of("create_record_type2.json")}, {Path.of("create_record_type3.json")}, + {Path.of("create_union_type.json")}, + {Path.of("create_enum_type.json")}, + {Path.of("create_table_type.json")}, {Path.of("update_record_type1.json")}, {Path.of("update_record_type2.json")}, {Path.of("update_record_type3.json")}, {Path.of("update_record_type4.json")}, - {Path.of("create_union_type.json")}, - {Path.of("create_table_type.json")}, }; } diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/create_enum_type.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/create_enum_type.json new file mode 100644 index 000000000..0a96f9b92 --- /dev/null +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/types_manager/config/create_enum_type.json @@ -0,0 +1,83 @@ +{ + "filePath": "test_pack1/types.bal", + "description": "Create a new union type", + "type": { + "name": "Gender", + "editable": true, + "metadata": { + "label": "Gender", + "description": "" + }, + "codedata": { + "node": "ENUM" + }, + "properties": { + "isArray": { + "metadata": { + "label": "Is array type", + "description": "Is this type an array or list value" + }, + "valueType": "FLAG", + "value": "false", + "optional": true, + "editable": true, + "advanced": true + }, + "arraySize": { + "metadata": { + "label": "Size of the array", + "description": "Array dimensions" + }, + "valueType": "STRING", + "value": "", + "optional": false, + "editable": false, + "advanced": false + }, + "description": { + "metadata": { + "label": "Type description", + "description": "Detailed description about the type" + }, + "valueType": "STRING", + "value": "", + "optional": false, + "editable": true, + "advanced": false + } + }, + "members": [ + { + "kind": "NAME", + "refs": [], + "type": "\"male\"", + "name": "MALE", + "defaultValue": "\"male\"" + }, + { + "kind": "NAME", + "refs": [], + "type": "\"female\"", + "name": "FEMALE", + "defaultValue": "\"female\"" + } + ] + }, + "output": { + "test_pack1/types.bal": [ + { + "range": { + "start": { + "line": 68, + "character": 0 + }, + "end": { + "line": 68, + "character": 0 + } + }, + "newText": "enum Gender {\n\tMALE = \"male\",\n\tFEMALE = \"female\"\n}\n" + } + ] + } +} From e370b8dfa53252facc3ba6cb9584ee655c06def6 Mon Sep 17 00:00:00 2001 From: dulaj Date: Wed, 29 Jan 2025 23:56:31 +0530 Subject: [PATCH 6/6] Fix '+' is not followed by whitespace --- .../flowmodelgenerator/core/utils/TypeTransformer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/utils/TypeTransformer.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/utils/TypeTransformer.java index 929dfff3b..0eca2f0aa 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/utils/TypeTransformer.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/utils/TypeTransformer.java @@ -232,7 +232,7 @@ public Object transform(EnumSymbol enumSymbol) { enumSymbol.members().forEach(enumMember -> { String name = enumMember.getName().get(); ConstantValue constValue = (ConstantValue) enumMember.constValue(); - String constValueAsString = "\"" + constValue.value() +"\""; + String constValueAsString = "\"" + constValue.value() + "\""; memberBuilder .name(name) .kind(Member.MemberKind.NAME)