From 8dfd7e0d3a010dd447d6a6c930610bc63e4bc2cc Mon Sep 17 00:00:00 2001 From: Jules Kreutzer Date: Mon, 15 Jan 2024 11:34:03 +0100 Subject: [PATCH] Feature: Add support for DACO-CONTROL statement in DaCo dialect --- .../lsp/cobol/core/parser/DaCoLexer.g4 | 2 + .../lsp/cobol/core/parser/DaCoParser.g4 | 14 +++- .../lsp/cobol/dialects/daco/DaCoVisitor.java | 6 ++ .../daco/usecases/TestDaCoControlSection.java | 64 +++++++++++++++++++ 4 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 server/dialect-daco/src/test/java/org/eclipse/lsp/cobol/dialects/daco/usecases/TestDaCoControlSection.java diff --git a/server/dialect-daco/src/main/antlr4/org/eclipse/lsp/cobol/core/parser/DaCoLexer.g4 b/server/dialect-daco/src/main/antlr4/org/eclipse/lsp/cobol/core/parser/DaCoLexer.g4 index f07caa0c05..aab8a4cc9b 100644 --- a/server/dialect-daco/src/main/antlr4/org/eclipse/lsp/cobol/core/parser/DaCoLexer.g4 +++ b/server/dialect-daco/src/main/antlr4/org/eclipse/lsp/cobol/core/parser/DaCoLexer.g4 @@ -35,6 +35,7 @@ CHECK : C H E C K; CLOSE : C L O S E; COLS : C O L S; CR : C R; +DACO_CONTROL: D A C O MINUSCHAR C O N T R O L; DATE : D A T E; DAY : D A Y; DAY_OF_WEEK : D A Y MINUSCHAR O F MINUSCHAR W E E K; @@ -127,6 +128,7 @@ RETURN : R E T U R N; RETURN_CODE : R E T U R N MINUSCHAR C O D E; ROW : R O W; RCU : R C U; +SECTION: S E C T I O N; SEQ : S E Q; SHIFT_IN : S H I F T MINUSCHAR I N; SHIFT_OUT : S H I F T MINUSCHAR O U T; diff --git a/server/dialect-daco/src/main/antlr4/org/eclipse/lsp/cobol/core/parser/DaCoParser.g4 b/server/dialect-daco/src/main/antlr4/org/eclipse/lsp/cobol/core/parser/DaCoParser.g4 index 7e5529af11..4ef6cd8c74 100644 --- a/server/dialect-daco/src/main/antlr4/org/eclipse/lsp/cobol/core/parser/DaCoParser.g4 +++ b/server/dialect-daco/src/main/antlr4/org/eclipse/lsp/cobol/core/parser/DaCoParser.g4 @@ -16,7 +16,19 @@ parser grammar DaCoParser; options {tokenVocab = DaCoLexer; superClass = MessageServiceParser;} startRule: .*? dacoRules* EOF; -dacoRules: dacoStatements .*?; +dacoRules: (dacoStatements | dacoSections) .*?; + +dacoSections + : dacoControlSection + ; + +dacoControlSection + : DACO_CONTROL SECTION DOT_FS dacoControlSectionParagraph + ; + +dacoControlSectionParagraph + : ROW BUFFER qualifiedDataName IS YES DOT_FS + ; dacoStatements : readTransactionStatement diff --git a/server/dialect-daco/src/main/java/org/eclipse/lsp/cobol/dialects/daco/DaCoVisitor.java b/server/dialect-daco/src/main/java/org/eclipse/lsp/cobol/dialects/daco/DaCoVisitor.java index 622bb397d4..6993ee4833 100644 --- a/server/dialect-daco/src/main/java/org/eclipse/lsp/cobol/dialects/daco/DaCoVisitor.java +++ b/server/dialect-daco/src/main/java/org/eclipse/lsp/cobol/dialects/daco/DaCoVisitor.java @@ -60,6 +60,12 @@ public List visitDacoStatements(DacoStatementsContext ctx) { return visitChildren(ctx); } + @Override + public List visitDacoSections(DaCoParser.DacoSectionsContext ctx) { + addReplacementContext(ctx); + return visitChildren(ctx); + } + @Override public List visitSortTableStatement(DaCoParser.SortTableStatementContext ctx) { return addTreeNode(ctx, SortTableNode::new); diff --git a/server/dialect-daco/src/test/java/org/eclipse/lsp/cobol/dialects/daco/usecases/TestDaCoControlSection.java b/server/dialect-daco/src/test/java/org/eclipse/lsp/cobol/dialects/daco/usecases/TestDaCoControlSection.java new file mode 100644 index 0000000000..ee89fa2c7c --- /dev/null +++ b/server/dialect-daco/src/test/java/org/eclipse/lsp/cobol/dialects/daco/usecases/TestDaCoControlSection.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2024 DAF Trucks NV. + * + * 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: + * DAF Trucks NV – implementation of DaCo COBOL statements + * and DAF development standards + */ +package org.eclipse.lsp.cobol.dialects.daco.usecases; + +import com.google.common.collect.ImmutableList; +import org.eclipse.lsp.cobol.common.error.ErrorSource; +import org.eclipse.lsp.cobol.dialects.daco.utils.DialectConfigs; +import org.eclipse.lsp.cobol.test.engine.UseCaseEngine; +import org.eclipse.lsp4j.Diagnostic; +import org.eclipse.lsp4j.DiagnosticSeverity; +import org.eclipse.lsp4j.Range; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.Map; + +/** A test case for DACO-CONTROL section statements */ +class TestDaCoControlSection { + private static final String TEXT = + " IDENTIFICATION DIVISION. \r\n" + + " PROGRAM-ID. test1. \r\n" + + " ENVIRONMENT DIVISION.\r\n" + + " DACO-CONTROL SECTION.\r\n" + + " ROW BUFFER {$TBLLAY-XW4} IS YES.\r\n" + // Negative test + + " DACO-CONTROL SECTION.\r\n" + + " ROW BUFFER {UNKVAR-XW4|1} IS YES.\r\n" + + " IDMS-CONTROL SECTION.\r\n" + + " PROTOCOL. MODE ABC.\r\n" + + " IDMS-RECORDS MANUAL\r\n" + + " DATA DIVISION. \r\n" + + " WORKING-STORAGE SECTION. \r\n" + + " 01 {$*WS-AREA}. \r\n" + + " 03 {$*AREA-XW4}. \r\n" + + " 05 {$*TBLLAY-XW4} PIC X(4) VALUE SPACE.\r\n" + + " PROCEDURE DIVISION. \r\n" + + " DISPLAY {$TBLLAY-XW4}. \r\n"; + + @Test + void test() { + + Map diagnosticMap = new HashMap<>(); + diagnosticMap.put( + "1", + new Diagnostic( + new Range(), + "Variable UNKVAR-XW4 is not defined", + DiagnosticSeverity.Error, + ErrorSource.PARSING.getText())); + UseCaseEngine.runTest( + TEXT, ImmutableList.of(), diagnosticMap, ImmutableList.of(), DialectConfigs.getDaCoAnalysisConfig()); + } +}