From 216cbf9796a251405e977b65529f02d0e55c9215 Mon Sep 17 00:00:00 2001 From: Ilidio de Pina Lopes Date: Tue, 23 Jan 2024 13:29:05 +0100 Subject: [PATCH] get the nested children variables & SQLCODE & unit test --- .../tree/variable/ElementaryItemNode.java | 2 +- .../tree/variable/TableDataNameNode.java | 2 +- .../cobol/core/model/VariableUsageUtils.java | 19 +++++- .../Db2ImplicitVariablesGenerator.java | 1 + .../core/model/VariableUsageUtilsTest.java | 62 +++++++++++++++++++ 5 files changed, 83 insertions(+), 3 deletions(-) create mode 100644 server/engine/src/test/java/org/eclipse/lsp/cobol/core/model/VariableUsageUtilsTest.java diff --git a/server/common/src/main/java/org/eclipse/lsp/cobol/common/model/tree/variable/ElementaryItemNode.java b/server/common/src/main/java/org/eclipse/lsp/cobol/common/model/tree/variable/ElementaryItemNode.java index 5f1efef613..fbb5e94969 100644 --- a/server/common/src/main/java/org/eclipse/lsp/cobol/common/model/tree/variable/ElementaryItemNode.java +++ b/server/common/src/main/java/org/eclipse/lsp/cobol/common/model/tree/variable/ElementaryItemNode.java @@ -95,7 +95,7 @@ public ElementaryItemNode( protected String getVariableDisplayString() { StringBuilder stringBuilder = new StringBuilder(getFormattedSuffix()); if (picClause != null) stringBuilder.append(" PIC ").append(picClause); - if (usageFormat != UsageFormat.UNDEFINED) + if (usageFormat != null && usageFormat != UsageFormat.UNDEFINED) stringBuilder.append(" USAGE ").append(usageFormat.toDisplayString()); if (StringUtils.isNoneBlank(value)) stringBuilder.append(" VALUE ").append(value); return stringBuilder.append(".").toString(); diff --git a/server/common/src/main/java/org/eclipse/lsp/cobol/common/model/tree/variable/TableDataNameNode.java b/server/common/src/main/java/org/eclipse/lsp/cobol/common/model/tree/variable/TableDataNameNode.java index 497f9581b4..190392a77c 100644 --- a/server/common/src/main/java/org/eclipse/lsp/cobol/common/model/tree/variable/TableDataNameNode.java +++ b/server/common/src/main/java/org/eclipse/lsp/cobol/common/model/tree/variable/TableDataNameNode.java @@ -96,7 +96,7 @@ protected String getVariableDisplayString() { StringBuilder stringBuilder = new StringBuilder(getFormattedSuffix()); stringBuilder.append(String.format(" OCCURS %1$d TIMES", occursTimes)); if (picClause != null) stringBuilder.append(" PIC ").append(picClause); - if (usageFormat != UsageFormat.UNDEFINED) + if (usageFormat != null && usageFormat != UsageFormat.UNDEFINED) stringBuilder.append(" USAGE ").append(usageFormat.toDisplayString()); if (StringUtils.isNoneBlank(value)) stringBuilder.append(" VALUE ").append(value); return stringBuilder.append(".").toString(); diff --git a/server/engine/src/main/java/org/eclipse/lsp/cobol/core/model/VariableUsageUtils.java b/server/engine/src/main/java/org/eclipse/lsp/cobol/core/model/VariableUsageUtils.java index a4f8d97108..7eb4a57cbb 100644 --- a/server/engine/src/main/java/org/eclipse/lsp/cobol/core/model/VariableUsageUtils.java +++ b/server/engine/src/main/java/org/eclipse/lsp/cobol/core/model/VariableUsageUtils.java @@ -45,7 +45,7 @@ public class VariableUsageUtils { public static List findVariablesForUsage( Multimap definedVariables, List usageNodes) { Map variableToStepCountsToMatchParentsMap = - definedVariables.get(usageNodes.get(0).getName()).stream() + findDefinedVariable(usageNodes.get(0).getName(), definedVariables).stream() .map( it -> mapVariableToStepCountsToMatchParents( @@ -68,6 +68,23 @@ public static List findVariablesForUsage( : exactHierarchyMatchedVariables; } + private Collection findDefinedVariable(String name, Multimap definedVariables) { + Collection foundVariable = definedVariables.get(name); + if (foundVariable.size() > 0) { + return foundVariable; + } + Optional node = definedVariables.values() + .stream().flatMap(Node::getDepthFirstStream) + .filter(VariableNode.class::isInstance) + .map(VariableNode.class::cast) + .filter(var -> var.getName().equals(name)) + .findFirst(); + if (node.isPresent()) { + foundVariable.add(node.get()); + } + return foundVariable; + } + private static Map mapVariableToStepCountsToMatchParents( VariableNode variable, List parents) { VariableNode referredVariable = variable; diff --git a/server/engine/src/main/java/org/eclipse/lsp/cobol/implicitDialects/sql/generator/Db2ImplicitVariablesGenerator.java b/server/engine/src/main/java/org/eclipse/lsp/cobol/implicitDialects/sql/generator/Db2ImplicitVariablesGenerator.java index ba7c2a6988..e38a45adf3 100644 --- a/server/engine/src/main/java/org/eclipse/lsp/cobol/implicitDialects/sql/generator/Db2ImplicitVariablesGenerator.java +++ b/server/engine/src/main/java/org/eclipse/lsp/cobol/implicitDialects/sql/generator/Db2ImplicitVariablesGenerator.java @@ -175,6 +175,7 @@ PIC X(08). addElement(variable, 5, "SQLCA-DB-VRS", "X(2)"); addElement(variable, 5, "SQLCA-DB-RLS", "X(2)"); addElement(variable, 5, "SQLCA-LUWID", "X(8)"); + addElement(variable, 5, "SQLCODE", "S9(9)", UsageFormat.COMP_5); variable.addChild(new ElementaryItemNode(LOCALITY, 5, "SQLCA-SQLCODE", false, "S9(9)", null, UsageFormat.COMP, false, false, false)); diff --git a/server/engine/src/test/java/org/eclipse/lsp/cobol/core/model/VariableUsageUtilsTest.java b/server/engine/src/test/java/org/eclipse/lsp/cobol/core/model/VariableUsageUtilsTest.java new file mode 100644 index 0000000000..e0f7977822 --- /dev/null +++ b/server/engine/src/test/java/org/eclipse/lsp/cobol/core/model/VariableUsageUtilsTest.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2024 Broadcom. + * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Broadcom, Inc. - initial API and implementation + * + */ + +package org.eclipse.lsp.cobol.core.model; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.Arrays; +import java.util.List; + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; +import org.eclipse.lsp.cobol.common.model.Locality; +import org.eclipse.lsp.cobol.common.model.tree.variable.*; +import org.eclipse.lsp.cobol.common.utils.ImplicitCodeUtils; +import org.eclipse.lsp.cobol.implicitDialects.sql.generator.Db2ImplicitVariablesGenerator; +import org.junit.jupiter.api.Test; + +/** Check if the variable used is part of the defined variables */ +public class VariableUsageUtilsTest { + List datacomNodes = Db2ImplicitVariablesGenerator.generateDatacomNodes(); + Locality locality = Locality.builder() + .uri(ImplicitCodeUtils.createFullUrl("implicit-code-SQLCA_DB2")) + .build(); + @Test + void testFindVariablesForUsage() { + VariableUsageNode usageNode1 = new VariableUsageNode("SQLCA-ERR-MSG", locality); + List usageNodes = Arrays.asList(usageNode1); + VariableNode variableNode1 = new ElementaryItemNode(locality, 10, "SQLCA-ERR-MSG", false, "X(80)", + null, UsageFormat.UNDEFINED, false, false, false); + Multimap definedVariables = ArrayListMultimap.create(); + definedVariables.put("SQLCA", datacomNodes.get(0)); + List result = VariableUsageUtils.findVariablesForUsage(definedVariables, usageNodes); + + assertEquals(1, result.size()); + assertTrue(result.contains(variableNode1)); + } + + @Test + void testFindVariablesForUsageNoMatch() { + VariableUsageNode usageNode1 = new VariableUsageNode("SQLCA-NO-MATCH", locality); + List usageNodes = Arrays.asList(usageNode1); + Multimap definedVariables = ArrayListMultimap.create(); + definedVariables.put("SQLCA", datacomNodes.get(0)); + List result = VariableUsageUtils.findVariablesForUsage(definedVariables, usageNodes); + + assertTrue(result.isEmpty()); + } +}