diff --git a/server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/CobolVisitor.java b/server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/CobolVisitor.java index b732d26af9..ba190a0761 100644 --- a/server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/CobolVisitor.java +++ b/server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/CobolVisitor.java @@ -66,6 +66,9 @@ import org.eclipse.lsp.cobol.core.CobolParser; import org.eclipse.lsp.cobol.core.CobolParserBaseVisitor; import org.eclipse.lsp.cobol.core.semantics.CopybooksRepository; +import org.eclipse.lsp.cobol.dialects.ibm.experimental.visitors.CobolDataDivisionVisitor; +import org.eclipse.lsp.cobol.dialects.ibm.experimental.visitors.CobolIdentificationDivisionVisitor; +import org.eclipse.lsp.cobol.dialects.ibm.experimental.visitors.CobolProcedureDivisionVisitor; import org.eclipse.lsp.cobol.service.settings.CachingConfigurationService; import org.eclipse.lsp.cobol.common.dialects.CobolProgramLayout; import org.eclipse.lsp4j.Location; diff --git a/server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/KeywordSuggestions.java b/server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/KeywordSuggestions.java index f4ccc045ae..2b9bfa6a42 100644 --- a/server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/KeywordSuggestions.java +++ b/server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/KeywordSuggestions.java @@ -26,7 +26,7 @@ /** This class provides keywords that are used for suggestions during the syntax check. */ @Slf4j -class KeywordSuggestions { +public class KeywordSuggestions { @Getter private Set suggestions; diff --git a/server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/MisspelledKeywordDistance.java b/server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/MisspelledKeywordDistance.java index 17230918b1..7316819e18 100644 --- a/server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/MisspelledKeywordDistance.java +++ b/server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/MisspelledKeywordDistance.java @@ -27,7 +27,7 @@ * Levenshtein algorithm. */ @UtilityClass -class MisspelledKeywordDistance { +public class MisspelledKeywordDistance { public static final KeywordSuggestions KEYWORDS = new KeywordSuggestions(); private static final LevenshteinDistance DISTANCE = LevenshteinDistance.getDefaultInstance(); @@ -38,7 +38,7 @@ class MisspelledKeywordDistance { * @param wrongToken - potentially misspelled token to check * @return the closest keyword or null if nothing found */ - Optional calculateDistance(String wrongToken) { + public Optional calculateDistance(String wrongToken) { return KEYWORDS.getSuggestions().stream() .map(item -> new Object[] {item, DISTANCE.apply(wrongToken, item)}) .sorted(comparingInt(o -> (int) o[1])) diff --git a/server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/VisitorHelper.java b/server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/VisitorHelper.java index 976afc5584..52baae5ebf 100644 --- a/server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/VisitorHelper.java +++ b/server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/VisitorHelper.java @@ -86,7 +86,7 @@ public static String getName(ParserRuleContext context) { * @param stop is end position * @return Locality with interval position */ - static Locality getIntervalPosition(Locality start, Locality stop) { + public static Locality getIntervalPosition(Locality start, Locality stop) { return Locality.builder() .uri(start.getUri()) .range(new Range(start.getRange().getStart(), stop.getRange().getEnd())) @@ -290,8 +290,8 @@ public static Range constructRange(ParserRuleContext ctx) { * @param children list of child nodes of the parser rule * @return a node for semantic analysis */ - static Function> constructNode( - Function nodeConstructor, List children) { + public static Function> constructNode( + Function nodeConstructor, List children) { return locality -> { Node node = nodeConstructor.apply(locality); children.forEach(node::addChild); diff --git a/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/TrueDialectServiceImpl.java b/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/TrueDialectServiceImpl.java index 873439f96a..78c5d62af0 100644 --- a/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/TrueDialectServiceImpl.java +++ b/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/TrueDialectServiceImpl.java @@ -31,6 +31,7 @@ import org.eclipse.lsp.cobol.dialects.hp.HpTrueCobolDialect; import org.eclipse.lsp.cobol.dialects.ibm.*; import org.eclipse.lsp.cobol.common.dialects.CobolLanguageId; +import org.eclipse.lsp.cobol.dialects.ibm.experimental.EnterpriseCobol64; import org.eclipse.lsp.cobol.service.settings.CachingConfigurationService; import org.eclipse.lsp.cobol.service.settings.layout.CodeLayoutStore; @@ -63,7 +64,7 @@ public TrueDialectServiceImpl( messageService, treeListener, subroutineService, cachingConfigurationService, dialectService, astProcessor, symbolsRepository, codeLayoutStore)); - dialects.put(CobolLanguageId.EXPERIMENTAL_COBOL, new HwIbmTrueCobolDialect(grammarPreprocessor, + dialects.put(CobolLanguageId.EXPERIMENTAL_COBOL, new EnterpriseCobol64(grammarPreprocessor, messageService, treeListener, subroutineService, cachingConfigurationService, dialectService, astProcessor, symbolsRepository, codeLayoutStore)); diff --git a/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/HwIbmTrueCobolDialect.java b/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/experimental/EnterpriseCobol64.java similarity index 74% rename from server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/HwIbmTrueCobolDialect.java rename to server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/experimental/EnterpriseCobol64.java index 1d565f47cf..9f75bf4da9 100644 --- a/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/HwIbmTrueCobolDialect.java +++ b/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/experimental/EnterpriseCobol64.java @@ -12,7 +12,7 @@ * Broadcom, Inc. - initial API and implementation * */ -package org.eclipse.lsp.cobol.dialects.ibm; +package org.eclipse.lsp.cobol.dialects.ibm.experimental; import org.antlr.v4.runtime.tree.ParseTreeListener; import org.eclipse.lsp.cobol.common.CleanerPreprocessor; @@ -25,26 +25,27 @@ import org.eclipse.lsp.cobol.core.engine.symbols.SymbolsRepository; import org.eclipse.lsp.cobol.core.preprocessor.delegates.GrammarPreprocessor; import org.eclipse.lsp.cobol.dialects.TrueCobolDialect; +import org.eclipse.lsp.cobol.dialects.ibm.*; import org.eclipse.lsp.cobol.service.settings.CachingConfigurationService; import org.eclipse.lsp.cobol.service.settings.layout.CodeLayoutStore; /** * HP Cobol Dialect */ -public class HwIbmTrueCobolDialect implements TrueCobolDialect { +public class EnterpriseCobol64 implements TrueCobolDialect { private final CleanerPreprocessor preprocessor; private final Pipeline pipeline; - public HwIbmTrueCobolDialect(GrammarPreprocessor grammarPreprocessor, - MessageService messageService, - ParseTreeListener treeListener, - SubroutineService subroutineService, - CachingConfigurationService cachingConfigurationService, - DialectService dialectService, - AstProcessor astProcessor, - SymbolsRepository symbolsRepository, - CodeLayoutStore codeLayoutStore) { + public EnterpriseCobol64(GrammarPreprocessor grammarPreprocessor, + MessageService messageService, + ParseTreeListener treeListener, + SubroutineService subroutineService, + CachingConfigurationService cachingConfigurationService, + DialectService dialectService, + AstProcessor astProcessor, + SymbolsRepository symbolsRepository, + CodeLayoutStore codeLayoutStore) { preprocessor = new IbmTextPreprocessor(messageService, codeLayoutStore); pipeline = new Pipeline<>(); @@ -54,7 +55,7 @@ public HwIbmTrueCobolDialect(GrammarPreprocessor grammarPreprocessor, pipeline.add(new DialectProcessingStage(dialectService, preprocessor)); pipeline.add(new PreprocessorStage(grammarPreprocessor, preprocessor)); pipeline.add(new ImplicitDialectProcessingStage(dialectService)); - pipeline.add(new HwParserStage(messageService, treeListener)); + pipeline.add(new ExperimentalParserStage(messageService, treeListener)); pipeline.add( new TransformTreeStage( symbolsRepository, diff --git a/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/HwParserStage.java b/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/experimental/ExperimentalParserStage.java similarity index 94% rename from server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/HwParserStage.java rename to server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/experimental/ExperimentalParserStage.java index fe00e21ef5..c232adcc8e 100644 --- a/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/HwParserStage.java +++ b/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/experimental/ExperimentalParserStage.java @@ -12,7 +12,7 @@ * Broadcom, Inc. - initial API and implementation * */ -package org.eclipse.lsp.cobol.dialects.ibm; +package org.eclipse.lsp.cobol.dialects.ibm.experimental; import com.google.common.collect.ImmutableList; import lombok.RequiredArgsConstructor; @@ -31,6 +31,7 @@ import org.eclipse.lsp.cobol.common.pipeline.Stage; import org.eclipse.lsp.cobol.core.strategy.CobolErrorStrategy; import org.eclipse.lsp.cobol.core.visitor.ParserListener; +import org.eclipse.lsp.cobol.dialects.ibm.ParserStageResult; import org.eclipse.lsp.cobol.parser.AstBuilder; import org.eclipse.lsp.cobol.parser.SplitParser; import org.eclipse.lsp4j.Location; @@ -42,7 +43,7 @@ * Parser stage */ @RequiredArgsConstructor -class HwParserStage implements Stage { +class ExperimentalParserStage implements Stage { private final MessageService messageService; private final ParseTreeListener treeListener; diff --git a/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/HwTransformTreeStage.java b/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/experimental/HwTransformTreeStage.java similarity index 89% rename from server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/HwTransformTreeStage.java rename to server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/experimental/HwTransformTreeStage.java index aad2415976..2a587d6b92 100644 --- a/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/HwTransformTreeStage.java +++ b/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/experimental/HwTransformTreeStage.java @@ -12,7 +12,7 @@ * Broadcom, Inc. - initial API and implementation * */ -package org.eclipse.lsp.cobol.dialects.ibm; +package org.eclipse.lsp.cobol.dialects.ibm.experimental; import org.antlr.v4.runtime.CommonTokenStream; import org.eclipse.lsp.cobol.common.SubroutineService; @@ -26,7 +26,10 @@ import org.eclipse.lsp.cobol.core.engine.processor.AstProcessor; import org.eclipse.lsp.cobol.core.engine.symbols.SymbolsRepository; import org.eclipse.lsp.cobol.core.semantics.CopybooksRepository; -import org.eclipse.lsp.cobol.core.visitor.HwCobolVisitor; +import org.eclipse.lsp.cobol.dialects.ibm.experimental.visitors.HwCobolVisitor; +import org.eclipse.lsp.cobol.dialects.ibm.ParserStageResult; +import org.eclipse.lsp.cobol.dialects.ibm.ProcessingResult; +import org.eclipse.lsp.cobol.dialects.ibm.TransformTreeStage; import org.eclipse.lsp.cobol.service.settings.CachingConfigurationService; import org.eclipse.lsp.cobol.service.settings.layout.CodeLayoutStore; import org.eclipse.lsp.cobol.service.settings.layout.CodeLayoutUtil; diff --git a/server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/CobolDataDivisionVisitor.java b/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/experimental/visitors/CobolDataDivisionVisitor.java similarity index 99% rename from server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/CobolDataDivisionVisitor.java rename to server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/experimental/visitors/CobolDataDivisionVisitor.java index 1c3aa542bf..934fd4caba 100644 --- a/server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/CobolDataDivisionVisitor.java +++ b/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/experimental/visitors/CobolDataDivisionVisitor.java @@ -12,7 +12,7 @@ * Broadcom, Inc. - initial API and implementation * */ -package org.eclipse.lsp.cobol.core.visitor; +package org.eclipse.lsp.cobol.dialects.ibm.experimental.visitors; import com.google.common.collect.ImmutableList; import lombok.Getter; @@ -39,6 +39,7 @@ import org.eclipse.lsp.cobol.core.CobolDataDivisionParserBaseVisitor; import org.eclipse.lsp.cobol.core.CobolParser; import org.eclipse.lsp.cobol.core.semantics.CopybooksRepository; +import org.eclipse.lsp.cobol.core.visitor.VisitorHelper; import org.eclipse.lsp4j.Location; import java.util.*; diff --git a/server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/CobolIdentificationDivisionVisitor.java b/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/experimental/visitors/CobolIdentificationDivisionVisitor.java similarity index 98% rename from server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/CobolIdentificationDivisionVisitor.java rename to server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/experimental/visitors/CobolIdentificationDivisionVisitor.java index f532b22e19..860e232be1 100644 --- a/server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/CobolIdentificationDivisionVisitor.java +++ b/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/experimental/visitors/CobolIdentificationDivisionVisitor.java @@ -12,7 +12,7 @@ * Broadcom, Inc. - initial API and implementation * */ -package org.eclipse.lsp.cobol.core.visitor; +package org.eclipse.lsp.cobol.dialects.ibm.experimental.visitors; import com.google.common.collect.ImmutableList; import lombok.Getter; diff --git a/server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/CobolProcedureDivisionVisitor.java b/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/experimental/visitors/CobolProcedureDivisionVisitor.java similarity index 99% rename from server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/CobolProcedureDivisionVisitor.java rename to server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/experimental/visitors/CobolProcedureDivisionVisitor.java index 4311b062ef..d24091ef4f 100644 --- a/server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/CobolProcedureDivisionVisitor.java +++ b/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/experimental/visitors/CobolProcedureDivisionVisitor.java @@ -13,7 +13,7 @@ * */ -package org.eclipse.lsp.cobol.core.visitor; +package org.eclipse.lsp.cobol.dialects.ibm.experimental.visitors; import com.google.common.collect.ImmutableList; import lombok.Getter; @@ -45,6 +45,8 @@ import org.eclipse.lsp.cobol.common.utils.StringUtils; import org.eclipse.lsp.cobol.core.*; import org.eclipse.lsp.cobol.core.semantics.CopybooksRepository; +import org.eclipse.lsp.cobol.core.visitor.MisspelledKeywordDistance; +import org.eclipse.lsp.cobol.core.visitor.VisitorHelper; import org.eclipse.lsp.cobol.service.settings.CachingConfigurationService; import org.eclipse.lsp.cobol.common.dialects.CobolProgramLayout; import org.eclipse.lsp4j.Location; diff --git a/server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/HwCobolProcedureDivisionVisitor.java b/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/experimental/visitors/HwCobolProcedureDivisionVisitor.java similarity index 96% rename from server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/HwCobolProcedureDivisionVisitor.java rename to server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/experimental/visitors/HwCobolProcedureDivisionVisitor.java index c023f19f35..f91ddffb14 100644 --- a/server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/HwCobolProcedureDivisionVisitor.java +++ b/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/experimental/visitors/HwCobolProcedureDivisionVisitor.java @@ -13,7 +13,7 @@ * */ -package org.eclipse.lsp.cobol.core.visitor; +package org.eclipse.lsp.cobol.dialects.ibm.experimental.visitors; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; diff --git a/server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/HwCobolVisitor.java b/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/experimental/visitors/HwCobolVisitor.java similarity index 96% rename from server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/HwCobolVisitor.java rename to server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/experimental/visitors/HwCobolVisitor.java index 83db03e161..727f5166aa 100644 --- a/server/engine/src/main/java/org/eclipse/lsp/cobol/core/visitor/HwCobolVisitor.java +++ b/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/experimental/visitors/HwCobolVisitor.java @@ -13,7 +13,7 @@ * */ -package org.eclipse.lsp.cobol.core.visitor; +package org.eclipse.lsp.cobol.dialects.ibm.experimental.visitors; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; @@ -26,6 +26,7 @@ import org.eclipse.lsp.cobol.common.model.tree.*; import org.eclipse.lsp.cobol.core.*; import org.eclipse.lsp.cobol.core.semantics.CopybooksRepository; +import org.eclipse.lsp.cobol.core.visitor.CobolVisitor; import org.eclipse.lsp.cobol.service.settings.CachingConfigurationService; import java.util.*; diff --git a/server/engine/src/test/java/org/eclipse/lsp/cobol/core/visitor/CobolDataDivisionVisitorTest.java b/server/engine/src/test/java/org/eclipse/lsp/cobol/core/visitor/CobolDataDivisionVisitorTest.java index 900469bd91..fba16b2537 100644 --- a/server/engine/src/test/java/org/eclipse/lsp/cobol/core/visitor/CobolDataDivisionVisitorTest.java +++ b/server/engine/src/test/java/org/eclipse/lsp/cobol/core/visitor/CobolDataDivisionVisitorTest.java @@ -25,6 +25,7 @@ import org.eclipse.lsp.cobol.core.CobolDataDivisionParser.*; import org.eclipse.lsp.cobol.core.CobolParser; import org.eclipse.lsp.cobol.core.semantics.CopybooksRepository; +import org.eclipse.lsp.cobol.dialects.ibm.experimental.visitors.CobolDataDivisionVisitor; import org.eclipse.lsp4j.Location; import org.eclipse.lsp4j.Position; import org.eclipse.lsp4j.Range; diff --git a/server/engine/src/test/java/org/eclipse/lsp/cobol/positive/PositiveTest.java b/server/engine/src/test/java/org/eclipse/lsp/cobol/positive/PositiveTest.java index 41c1dbcedf..7d0bf99f47 100644 --- a/server/engine/src/test/java/org/eclipse/lsp/cobol/positive/PositiveTest.java +++ b/server/engine/src/test/java/org/eclipse/lsp/cobol/positive/PositiveTest.java @@ -22,6 +22,7 @@ import static org.eclipse.lsp.cobol.positive.CobolTextRegistry.DEFAULT_LISTING_PATH; import static org.eclipse.lsp.cobol.positive.CobolTextRegistry.PATH_TO_LISTING_SNAP; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.parallel.ExecutionMode.CONCURRENT; import java.io.File; import java.nio.file.Files; @@ -47,6 +48,7 @@ import org.eclipse.lsp4j.DiagnosticSeverity; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.parallel.Execution; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -57,6 +59,7 @@ * regressions. The complete error description with the file name logged. */ @Slf4j +@Execution(CONCURRENT) class PositiveTest extends ConfigurableTest { private CobolTextRegistry cobolTextRegistry; diff --git a/server/parser/src/main/java/org/eclipse/lsp/cobol/cst/procedure/ProcedureDivision.java b/server/parser/src/main/java/org/eclipse/lsp/cobol/cst/procedure/ProcedureDivision.java index a95d0dc1d4..0410242b62 100644 --- a/server/parser/src/main/java/org/eclipse/lsp/cobol/cst/procedure/ProcedureDivision.java +++ b/server/parser/src/main/java/org/eclipse/lsp/cobol/cst/procedure/ProcedureDivision.java @@ -19,7 +19,7 @@ import lombok.Getter; import lombok.Setter; import org.eclipse.lsp.cobol.cst.base.CstNodeImpl; -import org.eclipse.lsp.cobol.parser.hw.Token; +import org.eclipse.lsp.cobol.parser.hw.lexer.Token; /** * ProcedureDivision node. diff --git a/server/parser/src/main/java/org/eclipse/lsp/cobol/cst/procedure/Section.java b/server/parser/src/main/java/org/eclipse/lsp/cobol/cst/procedure/Section.java index 70aa48557e..95f897644a 100644 --- a/server/parser/src/main/java/org/eclipse/lsp/cobol/cst/procedure/Section.java +++ b/server/parser/src/main/java/org/eclipse/lsp/cobol/cst/procedure/Section.java @@ -19,7 +19,7 @@ import lombok.Getter; import lombok.Setter; import org.eclipse.lsp.cobol.cst.base.CstNodeImpl; -import org.eclipse.lsp.cobol.parser.hw.Token; +import org.eclipse.lsp.cobol.parser.hw.lexer.Token; /** * Section node diff --git a/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/SplitParser.java b/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/SplitParser.java index 27d0e6ddf4..9fbe005d5a 100644 --- a/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/SplitParser.java +++ b/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/SplitParser.java @@ -27,7 +27,7 @@ import org.eclipse.lsp.cobol.core.CobolParser; import org.eclipse.lsp.cobol.cst.SourceUnit; import org.eclipse.lsp.cobol.parser.hw.ParserSettings; -import org.eclipse.lsp.cobol.parser.hw.CobolLexer; +import org.eclipse.lsp.cobol.parser.hw.lexer.CobolLexer; import org.eclipse.lsp.cobol.parser.hw.antlradapter.AntlrAdapter; import org.eclipse.lsp.cobol.parser.hw.Diagnostic; import org.eclipse.lsp.cobol.parser.hw.ParseResult; diff --git a/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/CobolParser.java b/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/CobolParser.java index e0373431a2..c890750738 100644 --- a/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/CobolParser.java +++ b/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/CobolParser.java @@ -16,6 +16,7 @@ import lombok.extern.slf4j.Slf4j; import org.eclipse.lsp.cobol.cst.*; +import org.eclipse.lsp.cobol.parser.hw.lexer.CobolLexer; import org.eclipse.lsp.cobol.rules.CobolLanguage; import org.eclipse.lsp.cobol.rules.SourceUnitRule; diff --git a/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/ParsingContext.java b/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/ParsingContext.java index c0f73aad05..5c1e07dc64 100644 --- a/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/ParsingContext.java +++ b/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/ParsingContext.java @@ -19,6 +19,9 @@ import lombok.Getter; import org.apache.commons.text.similarity.JaroWinklerSimilarity; import org.eclipse.lsp.cobol.cst.base.CstNode; +import org.eclipse.lsp.cobol.parser.hw.lexer.CobolLexer; +import org.eclipse.lsp.cobol.parser.hw.lexer.Token; +import org.eclipse.lsp.cobol.parser.hw.lexer.TokenType; import org.eclipse.lsp4j.Position; import org.eclipse.lsp4j.Range; diff --git a/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/antlradapter/AntlrAdapter.java b/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/antlradapter/AntlrAdapter.java index 29c6ec11b5..5d2d3abc28 100644 --- a/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/antlradapter/AntlrAdapter.java +++ b/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/antlradapter/AntlrAdapter.java @@ -25,15 +25,13 @@ import org.eclipse.lsp.cobol.cst.base.CstNode; import org.eclipse.lsp.cobol.cst.*; import org.eclipse.lsp.cobol.cst.procedure.ProcedureDivision; -import org.eclipse.lsp.cobol.parser.hw.TokenType; +import org.eclipse.lsp.cobol.parser.hw.lexer.TokenType; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; -/** - * Reconstruct the AST - */ +/** Reconstruct the AST */ public class AntlrAdapter { public static final int INT = 6; private final BaseErrorListener errorListener; @@ -41,7 +39,10 @@ public class AntlrAdapter { private final ParseTreeListener treeListener; private CharStream charStream; - public AntlrAdapter(BaseErrorListener errorListener, DefaultErrorStrategy errorStrategy, ParseTreeListener treeListener) { + public AntlrAdapter( + BaseErrorListener errorListener, + DefaultErrorStrategy errorStrategy, + ParseTreeListener treeListener) { this.errorListener = errorListener; this.errorStrategy = errorStrategy; this.treeListener = treeListener; @@ -61,8 +62,9 @@ public CobolParser.StartRuleContext sourceUnitToStartRule(SourceUnit su) { return startRuleContext; } - private static CobolParser.ProgramUnitContext replaceWithAntlr(ProgramUnit p, CobolParser.ProgramUnitContext result) { - org.eclipse.lsp.cobol.parser.hw.Token token = Utils.findStartToken(p).get(); + private static CobolParser.ProgramUnitContext replaceWithAntlr( + ProgramUnit p, CobolParser.ProgramUnitContext result) { + org.eclipse.lsp.cobol.parser.hw.lexer.Token token = Utils.findStartToken(p).get(); int startLine = token.getLine(); int startPos = token.getStartPositionInLine(); char[] chars = p.toText().toCharArray(); @@ -71,15 +73,24 @@ private static CobolParser.ProgramUnitContext replaceWithAntlr(ProgramUnit p, Co chars[i] = ' '; } } - String lexeme = new String(chars); p.getChildren().clear(); AntlrAdapted antlr = new AntlrAdapted(result); - antlr.getChildren().add(new org.eclipse.lsp.cobol.parser.hw.Token(lexeme, startLine, startPos, token.getIndex(), TokenType.WHITESPACE)); + antlr + .getChildren() + .add( + new org.eclipse.lsp.cobol.parser.hw.lexer.Token( + startLine, + startPos, + token.getIndexStart(), + token.getIndexStop(), + TokenType.WHITESPACE, + token.getSource())); p.getChildren().add(antlr); return result; } - private void traversePrograms(CstNode node, Function processor) { + private void traversePrograms( + CstNode node, Function processor) { node.getChildren().forEach(s -> traversePrograms(s, processor)); if (node instanceof ProgramUnit) { processor.apply((ProgramUnit) node); @@ -91,7 +102,8 @@ private CobolParser.StartRuleContext convertSourceUnit(SourceUnit cstNode) { start.children = new ArrayList<>(); start.start = Utils.toAntlrToken(Utils.findStartToken(cstNode, true).get(), charStream); start.stop = Utils.toAntlrToken(Utils.findStopToken(cstNode, true).get(), charStream); - CobolParser.CompilationUnitContext compilationUnit = new CobolParser.CompilationUnitContext(start, 0); + CobolParser.CompilationUnitContext compilationUnit = + new CobolParser.CompilationUnitContext(start, 0); Utils.initNode(cstNode, compilationUnit, charStream); start.addChild(compilationUnit); processChildNodes(cstNode, compilationUnit); @@ -102,15 +114,22 @@ private CobolParser.ProgramUnitContext convertProgramNode(CstNode programUnit) { CobolParser.ProgramUnitContext program = new CobolParser.ProgramUnitContext(null, 0); Utils.initNode(programUnit, program, charStream); processChildNodes(programUnit, program); - Optional> endProgramName = getEndProgramName(programUnit); + Optional> endProgramName = + getEndProgramName(programUnit); if (endProgramName.isPresent()) { - CobolParser.EndProgramStatementContext endProgramStatementContext = new CobolParser.EndProgramStatementContext(program, 0); - endProgramStatementContext.start = Utils.toAntlrToken(Utils.findStartToken(programUnit).get(), charStream); - endProgramStatementContext.stop = Utils.toAntlrToken(Utils.findStopToken(programUnit).get(), charStream); - CobolParser.ProgramNameContext nameContext = new CobolParser.ProgramNameContext(endProgramStatementContext, 0); - org.eclipse.lsp.cobol.parser.hw.Token nameToken = endProgramName.get().get(0); + CobolParser.EndProgramStatementContext endProgramStatementContext = + new CobolParser.EndProgramStatementContext(program, 0); + endProgramStatementContext.start = + Utils.toAntlrToken(Utils.findStartToken(programUnit).get(), charStream); + endProgramStatementContext.stop = + Utils.toAntlrToken(Utils.findStopToken(programUnit).get(), charStream); + CobolParser.ProgramNameContext nameContext = + new CobolParser.ProgramNameContext(endProgramStatementContext, 0); + org.eclipse.lsp.cobol.parser.hw.lexer.Token nameToken = endProgramName.get().get(0); nameContext.start = Utils.toAntlrToken(nameToken, charStream); - nameContext.stop = Utils.toAntlrToken((endProgramName.get().get(endProgramName.get().size() - 1)), charStream); + nameContext.stop = + Utils.toAntlrToken( + (endProgramName.get().get(endProgramName.get().size() - 1)), charStream); endProgramStatementContext.children = new ArrayList<>(); endProgramStatementContext.children.add(nameContext); nameContext.addChild(new TerminalNodeImpl(Utils.toAntlrToken(nameToken, charStream))); @@ -124,23 +143,25 @@ private ParserRuleContext convertNode(CstNode cstNode) { // All programs should be adapted to this point return ((AntlrAdapted) cstNode.getChildren().get(0)).getRuleContext(); } else if (cstNode instanceof DataDivision) { - CobolDataDivisionParser.DataDivisionContext dataDivisionContext = antlrDataDivisionParser(cstNode).dataDivision(); + CobolDataDivisionParser.DataDivisionContext dataDivisionContext = + antlrDataDivisionParser(cstNode).dataDivision(); Utils.removeEofNode(dataDivisionContext); return dataDivisionContext; } else if (cstNode instanceof IdentificationDivision) { - CobolIdentificationDivisionParser.IdentificationDivisionContext identificationDivisionContext = antlrIdDivisionParser(cstNode).identificationDivision(); + CobolIdentificationDivisionParser.IdentificationDivisionContext + identificationDivisionContext = antlrIdDivisionParser(cstNode).identificationDivision(); Utils.removeEofNode(identificationDivisionContext); return identificationDivisionContext; } else if (cstNode instanceof EnvironmentDivision) { - CobolParser.EnvironmentDivisionContext environmentDivisionContext = antlrParser(cstNode).environmentDivision(); + CobolParser.EnvironmentDivisionContext environmentDivisionContext = + antlrParser(cstNode).environmentDivision(); Utils.removeEofNode(environmentDivisionContext); return environmentDivisionContext; } else if (cstNode instanceof ProcedureDivision) { - ProcedureDivisionAntlrAdapter adapter = new ProcedureDivisionAntlrAdapter(charStream, - errorListener, - errorStrategy, - treeListener); - CobolProcedureDivisionParser.ProcedureDivisionContext procedureDivisionContext = adapter.processProcedureDivisionContext((ProcedureDivision) cstNode); + ProcedureDivisionAntlrAdapter adapter = + new ProcedureDivisionAntlrAdapter(charStream, errorListener, errorStrategy, treeListener); + CobolProcedureDivisionParser.ProcedureDivisionContext procedureDivisionContext = + adapter.processProcedureDivisionContext((ProcedureDivision) cstNode); Utils.removeEofNode(procedureDivisionContext); return procedureDivisionContext; } else { @@ -160,9 +181,10 @@ void processChildNodes(CstNode cstNode, ParserRuleContext parent) { } private CobolIdentificationDivisionParser antlrIdDivisionParser(CstNode node) { - org.eclipse.lsp.cobol.parser.hw.Token startToken = Utils.findStartToken(node).get(); + org.eclipse.lsp.cobol.parser.hw.lexer.Token startToken = Utils.findStartToken(node).get(); String input = Utils.generatePrefix(charStream, startToken) + node.toText(); - CobolIdentificationDivisionLexer antlrLexer = new CobolIdentificationDivisionLexer(CharStreams.fromString(input)); + CobolIdentificationDivisionLexer antlrLexer = + new CobolIdentificationDivisionLexer(CharStreams.fromString(input)); antlrLexer.removeErrorListeners(); antlrLexer.addErrorListener(errorListener); CommonTokenStream tokens = new CommonTokenStream(antlrLexer); @@ -174,7 +196,7 @@ private CobolIdentificationDivisionParser antlrIdDivisionParser(CstNode node) { } private CobolDataDivisionParser antlrDataDivisionParser(CstNode node) { - org.eclipse.lsp.cobol.parser.hw.Token startToken = Utils.findStartToken(node).get(); + org.eclipse.lsp.cobol.parser.hw.lexer.Token startToken = Utils.findStartToken(node).get(); String input = Utils.generatePrefix(charStream, startToken) + node.toText(); CobolDataDivisionLexer antlrLexer = new CobolDataDivisionLexer(CharStreams.fromString(input)); antlrLexer.removeErrorListeners(); @@ -189,13 +211,15 @@ private CobolDataDivisionParser antlrDataDivisionParser(CstNode node) { } private CobolParser antlrParser(CstNode node) { - org.eclipse.lsp.cobol.parser.hw.Token startToken = Utils.findStartToken(node).get(); + org.eclipse.lsp.cobol.parser.hw.lexer.Token startToken = Utils.findStartToken(node).get(); String input = Utils.generatePrefix(charStream, startToken) + node.toText(); - org.eclipse.lsp.cobol.core.CobolLexer antlrLexer = new org.eclipse.lsp.cobol.core.CobolLexer(CharStreams.fromString(input)); + org.eclipse.lsp.cobol.core.CobolLexer antlrLexer = + new org.eclipse.lsp.cobol.core.CobolLexer(CharStreams.fromString(input)); antlrLexer.removeErrorListeners(); antlrLexer.addErrorListener(errorListener); CommonTokenStream tokens = new CommonTokenStream(antlrLexer); - org.eclipse.lsp.cobol.core.CobolParser antlrParser = new org.eclipse.lsp.cobol.core.CobolParser(tokens); + org.eclipse.lsp.cobol.core.CobolParser antlrParser = + new org.eclipse.lsp.cobol.core.CobolParser(tokens); antlrParser.removeErrorListeners(); antlrParser.addErrorListener(errorListener); antlrParser.setErrorHandler(errorStrategy); @@ -212,15 +236,19 @@ private CobolParser antlrParser(CstNode node) { public CommonTokenStream adaptTokens(SourceUnit su) { List tokens = new ArrayList<>(); collectTokens(su, tokens); - CommonTokenStream commonTokenStream = new CommonTokenStream(new ListTokenSource(tokens.stream() - .map(org.eclipse.lsp.cobol.parser.hw.Token.class::cast) - .map(token -> Utils.toAntlrToken(token, charStream)).collect(Collectors.toList()))); + CommonTokenStream commonTokenStream = + new CommonTokenStream( + new ListTokenSource( + tokens.stream() + .map(org.eclipse.lsp.cobol.parser.hw.lexer.Token.class::cast) + .map(token -> Utils.toAntlrToken(token, charStream)) + .collect(Collectors.toList()))); commonTokenStream.fill(); return commonTokenStream; } private void collectTokens(CstNode su, List result) { - if (su instanceof org.eclipse.lsp.cobol.parser.hw.Token) { + if (su instanceof org.eclipse.lsp.cobol.parser.hw.lexer.Token) { result.add(su); } for (CstNode node : su.getChildren()) { @@ -228,25 +256,27 @@ private void collectTokens(CstNode su, List result) { } } - static Optional> getEndProgramName(CstNode cstNode) { - List result = new ArrayList<>(); + static Optional> getEndProgramName( + CstNode cstNode) { + List result = new ArrayList<>(); if (!(cstNode instanceof ProgramUnit)) { return Optional.empty(); } boolean nextName = false; int skip = 1; for (CstNode n : cstNode.getChildren()) { - if (!(n instanceof org.eclipse.lsp.cobol.parser.hw.Token) || ((org.eclipse.lsp.cobol.parser.hw.Token) n).getType() == TokenType.WHITESPACE) { + if (!(n instanceof org.eclipse.lsp.cobol.parser.hw.lexer.Token) + || ((org.eclipse.lsp.cobol.parser.hw.lexer.Token) n).getType() == TokenType.WHITESPACE) { continue; } if (nextName) { if (skip == 0) { - result.add((org.eclipse.lsp.cobol.parser.hw.Token) n); + result.add((org.eclipse.lsp.cobol.parser.hw.lexer.Token) n); } else { skip--; } } - if ("END".equalsIgnoreCase(((org.eclipse.lsp.cobol.parser.hw.Token) n).getLexeme())) { + if ("END".equalsIgnoreCase(((org.eclipse.lsp.cobol.parser.hw.lexer.Token) n).getLexeme())) { nextName = true; } } diff --git a/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/antlradapter/ProcedureDivisionAntlrAdapter.java b/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/antlradapter/ProcedureDivisionAntlrAdapter.java index 19406881c7..e742985937 100644 --- a/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/antlradapter/ProcedureDivisionAntlrAdapter.java +++ b/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/antlradapter/ProcedureDivisionAntlrAdapter.java @@ -25,6 +25,7 @@ import org.eclipse.lsp.cobol.core.CobolProcedureDivisionParser.*; import org.eclipse.lsp.cobol.cst.base.CstNode; import org.eclipse.lsp.cobol.cst.procedure.*; +import org.eclipse.lsp.cobol.parser.hw.lexer.Token; import java.util.ArrayList; import java.util.LinkedList; @@ -87,7 +88,7 @@ private ProcedureDivisionBodyContext createProcedureDivisionBodyContext(Procedur for (int idx = 0; idx < nodes.size(); idx++) { CstNode node = nodes.get(idx); - if (node instanceof org.eclipse.lsp.cobol.parser.hw.Token) { + if (node instanceof Token) { continue; } @@ -125,7 +126,7 @@ private Optional findChild(ProcedureDivisionContext pdCtx, Class e } private void handleDeclaratives(LinkedList genStack, Declaratives node) { - org.eclipse.lsp.cobol.parser.hw.Token startToken = Utils.findStartToken(node).get(); + Token startToken = Utils.findStartToken(node).get(); String input = Utils.generatePrefix(charStream, startToken) + node.toText(); CobolProcedureDivisionLexer antlrLexer = new CobolProcedureDivisionLexer(CharStreams.fromString(input)); @@ -162,14 +163,14 @@ private void handleParagraphNode(LinkedList genStack, CstNode genStack.push(context); genStack.peek().children = new ArrayList<>(); genStack.peek().start = Utils.toAntlrToken(Utils.findStartToken(node).get(), charStream); - org.eclipse.lsp.cobol.parser.hw.Token name = (org.eclipse.lsp.cobol.parser.hw.Token) node.getChildren().get(0); + Token name = (Token) node.getChildren().get(0); ParagraphDefinitionNameContext paragraphDefinitionNameContext = Utils.initNode(name, new ParagraphDefinitionNameContext(null, 0), charStream); TerminalNodeImpl nameTN = new TerminalNodeImpl(Utils.toAntlrToken(name, charStream)); paragraphDefinitionNameContext.addChild(nameTN); paragraphDefinitionNameContext.setParent(genStack.peek()); genStack.peek().addChild(paragraphDefinitionNameContext); - TerminalNodeImpl terminalNode = new TerminalNodeImpl(Utils.toAntlrToken((org.eclipse.lsp.cobol.parser.hw.Token) node.getChildren().get(dotIdx(node.getChildren())), charStream)); + TerminalNodeImpl terminalNode = new TerminalNodeImpl(Utils.toAntlrToken((Token) node.getChildren().get(dotIdx(node.getChildren())), charStream)); lastToken = (CommonToken) terminalNode.getSymbol(); genStack.peek().addChild(terminalNode); } @@ -184,9 +185,9 @@ private void handleSectionNode(LinkedList genStack, CstNode n if (genStack.peek() instanceof ProcedureSectionContext) { genStack.pop().stop = lastToken; } - org.eclipse.lsp.cobol.parser.hw.Token name = (org.eclipse.lsp.cobol.parser.hw.Token) node.getChildren().get(0); - org.eclipse.lsp.cobol.parser.hw.Token section = (org.eclipse.lsp.cobol.parser.hw.Token) node.getChildren().get(2); - org.eclipse.lsp.cobol.parser.hw.Token dot = (org.eclipse.lsp.cobol.parser.hw.Token) node.getChildren().get(3); + Token name = (Token) node.getChildren().get(0); + Token section = (Token) node.getChildren().get(2); + Token dot = (Token) node.getChildren().get(3); ProcedureSectionContext sectionContext = Utils.initNode(node, new ProcedureSectionContext(genStack.peek(), 0), charStream); @@ -209,7 +210,7 @@ private void handleSectionNode(LinkedList genStack, CstNode n } private ParserRuleContext parseSentence(Statement node) { - org.eclipse.lsp.cobol.parser.hw.Token startToken = Utils.findStartToken(node).get(); + Token startToken = Utils.findStartToken(node).get(); String input = Utils.generatePrefix(charStream, startToken) + node.toText(); CobolProcedureDivisionLexer antlrLexer = new CobolProcedureDivisionLexer(CharStreams.fromString(input)); @@ -247,7 +248,7 @@ private ProcedureDivisionContext parseProcedureDivision(ProcedureDivision node) return antlrParser.procedureDivision(); } - private boolean hasToken(CstNode node, org.eclipse.lsp.cobol.parser.hw.Token token) { + private boolean hasToken(CstNode node, Token token) { if (node.equals(token)) { return true; } @@ -259,7 +260,7 @@ private boolean hasToken(CstNode node, org.eclipse.lsp.cobol.parser.hw.Token tok return false; } - private ProcedureSectionHeaderContext createSectionHeader(CstNode node, org.eclipse.lsp.cobol.parser.hw.Token name, org.eclipse.lsp.cobol.parser.hw.Token section) { + private ProcedureSectionHeaderContext createSectionHeader(CstNode node, Token name, Token section) { ProcedureSectionHeaderContext headerContext = new ProcedureSectionHeaderContext(null, 0); headerContext.start = Utils.findStartToken(node).map(token -> Utils.toAntlrToken(token, charStream)).orElse(null); headerContext.stop = Utils.findStopToken(node, true).map(token -> Utils.toAntlrToken(token, charStream)).orElse(null); diff --git a/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/antlradapter/Utils.java b/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/antlradapter/Utils.java index 539504e70b..abf10a28b7 100644 --- a/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/antlradapter/Utils.java +++ b/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/antlradapter/Utils.java @@ -25,8 +25,8 @@ import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.TerminalNodeImpl; import org.eclipse.lsp.cobol.cst.base.CstNode; -import org.eclipse.lsp.cobol.parser.hw.Token; -import org.eclipse.lsp.cobol.parser.hw.TokenType; +import org.eclipse.lsp.cobol.parser.hw.lexer.Token; +import org.eclipse.lsp.cobol.parser.hw.lexer.TokenType; import java.util.ArrayList; import java.util.List; @@ -56,8 +56,8 @@ public static CommonToken toAntlrToken(Token token, CharStream charStream) { source, 0, channel, - token.getIndex(), - token.getIndex() + token.getLexeme().length() - 1); + token.getIndexStart(), + token.getIndexStop() - 1); commonToken.setLine(token.getLine() + 1); commonToken.setCharPositionInLine(token.getStartPositionInLine()); commonToken.setText(token.toText()); @@ -207,7 +207,7 @@ public static Optional lastToken(List cstNodes, boolean ignoreWh } static String generatePrefix(CharStream charStream, Token startToken) { - String prefix = charStream.getText(Interval.of(0, startToken.getIndex() - 1)); + String prefix = charStream.getText(Interval.of(0, startToken.getIndexStart() - 1)); char[] chars = prefix.toCharArray(); for (int i = 0; i < chars.length; i++) { chars[i] = chars[i] != '\n' ? ' ' : '\n'; diff --git a/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/CobolLexer.java b/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/lexer/CobolLexer.java similarity index 64% rename from server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/CobolLexer.java rename to server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/lexer/CobolLexer.java index 90ad9d9450..c2a0b5a8e1 100644 --- a/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/CobolLexer.java +++ b/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/lexer/CobolLexer.java @@ -14,9 +14,10 @@ * and DAF development standards * */ -package org.eclipse.lsp.cobol.parser.hw; +package org.eclipse.lsp.cobol.parser.hw.lexer; import lombok.Data; +import org.eclipse.lsp.cobol.parser.hw.GrammarRule; import java.util.ArrayList; import java.util.Collections; @@ -24,13 +25,13 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Predicate; -/** - * COBOL language lexer. - */ +/** COBOL language lexer. */ public class CobolLexer { private final String source; private Position position = new Position(); private Position lastTokenStartPosition = new Position(); + private List tokens = new ArrayList<>(); + private int tokenIndex = 0; public CobolLexer(String source) { this.source = source; @@ -53,10 +54,24 @@ public boolean hasMore() { */ public List forward(GrammarRule rule) { if (position.getIndex() == source.length()) { - return Collections.singletonList(new Token("", position.getLine(), position.getCharacter(), position.getIndex(), TokenType.EOF)); + return Collections.singletonList( + new Token( + position.getLine(), + position.getCharacter(), + position.getIndex(), + position.getIndex(), + TokenType.EOF, + source)); } - String lexeme = scan(rule, false); - Token token = new Token(lexeme, lastTokenStartPosition.getLine(), lastTokenStartPosition.getCharacter(), position.getIndex() - lexeme.length(), detectType(rule, lexeme)); + String lexeme = scan(false); + Token token = + new Token( + lastTokenStartPosition.getLine(), + lastTokenStartPosition.getCharacter(), + position.getIndex() - lexeme.length(), + position.getIndex(), + detectType(rule, lexeme), + source); return Collections.singletonList(token); } @@ -68,10 +83,24 @@ public List forward(GrammarRule rule) { */ public List peek(GrammarRule rule) { if (position.getIndex() == source.length()) { - return Collections.singletonList(new Token("", position.getLine(), position.getCharacter(), position.getIndex(), TokenType.EOF)); + return Collections.singletonList( + new Token( + position.getLine(), + position.getCharacter(), + position.getIndex(), + position.getIndex(), + TokenType.EOF, + source)); } - String lexeme = scan(rule, true); - Token token = new Token(lexeme, lastTokenStartPosition.getLine(), position.getCharacter(), position.getIndex(), detectType(rule, lexeme)); + String lexeme = scan(true); + Token token = + new Token( + lastTokenStartPosition.getLine(), + position.getCharacter(), + position.getIndex(), + position.getIndex() + lexeme.length(), + detectType(rule, lexeme), + source); return Collections.singletonList(token); } @@ -82,7 +111,7 @@ private TokenType detectType(GrammarRule rule, String lexeme) { return null; } - private String scan(GrammarRule rule, boolean look) { + private String scan(boolean look) { if (isWhitespace(source.charAt(position.getIndex()))) { return consumeUntil(c -> !isWhitespace(source.charAt(c.getIndex())), look); } @@ -95,9 +124,13 @@ private String scan(GrammarRule rule, boolean look) { if (isLiteral(source.charAt(position.getIndex()))) { return processLiteral(source, look); } - return consumeUntil(c -> isSeparator(source.charAt(c.getIndex())) - || isWhitespace(source.charAt(c.getIndex())) - || isNewLine(source.charAt(c.getIndex())), look); + // TODO: number support + return consumeUntil( + c -> + isSeparator(source.charAt(c.getIndex())) + || isWhitespace(source.charAt(c.getIndex())) + || isNewLine(source.charAt(c.getIndex())), + look); } private String processLiteral(String source, boolean look) { @@ -110,32 +143,36 @@ private String processLiteral(String source, boolean look) { AtomicBoolean wasEscaped = new AtomicBoolean(false); - return consumeUntil(pos -> { - if (isFirst.get()) { - isFirst.set(false); - return false; - } - if (pos.getIndex() + 1 < source.length() && source.charAt(pos.getIndex()) == quoteSymbol && source.charAt(pos.getIndex() + 1) == quoteSymbol) { - wasEscaped.set(true); - return false; - } - if (wasEscaped.get()) { - wasEscaped.set(false); - return false; - } - if (isLast.get()) { - return true; - } - if (source.charAt(pos.getIndex()) != quoteSymbol) { - return false; - } + return consumeUntil( + pos -> { + if (isFirst.get()) { + isFirst.set(false); + return false; + } + if (pos.getIndex() + 1 < source.length() + && source.charAt(pos.getIndex()) == quoteSymbol + && source.charAt(pos.getIndex() + 1) == quoteSymbol) { + wasEscaped.set(true); + return false; + } + if (wasEscaped.get()) { + wasEscaped.set(false); + return false; + } + if (isLast.get()) { + return true; + } + if (source.charAt(pos.getIndex()) != quoteSymbol) { + return false; + } - if (source.charAt(pos.getIndex()) == quoteSymbol) { - isLast.set(true); - return false; - } - return true; - }, look); + if (source.charAt(pos.getIndex()) == quoteSymbol) { + isLast.set(true); + return false; + } + return true; + }, + look); } private String consumeUntil(Predicate predicate, boolean look) { @@ -175,9 +212,9 @@ private boolean isNewLine(char c) { /** * Find a sequence of tokens ignoring one that passes skip predicate. * - * @param rule current syntax rule. + * @param rule current syntax rule. * @param count how many tokens to take. - * @param skip predicate to ignore tokens. + * @param skip predicate to ignore tokens. * @return a list of tokens. */ // TODO: it should return a list of lists @@ -196,9 +233,7 @@ public List peekSeq(GrammarRule rule, int count, Predicate skip) { } } -/** - * A class to hold position data - */ +/** A class to hold position data */ @Data class Position { int index = 0; @@ -211,8 +246,7 @@ class Position { character = position.character; } - Position() { - } + Position() {} void updateLinePosition(char charAt) { index++; diff --git a/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/Token.java b/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/lexer/Token.java similarity index 55% rename from server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/Token.java rename to server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/lexer/Token.java index 3f867ee0e3..509a33dd5d 100644 --- a/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/Token.java +++ b/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/lexer/Token.java @@ -10,11 +10,8 @@ * * Contributors: * Broadcom, Inc. - initial API and implementation - * DAF Trucks NV – implementation of DaCo COBOL statements - * and DAF development standards - * */ -package org.eclipse.lsp.cobol.parser.hw; +package org.eclipse.lsp.cobol.parser.hw.lexer; import lombok.Getter; import org.eclipse.lsp.cobol.cst.base.CstNodeImpl; @@ -29,15 +26,17 @@ public class Token extends CstNodeImpl { public static final int PRIME = 31; private final int line; private final int startPositionInLine; - private final int index; - private final String lexeme; + private final int indexStart; + private final int indexStop; + private final String source; private final TokenType type; - public Token(String lexeme, int line, int startPositionInLine, int index, TokenType type) { + public Token(int line, int startPositionInLine, int indexStart, int indexStop, TokenType type, String source) { this.line = line; - this.lexeme = lexeme; + this.source = source; this.startPositionInLine = startPositionInLine; - this.index = index; + this.indexStart = indexStart; + this.indexStop = indexStop; this.type = type; } @@ -46,12 +45,12 @@ public Token(String lexeme, int line, int startPositionInLine, int index, TokenT * @return size of lexeme */ public int length() { - return lexeme.length(); + return indexStop - indexStart + 1; } @Override public String toText() { - return lexeme; + return source.substring(indexStart, indexStop); } @Override @@ -60,29 +59,36 @@ public String toString() { + "line=" + line + ", startPositionInLine=" + startPositionInLine - + ", lexeme='" + lexeme + '\'' - + ", index=" + index + // TODO: escape string? + + ", lexeme='" + toText().replace("\n", "\\n") + '\'' + + ", index=[" + indexStart + ", " + indexStop + "]" + ", type=" + type + '}'; } + public String getLexeme() { + // TODO: a good place for optimization maybe? + return toText(); + } + /* FIXME: Lexer should not create new instances of tokens even if it's a peek call */ @Override - public final boolean equals(Object o) { + public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof Token)) return false; + if (o == null || getClass() != o.getClass()) return false; Token token = (Token) o; - return line == token.line && startPositionInLine == token.startPositionInLine && index == token.index && Objects.equals(lexeme, token.lexeme) && type == token.type; + return line == token.line && startPositionInLine == token.startPositionInLine && indexStart == token.indexStart && indexStop == token.indexStop && Objects.equals(source, token.source) && type == token.type; } @Override public int hashCode() { int result = line; - result = PRIME * result + startPositionInLine; - result = PRIME * result + index; - result = PRIME * result + Objects.hashCode(lexeme); - result = PRIME * result + Objects.hashCode(type); + result = 31 * result + startPositionInLine; + result = 31 * result + indexStart; + result = 31 * result + indexStop; + result = 31 * result + Objects.hashCode(source); + result = 31 * result + Objects.hashCode(type); return result; } } diff --git a/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/lexer/TokenScanner.java b/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/lexer/TokenScanner.java new file mode 100644 index 0000000000..7f6d9e5b55 --- /dev/null +++ b/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/lexer/TokenScanner.java @@ -0,0 +1,136 @@ +/* + * 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.parser.hw.lexer; + +import lombok.Data; + +import java.util.Optional; + +/** Class helps to group characters into tokens (TODO: it will be part of the lexer) */ +public class TokenScanner { + private final String source; + private final Position currentPosition = new Position(); + + public TokenScanner(String source) { + this.source = source; + } + + private Optional peek() { + return currentPosition.index + 1 < source.length() + ? Optional.of(source.charAt(currentPosition.index + 1)) + : Optional.empty(); + } + + private Character forward() { + return currentPosition.forward(); + } + + /** + * Produces the next token. + * + * @return the next token. + */ + public Token next() { + if (currentPosition.index == source.length()) { + return currentPosition.produceToken(TokenType.EOF); + } + Position start = new Position(currentPosition); + switch (at()) { + case '\'': + case '"': + // TBD STRING_LITERAL + return null; + case '\n': + forward(); + if (at() != null && at() == '\r') { + forward(); + } + return start.produceToken(TokenType.NEW_LINE); + case ' ': + do { + forward(); + } while (isWhitespace(at())); + return start.produceToken(TokenType.WHITESPACE); + default: + do { + forward(); + } while (!isTerminal(at())); + return start.produceToken(null); + } + } + + private Character at() { + if (currentPosition.index == source.length()) { + return null; + } + return source.charAt(currentPosition.index); + } + + private boolean isTerminal(Character character) { + if (character == null) { + return true; + } + return isWhitespace(character) || isSeparator(character); + } + + private boolean isSeparator(char c) { + return c == '.'; + } + + private boolean isLiteral(Character c) { + return c == '"' || c == '\''; + } + + private boolean isWhitespace(Character c) { + if (c == null) { + return false; + } + return c == ' ' || c == '\t'; + } + + private boolean isNewLine(Character c) { + return c == '\n' || c == '\r'; + } + + /** A class to hold position data */ + @Data + class Position { + int index = 0; + int line = 0; + int character = 0; + + Position(Position position) { + index = position.index; + line = position.line; + character = position.character; + } + + Position() {} + + Token produceToken(TokenType type) { + return new Token(line, character, index, currentPosition.index, type, source); + } + + Character forward() { + if (source.charAt(index) == '\n') { + line++; + character = 0; + } else if (source.charAt(index) != '\r') { + character++; + } + index++; + return source.charAt(index - 1); + } + } +} diff --git a/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/TokenType.java b/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/lexer/TokenType.java similarity index 90% rename from server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/TokenType.java rename to server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/lexer/TokenType.java index ff601bf6a6..883d35e1d2 100644 --- a/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/TokenType.java +++ b/server/parser/src/main/java/org/eclipse/lsp/cobol/parser/hw/lexer/TokenType.java @@ -14,13 +14,14 @@ * and DAF development standards * */ -package org.eclipse.lsp.cobol.parser.hw; +package org.eclipse.lsp.cobol.parser.hw.lexer; /** * Token types. */ public enum TokenType { WHITESPACE, + STRING_LITERAL, NEW_LINE, EOF } diff --git a/server/parser/src/main/java/org/eclipse/lsp/cobol/rules/CobolLanguageUtils.java b/server/parser/src/main/java/org/eclipse/lsp/cobol/rules/CobolLanguageUtils.java index 31b5152fc3..f69866f09d 100644 --- a/server/parser/src/main/java/org/eclipse/lsp/cobol/rules/CobolLanguageUtils.java +++ b/server/parser/src/main/java/org/eclipse/lsp/cobol/rules/CobolLanguageUtils.java @@ -18,8 +18,8 @@ import org.eclipse.lsp.cobol.cst.Skipped; import org.eclipse.lsp.cobol.cst.base.CstNode; import org.eclipse.lsp.cobol.parser.hw.ParsingContext; -import org.eclipse.lsp.cobol.parser.hw.Token; -import org.eclipse.lsp.cobol.parser.hw.TokenType; +import org.eclipse.lsp.cobol.parser.hw.lexer.Token; +import org.eclipse.lsp.cobol.parser.hw.lexer.TokenType; /** diff --git a/server/parser/src/main/java/org/eclipse/lsp/cobol/rules/ProgramRule.java b/server/parser/src/main/java/org/eclipse/lsp/cobol/rules/ProgramRule.java index bd06db0b13..12f83da743 100644 --- a/server/parser/src/main/java/org/eclipse/lsp/cobol/rules/ProgramRule.java +++ b/server/parser/src/main/java/org/eclipse/lsp/cobol/rules/ProgramRule.java @@ -18,7 +18,7 @@ import org.eclipse.lsp.cobol.cst.ProgramUnit; import org.eclipse.lsp.cobol.parser.hw.GrammarRule; import org.eclipse.lsp.cobol.parser.hw.ParsingContext; -import org.eclipse.lsp.cobol.parser.hw.Token; +import org.eclipse.lsp.cobol.parser.hw.lexer.Token; import org.eclipse.lsp.cobol.rules.data.DataDivisionRule; import org.eclipse.lsp.cobol.rules.environment.EnvironmentDivisionRule; import org.eclipse.lsp.cobol.rules.procedure.ProcedureDivisionRule; diff --git a/server/parser/src/main/java/org/eclipse/lsp/cobol/rules/SourceUnitRule.java b/server/parser/src/main/java/org/eclipse/lsp/cobol/rules/SourceUnitRule.java index 7dd8a319f0..20339dfbcc 100644 --- a/server/parser/src/main/java/org/eclipse/lsp/cobol/rules/SourceUnitRule.java +++ b/server/parser/src/main/java/org/eclipse/lsp/cobol/rules/SourceUnitRule.java @@ -16,6 +16,9 @@ import org.eclipse.lsp.cobol.cst.SourceUnit; import org.eclipse.lsp.cobol.parser.hw.*; +import org.eclipse.lsp.cobol.parser.hw.lexer.CobolLexer; +import org.eclipse.lsp.cobol.parser.hw.lexer.Token; +import org.eclipse.lsp.cobol.parser.hw.lexer.TokenType; import java.util.Objects; diff --git a/server/parser/src/main/java/org/eclipse/lsp/cobol/rules/procedure/ParagraphRule.java b/server/parser/src/main/java/org/eclipse/lsp/cobol/rules/procedure/ParagraphRule.java index 2a02cf2274..c4e43c298a 100644 --- a/server/parser/src/main/java/org/eclipse/lsp/cobol/rules/procedure/ParagraphRule.java +++ b/server/parser/src/main/java/org/eclipse/lsp/cobol/rules/procedure/ParagraphRule.java @@ -16,7 +16,7 @@ import org.eclipse.lsp.cobol.cst.procedure.Paragraph; import org.eclipse.lsp.cobol.parser.hw.ParsingContext; -import org.eclipse.lsp.cobol.parser.hw.Token; +import org.eclipse.lsp.cobol.parser.hw.lexer.Token; import org.eclipse.lsp.cobol.rules.CobolLanguage; import org.eclipse.lsp.cobol.rules.CobolLanguageUtils; import org.eclipse.lsp.cobol.rules.LanguageRule; @@ -29,7 +29,7 @@ public class ParagraphRule implements LanguageRule { public void parse(ParsingContext ctx, CobolLanguage language) { ctx.spaces(); ctx.push(new Paragraph()); - ((Paragraph) ctx.peek()).setName(ctx.consume().get(0).getLexeme()); + ((Paragraph) ctx.peek()).setName(ctx.consume().get(0).toText()); ctx.spaces(); ctx.consume("."); try { diff --git a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/EndNotTheEndTest.java b/server/parser/src/test/java/org/eclipse/lsp/cobol/EndNotTheEndTest.java similarity index 94% rename from server/parser/src/test/java/org/eclipse/lsp/cobol/core/EndNotTheEndTest.java rename to server/parser/src/test/java/org/eclipse/lsp/cobol/EndNotTheEndTest.java index 02b661bdd2..09e6f56440 100644 --- a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/EndNotTheEndTest.java +++ b/server/parser/src/test/java/org/eclipse/lsp/cobol/EndNotTheEndTest.java @@ -14,9 +14,9 @@ * and DAF development standards * */ -package org.eclipse.lsp.cobol.core; +package org.eclipse.lsp.cobol; -import org.eclipse.lsp.cobol.parser.hw.CobolLexer; +import org.eclipse.lsp.cobol.parser.hw.lexer.CobolLexer; import org.eclipse.lsp.cobol.parser.hw.CobolParser; import org.eclipse.lsp.cobol.parser.hw.ParseResult; import org.eclipse.lsp.cobol.parser.hw.ParserSettings; diff --git a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/GenerativePerformanceTest.java b/server/parser/src/test/java/org/eclipse/lsp/cobol/GenerativePerformanceTest.java similarity index 96% rename from server/parser/src/test/java/org/eclipse/lsp/cobol/core/GenerativePerformanceTest.java rename to server/parser/src/test/java/org/eclipse/lsp/cobol/GenerativePerformanceTest.java index 8191cf40e4..2020368865 100644 --- a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/GenerativePerformanceTest.java +++ b/server/parser/src/test/java/org/eclipse/lsp/cobol/GenerativePerformanceTest.java @@ -11,10 +11,10 @@ * Contributors: * Broadcom, Inc. - initial API and implementation */ -package org.eclipse.lsp.cobol.core; +package org.eclipse.lsp.cobol; import org.eclipse.lsp.cobol.codegen.CobolCodeGenerator; -import org.eclipse.lsp.cobol.parser.hw.CobolLexer; +import org.eclipse.lsp.cobol.parser.hw.lexer.CobolLexer; import org.eclipse.lsp.cobol.parser.hw.CobolParser; import org.eclipse.lsp.cobol.parser.hw.ParserSettings; import org.eclipse.lsp.cobol.codegen.GeneratorSettings; diff --git a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/HwCobolParserTest.java b/server/parser/src/test/java/org/eclipse/lsp/cobol/HwCobolParserTest.java similarity index 98% rename from server/parser/src/test/java/org/eclipse/lsp/cobol/core/HwCobolParserTest.java rename to server/parser/src/test/java/org/eclipse/lsp/cobol/HwCobolParserTest.java index c72065ba5e..56cbbce485 100644 --- a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/HwCobolParserTest.java +++ b/server/parser/src/test/java/org/eclipse/lsp/cobol/HwCobolParserTest.java @@ -14,11 +14,11 @@ * and DAF development standards * */ -package org.eclipse.lsp.cobol.core; +package org.eclipse.lsp.cobol; import org.eclipse.lsp.cobol.cst.ProgramUnit; import org.eclipse.lsp.cobol.cst.SourceUnit; -import org.eclipse.lsp.cobol.parser.hw.CobolLexer; +import org.eclipse.lsp.cobol.parser.hw.lexer.CobolLexer; import org.eclipse.lsp.cobol.parser.hw.CobolParser; import static org.junit.jupiter.api.Assertions.*; diff --git a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/HwDivisionsTest.java b/server/parser/src/test/java/org/eclipse/lsp/cobol/HwDivisionsTest.java similarity index 98% rename from server/parser/src/test/java/org/eclipse/lsp/cobol/core/HwDivisionsTest.java rename to server/parser/src/test/java/org/eclipse/lsp/cobol/HwDivisionsTest.java index f760ae76ba..a9224ba5aa 100644 --- a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/HwDivisionsTest.java +++ b/server/parser/src/test/java/org/eclipse/lsp/cobol/HwDivisionsTest.java @@ -14,11 +14,11 @@ * and DAF development standards * */ -package org.eclipse.lsp.cobol.core; +package org.eclipse.lsp.cobol; import org.eclipse.lsp.cobol.cst.*; import org.eclipse.lsp.cobol.cst.procedure.ProcedureDivision; -import org.eclipse.lsp.cobol.parser.hw.CobolLexer; +import org.eclipse.lsp.cobol.parser.hw.lexer.CobolLexer; import org.eclipse.lsp.cobol.parser.hw.CobolParser; import org.eclipse.lsp.cobol.parser.hw.ParserSettings; import org.junit.jupiter.api.Test; diff --git a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/HwParserErrorTest.java b/server/parser/src/test/java/org/eclipse/lsp/cobol/HwParserErrorTest.java similarity index 95% rename from server/parser/src/test/java/org/eclipse/lsp/cobol/core/HwParserErrorTest.java rename to server/parser/src/test/java/org/eclipse/lsp/cobol/HwParserErrorTest.java index ac296ee979..6a5cc87473 100644 --- a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/HwParserErrorTest.java +++ b/server/parser/src/test/java/org/eclipse/lsp/cobol/HwParserErrorTest.java @@ -14,10 +14,10 @@ * and DAF development standards * */ -package org.eclipse.lsp.cobol.core; +package org.eclipse.lsp.cobol; import org.eclipse.lsp.cobol.cst.SourceUnit; -import org.eclipse.lsp.cobol.parser.hw.CobolLexer; +import org.eclipse.lsp.cobol.parser.hw.lexer.CobolLexer; import org.eclipse.lsp.cobol.parser.hw.CobolParser; import org.eclipse.lsp.cobol.parser.hw.ParseResult; import org.eclipse.lsp.cobol.parser.hw.ParserSettings; diff --git a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/divisions/IdentificationDivisionTests.java b/server/parser/src/test/java/org/eclipse/lsp/cobol/divisions/IdentificationDivisionTests.java similarity index 93% rename from server/parser/src/test/java/org/eclipse/lsp/cobol/core/divisions/IdentificationDivisionTests.java rename to server/parser/src/test/java/org/eclipse/lsp/cobol/divisions/IdentificationDivisionTests.java index eb6ee14b37..8615cd1c0e 100644 --- a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/divisions/IdentificationDivisionTests.java +++ b/server/parser/src/test/java/org/eclipse/lsp/cobol/divisions/IdentificationDivisionTests.java @@ -14,9 +14,9 @@ * and DAF development standards * */ -package org.eclipse.lsp.cobol.core.divisions; +package org.eclipse.lsp.cobol.divisions; -import org.eclipse.lsp.cobol.parser.hw.CobolLexer; +import org.eclipse.lsp.cobol.parser.hw.lexer.CobolLexer; import org.eclipse.lsp.cobol.parser.hw.CobolParser; import org.eclipse.lsp.cobol.parser.hw.ParseResult; import org.eclipse.lsp.cobol.parser.hw.ParserSettings; diff --git a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/divisions/procedure/BrokenTest.java b/server/parser/src/test/java/org/eclipse/lsp/cobol/divisions/procedure/BrokenTest.java similarity index 95% rename from server/parser/src/test/java/org/eclipse/lsp/cobol/core/divisions/procedure/BrokenTest.java rename to server/parser/src/test/java/org/eclipse/lsp/cobol/divisions/procedure/BrokenTest.java index f805351e10..6c06490d34 100644 --- a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/divisions/procedure/BrokenTest.java +++ b/server/parser/src/test/java/org/eclipse/lsp/cobol/divisions/procedure/BrokenTest.java @@ -14,12 +14,12 @@ * and DAF development standards * */ -package org.eclipse.lsp.cobol.core.divisions.procedure; +package org.eclipse.lsp.cobol.divisions.procedure; import org.eclipse.lsp.cobol.cst.ProgramUnit; import org.eclipse.lsp.cobol.cst.procedure.ProcedureDivision; import org.eclipse.lsp.cobol.cst.procedure.Section; -import org.eclipse.lsp.cobol.parser.hw.CobolLexer; +import org.eclipse.lsp.cobol.parser.hw.lexer.CobolLexer; import org.eclipse.lsp.cobol.parser.hw.CobolParser; import org.eclipse.lsp.cobol.parser.hw.ParseResult; import org.eclipse.lsp.cobol.parser.hw.ParserSettings; diff --git a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/divisions/procedure/DeclarativesTest.java b/server/parser/src/test/java/org/eclipse/lsp/cobol/divisions/procedure/DeclarativesTest.java similarity index 94% rename from server/parser/src/test/java/org/eclipse/lsp/cobol/core/divisions/procedure/DeclarativesTest.java rename to server/parser/src/test/java/org/eclipse/lsp/cobol/divisions/procedure/DeclarativesTest.java index 8af3ae5d22..7056fa3ace 100644 --- a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/divisions/procedure/DeclarativesTest.java +++ b/server/parser/src/test/java/org/eclipse/lsp/cobol/divisions/procedure/DeclarativesTest.java @@ -14,12 +14,12 @@ * and DAF development standards * */ -package org.eclipse.lsp.cobol.core.divisions.procedure; +package org.eclipse.lsp.cobol.divisions.procedure; import org.eclipse.lsp.cobol.cst.ProgramUnit; import org.eclipse.lsp.cobol.cst.procedure.Declaratives; import org.eclipse.lsp.cobol.cst.procedure.ProcedureDivision; -import org.eclipse.lsp.cobol.parser.hw.CobolLexer; +import org.eclipse.lsp.cobol.parser.hw.lexer.CobolLexer; import org.eclipse.lsp.cobol.parser.hw.CobolParser; import org.eclipse.lsp.cobol.parser.hw.ParseResult; import org.eclipse.lsp.cobol.parser.hw.ParserSettings; diff --git a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/divisions/procedure/EndProgramTest.java b/server/parser/src/test/java/org/eclipse/lsp/cobol/divisions/procedure/EndProgramTest.java similarity index 95% rename from server/parser/src/test/java/org/eclipse/lsp/cobol/core/divisions/procedure/EndProgramTest.java rename to server/parser/src/test/java/org/eclipse/lsp/cobol/divisions/procedure/EndProgramTest.java index 93266c03e1..cd08e12526 100644 --- a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/divisions/procedure/EndProgramTest.java +++ b/server/parser/src/test/java/org/eclipse/lsp/cobol/divisions/procedure/EndProgramTest.java @@ -14,13 +14,13 @@ * and DAF development standards * */ -package org.eclipse.lsp.cobol.core.divisions.procedure; +package org.eclipse.lsp.cobol.divisions.procedure; import org.eclipse.lsp.cobol.cst.ProgramUnit; import org.eclipse.lsp.cobol.cst.procedure.Paragraph; import org.eclipse.lsp.cobol.cst.procedure.ProcedureDivision; import org.eclipse.lsp.cobol.cst.procedure.Statement; -import org.eclipse.lsp.cobol.parser.hw.CobolLexer; +import org.eclipse.lsp.cobol.parser.hw.lexer.CobolLexer; import org.eclipse.lsp.cobol.parser.hw.CobolParser; import org.eclipse.lsp.cobol.parser.hw.ParseResult; import org.eclipse.lsp.cobol.parser.hw.ParserSettings; diff --git a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/divisions/procedure/ParagraphTest.java b/server/parser/src/test/java/org/eclipse/lsp/cobol/divisions/procedure/ParagraphTest.java similarity index 94% rename from server/parser/src/test/java/org/eclipse/lsp/cobol/core/divisions/procedure/ParagraphTest.java rename to server/parser/src/test/java/org/eclipse/lsp/cobol/divisions/procedure/ParagraphTest.java index 7285cb157e..53e005589b 100644 --- a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/divisions/procedure/ParagraphTest.java +++ b/server/parser/src/test/java/org/eclipse/lsp/cobol/divisions/procedure/ParagraphTest.java @@ -14,12 +14,12 @@ * and DAF development standards * */ -package org.eclipse.lsp.cobol.core.divisions.procedure; +package org.eclipse.lsp.cobol.divisions.procedure; import org.eclipse.lsp.cobol.cst.procedure.Paragraph; import org.eclipse.lsp.cobol.cst.procedure.ProcedureDivision; import org.eclipse.lsp.cobol.cst.ProgramUnit; -import org.eclipse.lsp.cobol.parser.hw.CobolLexer; +import org.eclipse.lsp.cobol.parser.hw.lexer.CobolLexer; import org.eclipse.lsp.cobol.parser.hw.CobolParser; import org.eclipse.lsp.cobol.parser.hw.ParseResult; import org.eclipse.lsp.cobol.parser.hw.ParserSettings; diff --git a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/divisions/procedure/ProcedureDivisionWithVariablesTest.java b/server/parser/src/test/java/org/eclipse/lsp/cobol/divisions/procedure/ProcedureDivisionWithVariablesTest.java similarity index 92% rename from server/parser/src/test/java/org/eclipse/lsp/cobol/core/divisions/procedure/ProcedureDivisionWithVariablesTest.java rename to server/parser/src/test/java/org/eclipse/lsp/cobol/divisions/procedure/ProcedureDivisionWithVariablesTest.java index a1b686a564..dcc16d5f04 100644 --- a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/divisions/procedure/ProcedureDivisionWithVariablesTest.java +++ b/server/parser/src/test/java/org/eclipse/lsp/cobol/divisions/procedure/ProcedureDivisionWithVariablesTest.java @@ -12,9 +12,9 @@ * Broadcom, Inc. - initial API and implementation * */ -package org.eclipse.lsp.cobol.core.divisions.procedure; +package org.eclipse.lsp.cobol.divisions.procedure; -import org.eclipse.lsp.cobol.parser.hw.CobolLexer; +import org.eclipse.lsp.cobol.parser.hw.lexer.CobolLexer; import org.eclipse.lsp.cobol.parser.hw.CobolParser; import org.eclipse.lsp.cobol.parser.hw.ParseResult; import org.eclipse.lsp.cobol.parser.hw.ParserSettings; diff --git a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/divisions/procedure/SectionTest.java b/server/parser/src/test/java/org/eclipse/lsp/cobol/divisions/procedure/SectionTest.java similarity index 95% rename from server/parser/src/test/java/org/eclipse/lsp/cobol/core/divisions/procedure/SectionTest.java rename to server/parser/src/test/java/org/eclipse/lsp/cobol/divisions/procedure/SectionTest.java index ff9c750eb2..ce4010ae60 100644 --- a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/divisions/procedure/SectionTest.java +++ b/server/parser/src/test/java/org/eclipse/lsp/cobol/divisions/procedure/SectionTest.java @@ -14,13 +14,13 @@ * and DAF development standards * */ -package org.eclipse.lsp.cobol.core.divisions.procedure; +package org.eclipse.lsp.cobol.divisions.procedure; import org.eclipse.lsp.cobol.cst.ProgramUnit; import org.eclipse.lsp.cobol.cst.procedure.Paragraph; import org.eclipse.lsp.cobol.cst.procedure.ProcedureDivision; import org.eclipse.lsp.cobol.cst.procedure.Section; -import org.eclipse.lsp.cobol.parser.hw.CobolLexer; +import org.eclipse.lsp.cobol.parser.hw.lexer.CobolLexer; import org.eclipse.lsp.cobol.parser.hw.CobolParser; import org.eclipse.lsp.cobol.parser.hw.ParseResult; import org.eclipse.lsp.cobol.parser.hw.ParserSettings; diff --git a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/HwCobolLexerTest.java b/server/parser/src/test/java/org/eclipse/lsp/cobol/lexer/HwCobolLexerTest.java similarity index 83% rename from server/parser/src/test/java/org/eclipse/lsp/cobol/core/HwCobolLexerTest.java rename to server/parser/src/test/java/org/eclipse/lsp/cobol/lexer/HwCobolLexerTest.java index d7d05ff438..cb310ad840 100644 --- a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/HwCobolLexerTest.java +++ b/server/parser/src/test/java/org/eclipse/lsp/cobol/lexer/HwCobolLexerTest.java @@ -10,19 +10,16 @@ * * Contributors: * Broadcom, Inc. - initial API and implementation - * DAF Trucks NV – implementation of DaCo COBOL statements - * and DAF development standards - * */ -package org.eclipse.lsp.cobol.core; +package org.eclipse.lsp.cobol.lexer; -import org.eclipse.lsp.cobol.parser.hw.CobolLexer; +import org.eclipse.lsp.cobol.parser.hw.lexer.CobolLexer; import static org.junit.jupiter.api.Assertions.*; import org.eclipse.lsp.cobol.parser.hw.GrammarRule; -import org.eclipse.lsp.cobol.parser.hw.Token; import org.junit.jupiter.api.Test; +import static org.eclipse.lsp.cobol.lexer.LexerTestUtils.*; /** * test hw lexer @@ -102,15 +99,4 @@ void peekTest() { assertToken(lexer.forward(GrammarRule.ProgramUnit).get(0), "\n", 0, 2, 2); assertToken(lexer.peek(GrammarRule.ProgramUnit).get(0), " ", 0, 0, 3); } - - private static void assertToken(Token token, String lexeme, int line, int charPos, int index) { - assertEquals(lexeme, token.getLexeme(), "lexeme"); - assertEquals(line, token.getLine(), "line"); - assertEquals(charPos, token.getStartPositionInLine(), "char in line position"); - assertEquals(index, token.getIndex(), "index"); - } - - private static String tokenContent(CobolLexer lexer) { - return lexer.forward(GrammarRule.ProgramUnit).get(0).getLexeme(); - } } diff --git a/server/parser/src/test/java/org/eclipse/lsp/cobol/lexer/LexerTestUtils.java b/server/parser/src/test/java/org/eclipse/lsp/cobol/lexer/LexerTestUtils.java new file mode 100644 index 0000000000..6db5bd77bc --- /dev/null +++ b/server/parser/src/test/java/org/eclipse/lsp/cobol/lexer/LexerTestUtils.java @@ -0,0 +1,54 @@ +/* + * 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.lexer; + +import org.eclipse.lsp.cobol.parser.hw.lexer.CobolLexer; +import org.eclipse.lsp.cobol.parser.hw.GrammarRule; +import org.eclipse.lsp.cobol.parser.hw.lexer.Token; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** Utilities for lexer tests */ +public final class LexerTestUtils { + private LexerTestUtils() { + // no-op + } + + /** + * Assert a token + * + * @param token the token + * @param lexeme token text + * @param line token line + * @param charPos token position in line + * @param index token position in source + */ + public static void assertToken(Token token, String lexeme, int line, int charPos, int index) { + assertEquals(lexeme, token.getLexeme(), "lexeme"); + assertEquals(line, token.getLine(), "line"); + assertEquals(charPos, token.getStartPositionInLine(), "char in line position"); + assertEquals(index, token.getIndexStart(), "indexStart"); + assertEquals(index + lexeme.length(), token.getIndexStop(), "indexStop"); + } + + /** + * Get token text + * + * @param lexer a lexer + * @return a text + */ + public static String tokenContent(CobolLexer lexer) { + return lexer.forward(GrammarRule.ProgramUnit).get(0).getLexeme(); + } +} diff --git a/server/parser/src/test/java/org/eclipse/lsp/cobol/lexer/NumericLiteralsTest.java b/server/parser/src/test/java/org/eclipse/lsp/cobol/lexer/NumericLiteralsTest.java new file mode 100644 index 0000000000..01ea44d755 --- /dev/null +++ b/server/parser/src/test/java/org/eclipse/lsp/cobol/lexer/NumericLiteralsTest.java @@ -0,0 +1,69 @@ +/* + * 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.lexer; + +import org.eclipse.lsp.cobol.parser.hw.lexer.CobolLexer; +import org.eclipse.lsp.cobol.parser.hw.GrammarRule; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; + +import static org.eclipse.lsp.cobol.lexer.LexerTestUtils.assertToken; +import static org.junit.jupiter.api.Assertions.assertFalse; + +/** + * Test numeric literals tokenization + */ +class NumericLiteralsTest { + // https://www.ibm.com/docs/en/cobol-zos/6.4?topic=literals-numeric + + @ParameterizedTest(name = "[{index}] test {0}") + @MethodSource("numbers") + @Disabled("Not implemented yet") + void floatingNumber(String token) { + CobolLexer lexer = new CobolLexer(token); + assertToken(lexer.forward(GrammarRule.ProgramUnit).get(0), token, 0, 0, 0); + assertFalse(lexer.hasMore()); + } + + public static Stream numbers() { + return Stream.of( + Arguments.of("1"), + Arguments.of("+1"), + Arguments.of("-1"), + Arguments.of("12"), + Arguments.of("+12"), + Arguments.of("-12"), + Arguments.of("12.01"), + Arguments.of("+12.01"), + Arguments.of("-12.01"), + Arguments.of("12.01E-78"), + Arguments.of("+12.01E-78"), + Arguments.of("-12.01E-78"), + Arguments.of("12.01E+8"), + Arguments.of("+12.01E+78"), + Arguments.of("-12.01E+78"), + Arguments.of("12E+8"), + Arguments.of("+1E+78"), + Arguments.of("-11E+78"), + Arguments.of(".12E+8"), + Arguments.of("+.1E+78"), + Arguments.of("-.11E+78") + + ); + } +} diff --git a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/migration/CompositionTest.java b/server/parser/src/test/java/org/eclipse/lsp/cobol/migration/CompositionTest.java similarity index 97% rename from server/parser/src/test/java/org/eclipse/lsp/cobol/core/migration/CompositionTest.java rename to server/parser/src/test/java/org/eclipse/lsp/cobol/migration/CompositionTest.java index a8ed5447c7..cedeef85f4 100644 --- a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/migration/CompositionTest.java +++ b/server/parser/src/test/java/org/eclipse/lsp/cobol/migration/CompositionTest.java @@ -14,7 +14,7 @@ * and DAF development standards * */ -package org.eclipse.lsp.cobol.core.migration; +package org.eclipse.lsp.cobol.migration; import org.antlr.v4.runtime.*; import org.antlr.v4.runtime.tree.ParseTree; @@ -22,7 +22,7 @@ import org.eclipse.lsp.cobol.cst.SourceUnit; import org.eclipse.lsp.cobol.parser.hw.ParserSettings; import org.eclipse.lsp.cobol.parser.hw.antlradapter.AntlrAdapter; -import org.eclipse.lsp.cobol.parser.hw.CobolLexer; +import org.eclipse.lsp.cobol.parser.hw.lexer.CobolLexer; import org.eclipse.lsp.cobol.parser.hw.CobolParser; import org.junit.jupiter.api.Test; diff --git a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/migration/ElementsOrderTest.java b/server/parser/src/test/java/org/eclipse/lsp/cobol/migration/ElementsOrderTest.java similarity index 89% rename from server/parser/src/test/java/org/eclipse/lsp/cobol/core/migration/ElementsOrderTest.java rename to server/parser/src/test/java/org/eclipse/lsp/cobol/migration/ElementsOrderTest.java index 1c626300ac..809c04df01 100644 --- a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/migration/ElementsOrderTest.java +++ b/server/parser/src/test/java/org/eclipse/lsp/cobol/migration/ElementsOrderTest.java @@ -14,7 +14,7 @@ * and DAF development standards * */ -package org.eclipse.lsp.cobol.core.migration; +package org.eclipse.lsp.cobol.migration; import org.antlr.v4.runtime.BaseErrorListener; import org.antlr.v4.runtime.DefaultErrorStrategy; @@ -23,15 +23,13 @@ import org.eclipse.lsp.cobol.cst.ProgramUnit; import org.eclipse.lsp.cobol.cst.SourceUnit; import org.eclipse.lsp.cobol.cst.procedure.Paragraph; -import org.eclipse.lsp.cobol.parser.hw.CobolLexer; +import org.eclipse.lsp.cobol.parser.hw.lexer.CobolLexer; import org.eclipse.lsp.cobol.parser.hw.CobolParser; import org.eclipse.lsp.cobol.parser.hw.ParserSettings; import org.eclipse.lsp.cobol.parser.hw.antlradapter.AntlrAdapter; import org.junit.jupiter.api.Test; -import static org.eclipse.lsp.cobol.core.migration.SectionCompositionTest.antlrParse; -import static org.eclipse.lsp.cobol.core.migration.Utils.compareAll; -import static org.eclipse.lsp.cobol.core.migration.Utils.compareStartStopPositions; +import static org.eclipse.lsp.cobol.migration.SectionCompositionTest.antlrParse; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mock; @@ -71,7 +69,7 @@ void case4() { ParseTree antlrPdc = antlr.getChild(0).getChild(0).getChild(1); ParseTree migratedPdc = migrated.getChild(0).getChild(0).getChild(1); - compareAll(antlrPdc, migratedPdc); + Utils.compareAll(antlrPdc, migratedPdc); ParseTree antlrP1 = antlrPdc.getChild(3).getChild(0).getChild(2); ParseTree antlrP2 = antlrPdc.getChild(3).getChild(0).getChild(3); @@ -79,8 +77,8 @@ void case4() { ParseTree migratedP2 = migratedPdc.getChild(3).getChild(0).getChild(3); assertEquals(antlrP1.getChildCount(), migratedP1.getChildCount()); assertEquals(antlrP2.getChildCount(), migratedP2.getChildCount()); - compareStartStopPositions(antlrP1, migratedP1); - compareStartStopPositions(antlrP2, migratedP2); + Utils.compareStartStopPositions(antlrP1, migratedP1); + Utils.compareStartStopPositions(antlrP2, migratedP2); } @Test @@ -120,8 +118,8 @@ void case5() { ParseTree antlr2 = antlrPdc.getChild(3).getChild(2); ParseTree migrated1 = migratedPdc.getChild(3).getChild(1); ParseTree migrated2 = migratedPdc.getChild(3).getChild(2); - compareStartStopPositions(antlr1, migrated1); - compareStartStopPositions(antlr2, migrated2); + Utils.compareStartStopPositions(antlr1, migrated1); + Utils.compareStartStopPositions(antlr2, migrated2); assertEquals(antlr1.getChildCount(), migrated1.getChildCount()); assertEquals(antlr2.getChildCount(), migrated2.getChildCount()); } diff --git a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/migration/SectionCompositionTest.java b/server/parser/src/test/java/org/eclipse/lsp/cobol/migration/SectionCompositionTest.java similarity index 93% rename from server/parser/src/test/java/org/eclipse/lsp/cobol/core/migration/SectionCompositionTest.java rename to server/parser/src/test/java/org/eclipse/lsp/cobol/migration/SectionCompositionTest.java index 8f664d4711..f4c46cd526 100644 --- a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/migration/SectionCompositionTest.java +++ b/server/parser/src/test/java/org/eclipse/lsp/cobol/migration/SectionCompositionTest.java @@ -14,20 +14,19 @@ * and DAF development standards * */ -package org.eclipse.lsp.cobol.core.migration; +package org.eclipse.lsp.cobol.migration; import org.antlr.v4.runtime.*; import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.ParseTreeListener; import org.eclipse.lsp.cobol.cst.SourceUnit; -import org.eclipse.lsp.cobol.parser.hw.CobolLexer; +import org.eclipse.lsp.cobol.parser.hw.lexer.CobolLexer; import org.eclipse.lsp.cobol.parser.hw.CobolParser; import org.eclipse.lsp.cobol.parser.hw.ParseResult; import org.eclipse.lsp.cobol.parser.hw.ParserSettings; import org.eclipse.lsp.cobol.parser.hw.antlradapter.AntlrAdapter; import org.junit.jupiter.api.Test; -import static org.eclipse.lsp.cobol.core.migration.Utils.*; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mock; @@ -75,9 +74,9 @@ void test() { assertEquals(antlrPdb.getChild(0).getChildCount(), migratedPdb.getChild(0).getChildCount()); - compareStartStopPositions(antlrPdb.getChild(0), migratedPdb.getChild(0)); - compareStartStopPositions(antlrPdb.getChild(1), migratedPdb.getChild(1)); - compareStartStopPositions(antlrPdb.getChild(2), migratedPdb.getChild(2)); + Utils.compareStartStopPositions(antlrPdb.getChild(0), migratedPdb.getChild(0)); + Utils.compareStartStopPositions(antlrPdb.getChild(1), migratedPdb.getChild(1)); + Utils.compareStartStopPositions(antlrPdb.getChild(2), migratedPdb.getChild(2)); } @Test @@ -106,13 +105,13 @@ void testParagraphSection2() { ParseTree antlrPd = antlr.getChild(0).getChild(0).getChild(1); ParseTree migratedPd = migrated.getChild(0).getChild(0).getChild(1); assertEquals(antlrPd.getChildCount(), migratedPd.getChildCount()); - compareStartStopPositions(antlrPd, migratedPd); + Utils.compareStartStopPositions(antlrPd, migratedPd); ParseTree antlrPdb = antlrPd.getChild(3); ParseTree migratedPdb = migratedPd.getChild(3); - compareStartStopPositions(antlrPdb, migratedPdb); + Utils.compareStartStopPositions(antlrPdb, migratedPdb); assertEquals(antlrPdb.getChildCount(), migratedPdb.getChildCount()); - compareStartStopPositions(antlrPdb, migratedPdb); + Utils.compareStartStopPositions(antlrPdb, migratedPdb); ParserRuleContext antlrPdbP1 = (ParserRuleContext) antlrPdb.getChild(0); ParserRuleContext migratedPdbP1 = (ParserRuleContext) migratedPdb.getChild(0); @@ -131,7 +130,7 @@ void testParagraphSection2() { ParseTree migratedSP = migratedSection.getChild(2).getChild(0); assertEquals(antlrSP.getChildCount(), migratedSP.getChildCount()); - compareStartStopPositions(antlrSP, migratedSP); + Utils.compareStartStopPositions(antlrSP, migratedSP); assertEquals(antlrSP.getText(), migratedSP.getText()); assertEquals(antlrSection.getText(), migratedSection.getText()); @@ -193,7 +192,7 @@ void testMatchPositionsPara() { .getChild(2) // procedure name .getChild(0); // paragraph name - compareStartStopPositions(antlrP, migratedP); + Utils.compareStartStopPositions(antlrP, migratedP); } @Test @@ -222,7 +221,7 @@ void testMatchPositions3() { ParseTree antlrS = antlr.getChild(0).getChild(1).getChild(3).getChild(1); ParseTree migratedS = migrated.getChild(0).getChild(1).getChild(3).getChild(1); - compareStartStopPositions(antlrS, migratedS); + Utils.compareStartStopPositions(antlrS, migratedS); ParserRuleContext antlrP = (ParserRuleContext) antlr.getChild(0).getChild(1).getChild(3) @@ -231,7 +230,7 @@ void testMatchPositions3() { ParserRuleContext migratedP = (ParserRuleContext) migrated.getChild(0).getChild(1).getChild(3) .getChild(0) // paragraphs .getChild(0); - compareStartStopPositions(antlrP, migratedP); + Utils.compareStartStopPositions(antlrP, migratedP); antlrP = (ParserRuleContext) antlr.getChild(0).getChild(1).getChild(3).getChild(1) .getChild(2) @@ -241,7 +240,7 @@ void testMatchPositions3() { .getChild(0); assertEquals(antlrP.getChildCount(), migratedP.getChildCount()); - compareStartStopPositions(antlrP, migratedP); + Utils.compareStartStopPositions(antlrP, migratedP); } @Test @@ -269,7 +268,7 @@ void testMatchPositions4() { ParseTree antlrS = antlr.getChild(0).getChild(1).getChild(3).getChild(1); ParseTree migratedS = migrated.getChild(0).getChild(1).getChild(3).getChild(0); assertEquals(antlrS.getChildCount(), migratedS.getChildCount()); - compareStartStopPositions(antlrS, migratedS); + Utils.compareStartStopPositions(antlrS, migratedS); } @@ -312,12 +311,12 @@ void testMatchSourceUnit() { .getChild(1) // DC .getChild(3); // Pdb - compareAll(antlrPbc, migratedPbc); + Utils.compareAll(antlrPbc, migratedPbc); ParseTree antlrPc = antlrPbc.getChild(0).getChild(0); // PС ParseTree migratedPc = migratedPbc.getChild(0).getChild(0); // PС - compareStartStopPositions(antlrPc, migratedPc); + Utils.compareStartStopPositions(antlrPc, migratedPc); } @Test @@ -339,7 +338,7 @@ void testParagraphMatchPositions() { (org.eclipse.lsp.cobol.core.CobolParser.CompilationUnitContext) antlrAdapter.sourceUnitToStartRule(su).getChild(0); org.eclipse.lsp.cobol.core.CobolParser.CompilationUnitContext antlr = (org.eclipse.lsp.cobol.core.CobolParser.CompilationUnitContext) antlrParse(source).getChild(0); - compareAll(antlr.getChild(0).getChild(1), migrated.getChild(0).getChild(1)); + Utils.compareAll(antlr.getChild(0).getChild(1), migrated.getChild(0).getChild(1)); } } diff --git a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/migration/Utils.java b/server/parser/src/test/java/org/eclipse/lsp/cobol/migration/Utils.java similarity index 97% rename from server/parser/src/test/java/org/eclipse/lsp/cobol/core/migration/Utils.java rename to server/parser/src/test/java/org/eclipse/lsp/cobol/migration/Utils.java index 146d7ecf55..8c1c74bb9b 100644 --- a/server/parser/src/test/java/org/eclipse/lsp/cobol/core/migration/Utils.java +++ b/server/parser/src/test/java/org/eclipse/lsp/cobol/migration/Utils.java @@ -14,7 +14,7 @@ * and DAF development standards * */ -package org.eclipse.lsp.cobol.core.migration; +package org.eclipse.lsp.cobol.migration; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.tree.ParseTree;