From 74b99e50bc67b3b3a474fda4d881175e6be82996 Mon Sep 17 00:00:00 2001 From: pasindufernando1 Date: Mon, 8 Sep 2025 15:08:10 +0530 Subject: [PATCH 1/4] Handle entire root expression deletion in the reusable data mapper --- .../core/DataMapManager.java | 18 ++++++++ .../extension/DataMappingDeleteTest.java | 23 +++++----- .../delete_mapping/config/variable8.json | 45 +++++++++++++++++++ .../delete_mapping/source/variable6.bal | 26 +++++++++++ 4 files changed, 101 insertions(+), 11 deletions(-) create mode 100644 flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/delete_mapping/config/variable8.json create mode 100644 flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/delete_mapping/source/variable6.bal diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/DataMapManager.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/DataMapManager.java index d19a0a9ef9..403e2616c8 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/DataMapManager.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/DataMapManager.java @@ -26,6 +26,7 @@ import io.ballerina.compiler.api.symbols.ConstantSymbol; import io.ballerina.compiler.api.symbols.EnumSymbol; import io.ballerina.compiler.api.symbols.FunctionSymbol; +import io.ballerina.compiler.api.symbols.FunctionTypeSymbol; import io.ballerina.compiler.api.symbols.ModuleSymbol; import io.ballerina.compiler.api.symbols.ParameterSymbol; import io.ballerina.compiler.api.symbols.Qualifier; @@ -1346,6 +1347,23 @@ private void genDeleteMappingSource(SemanticModel semanticModel, ExpressionNode textEdits.add(new TextEdit(CommonUtils.toRange(expr.lineRange()), defaultVal)); } } + } else if (parent.kind() == SyntaxKind.EXPRESSION_FUNCTION_BODY) { + Optional optSymbol = semanticModel.symbol(parent.parent()); + if (optSymbol.isEmpty()) { + return; + } + Symbol symbol = optSymbol.get(); + if (symbol.kind() == SymbolKind.FUNCTION) { + FunctionSymbol functionSymbol = (FunctionSymbol) symbol; + Optional returnType = functionSymbol.typeDescriptor().returnTypeDescriptor(); + if (returnType.isPresent()) { + TypeSymbol returnTypeSymbol = returnType.get(); + String defaultVal = getDefaultValue( + CommonUtil.getRawType(returnTypeSymbol).typeKind().getName()); + textEdits.add(new TextEdit(CommonUtils.toRange(expr.lineRange()), defaultVal)); + } + } + } } } else if (expr.kind() == SyntaxKind.MAPPING_CONSTRUCTOR) { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/java/io/ballerina/flowmodelgenerator/extension/DataMappingDeleteTest.java b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/java/io/ballerina/flowmodelgenerator/extension/DataMappingDeleteTest.java index 3f5601046e..7300978222 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/java/io/ballerina/flowmodelgenerator/extension/DataMappingDeleteTest.java +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/java/io/ballerina/flowmodelgenerator/extension/DataMappingDeleteTest.java @@ -50,17 +50,18 @@ public class DataMappingDeleteTest extends AbstractLSTest { @Override protected Object[] getConfigsList() { return new Object[][]{ - {Path.of("variable1.json")}, - {Path.of("variable2.json")}, - {Path.of("variable3.json")}, - {Path.of("query1.json")}, - {Path.of("array.json")}, - {Path.of("array2.json")}, - {Path.of("array3.json")}, - {Path.of("variable4.json")}, - {Path.of("variable5.json")}, - {Path.of("function_defn1.json")}, - {Path.of("function_defn2.json")}, +// {Path.of("variable1.json")}, +// {Path.of("variable2.json")}, +// {Path.of("variable3.json")}, +// {Path.of("query1.json")}, +// {Path.of("array.json")}, +// {Path.of("array2.json")}, +// {Path.of("array3.json")}, +// {Path.of("variable4.json")}, +// {Path.of("variable5.json")}, +// {Path.of("function_defn1.json")}, +// {Path.of("function_defn2.json")}, + {Path.of("variable8.json")}, }; } diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/delete_mapping/config/variable8.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/delete_mapping/config/variable8.json new file mode 100644 index 0000000000..90b5ee9606 --- /dev/null +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/delete_mapping/config/variable8.json @@ -0,0 +1,45 @@ +{ + "source": "variable6.bal", + "description": "", + "codedata": { + "node": "VARIABLE", + "lineRange": { + "fileName": "variable6.bal", + "startLine": { + "line": 10, + "offset": 0 + }, + "endLine": { + "line": 10, + "offset": 52 + } + } + }, + "mapping": { + "output": "name", + "inputs": [ + "arr1" + ], + "expression": "arr1", + "diagnostics": [], + "elements": [] + }, + "targetField": "name", + "output": { + "variable6.bal": [ + { + "range": { + "start": { + "line": 10, + "character": 47 + }, + "end": { + "line": 10, + "character": 51 + } + }, + "newText": "{}" + } + ] + } +} diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/delete_mapping/source/variable6.bal b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/delete_mapping/source/variable6.bal new file mode 100644 index 0000000000..046db5ee2c --- /dev/null +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/delete_mapping/source/variable6.bal @@ -0,0 +1,26 @@ +import ballerina/http; + +type RecType record {| + int i; +|}; + +type ArrType record {| + RecType[] rec; +|}; + +function name(ArrType arr1) returns ArrType => arr1; + +service OASServiceType on new http:Listener(9090) { + + resource function get pet() returns int|http:NotFound { + do { + ArrType v1 = {}; + ArrType v2 = { + rec: from var recItem in v1.rec + select recItem + }; + } on fail error e { + return http:NOT_FOUND; + } + } +} From 9c86b4f9b5a471fb66ceae02247985b0e6a422c9 Mon Sep 17 00:00:00 2001 From: pasindufernando1 Date: Mon, 8 Sep 2025 15:38:45 +0530 Subject: [PATCH 2/4] Handle entire expression deletion of a select clause --- .../core/DataMapManager.java | 11 +++++ .../extension/DataMappingDeleteTest.java | 27 ++++++----- .../delete_mapping/config/variable9.json | 47 +++++++++++++++++++ 3 files changed, 72 insertions(+), 13 deletions(-) create mode 100644 flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/delete_mapping/config/variable9.json diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/DataMapManager.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/DataMapManager.java index 9e8965670c..14dfa3f977 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/DataMapManager.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/DataMapManager.java @@ -1364,6 +1364,17 @@ private void genDeleteMappingSource(SemanticModel semanticModel, ExpressionNode } } + } else if (parent.kind() == SyntaxKind.SELECT_CLAUSE) { + Optional optSymbol = semanticModel.symbol(expr); + if (optSymbol.isPresent()) { + Symbol symbol = optSymbol.get(); + if (symbol.kind() == SymbolKind.VARIABLE) { + VariableSymbol varSymbol = (VariableSymbol) symbol; + String defaultVal = getDefaultValue( + CommonUtil.getRawType(varSymbol.typeDescriptor()).typeKind().getName()); + textEdits.add(new TextEdit(CommonUtils.toRange(expr.lineRange()), defaultVal)); + } + } } } } else if (expr.kind() == SyntaxKind.MAPPING_CONSTRUCTOR) { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/java/io/ballerina/flowmodelgenerator/extension/DataMappingDeleteTest.java b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/java/io/ballerina/flowmodelgenerator/extension/DataMappingDeleteTest.java index 464302d537..be4544ea48 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/java/io/ballerina/flowmodelgenerator/extension/DataMappingDeleteTest.java +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/java/io/ballerina/flowmodelgenerator/extension/DataMappingDeleteTest.java @@ -50,20 +50,21 @@ public class DataMappingDeleteTest extends AbstractLSTest { @Override protected Object[] getConfigsList() { return new Object[][]{ -// {Path.of("variable1.json")}, -// {Path.of("variable2.json")}, -// {Path.of("variable3.json")}, -// {Path.of("query1.json")}, -// {Path.of("array.json")}, -// {Path.of("array2.json")}, -// {Path.of("array3.json")}, -// {Path.of("variable4.json")}, -// {Path.of("variable5.json")}, -// {Path.of("function_defn1.json")}, -// {Path.of("function_defn2.json")}, - {Path.of("variable8.json")}, + {Path.of("variable1.json")}, + {Path.of("variable2.json")}, + {Path.of("variable3.json")}, + {Path.of("query1.json")}, + {Path.of("array.json")}, + {Path.of("array2.json")}, + {Path.of("array3.json")}, + {Path.of("variable4.json")}, + {Path.of("variable5.json")}, + {Path.of("function_defn1.json")}, + {Path.of("function_defn2.json")}, {Path.of("variable6.json")}, - {Path.of("variable7.json")} + {Path.of("variable7.json")}, + {Path.of("variable8.json")}, + {Path.of("variable9.json")}, }; } diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/delete_mapping/config/variable9.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/delete_mapping/config/variable9.json new file mode 100644 index 0000000000..2985d69559 --- /dev/null +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/delete_mapping/config/variable9.json @@ -0,0 +1,47 @@ +{ + "source": "variable6.bal", + "description": "", + "codedata": { + "node": "VARIABLE", + "lineRange": { + "fileName": "variable6.bal", + "startLine": { + "line": 17, + "offset": 12 + }, + "endLine": { + "line": 20, + "offset": 14 + } + } + }, + "mapping": { + "output": "rec", + "inputs": [ + "recItem" + ], + "expression": "recItem\n", + "diagnostics": [], + "elements": [], + "isQueryExpression": false, + "isFunctionCall": false + }, + "targetField": "v2.rec", + "output": { + "variable6.bal": [ + { + "range": { + "start": { + "line": 19, + "character": 27 + }, + "end": { + "line": 19, + "character": 34 + } + }, + "newText": "{}" + } + ] + } +} From 55edc6ef347cf13749c4abcc7016eadf66e9b29b Mon Sep 17 00:00:00 2001 From: pasindufernando1 Date: Mon, 8 Sep 2025 16:32:46 +0530 Subject: [PATCH 3/4] Fix checkstyle issues --- .../io/ballerina/flowmodelgenerator/core/DataMapManager.java | 1 - 1 file changed, 1 deletion(-) diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/DataMapManager.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/DataMapManager.java index 14dfa3f977..58733a1111 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/DataMapManager.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/DataMapManager.java @@ -26,7 +26,6 @@ import io.ballerina.compiler.api.symbols.ConstantSymbol; import io.ballerina.compiler.api.symbols.EnumSymbol; import io.ballerina.compiler.api.symbols.FunctionSymbol; -import io.ballerina.compiler.api.symbols.FunctionTypeSymbol; import io.ballerina.compiler.api.symbols.ModuleSymbol; import io.ballerina.compiler.api.symbols.ParameterSymbol; import io.ballerina.compiler.api.symbols.Qualifier; From 7c42287c9b4b4fc6c02d454f4d8c0c20169677e1 Mon Sep 17 00:00:00 2001 From: pasindufernando1 Date: Tue, 9 Sep 2025 10:02:13 +0530 Subject: [PATCH 4/4] Address PR suggestion --- .../io/ballerina/flowmodelgenerator/core/DataMapManager.java | 1 - 1 file changed, 1 deletion(-) diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/DataMapManager.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/DataMapManager.java index 58733a1111..f2d32701af 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/DataMapManager.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/DataMapManager.java @@ -1362,7 +1362,6 @@ private void genDeleteMappingSource(SemanticModel semanticModel, ExpressionNode textEdits.add(new TextEdit(CommonUtils.toRange(expr.lineRange()), defaultVal)); } } - } else if (parent.kind() == SyntaxKind.SELECT_CLAUSE) { Optional optSymbol = semanticModel.symbol(expr); if (optSymbol.isPresent()) {