diff --git a/server/engine/src/main/java/org/eclipse/lsp/cobol/core/engine/dialects/DialectService.java b/server/engine/src/main/java/org/eclipse/lsp/cobol/core/engine/dialects/DialectService.java index 36e6a19624..a6a26eedd1 100644 --- a/server/engine/src/main/java/org/eclipse/lsp/cobol/core/engine/dialects/DialectService.java +++ b/server/engine/src/main/java/org/eclipse/lsp/cobol/core/engine/dialects/DialectService.java @@ -41,7 +41,6 @@ import org.eclipse.lsp.cobol.common.model.tree.Node; import org.eclipse.lsp.cobol.common.processor.ProcessorDescription; import org.eclipse.lsp.cobol.core.engine.analysis.AnalysisContext; -import org.eclipse.lsp.cobol.core.engine.dialects.hp.HpDialect; import org.eclipse.lsp.cobol.implicitDialects.cics.CICSDialect; import org.eclipse.lsp.cobol.implicitDialects.sql.Db2SqlDialect; import org.eclipse.lsp4j.Location; @@ -140,7 +139,7 @@ public ResultWithErrors processImplicitDialects( * @param ctx a {@link AnalysisContext} class * @param dialectProcessingContext is a DialectProcessingContext class with all needed data for * dialect processing - * @return a error while extending the document + * @return an error while extending the document */ public List extendImplicitDialects( AnalysisContext ctx, DialectProcessingContext dialectProcessingContext) { @@ -263,7 +262,7 @@ private LinkedList sortDialects(List dialects) { * Returns dialect object by name * * @param dialectName is a dialect name - * @return a dialect is it's possible + * @return a dialect if it is possible */ public Optional getDialectByName(String dialectName) { return Optional.ofNullable(dialectSuppliers.get(dialectName)); @@ -321,8 +320,6 @@ public boolean updateDialects(List dialectRegistry) { return dialect; }) .orElse(null))); - changed.set(true); - dialectSuppliers.put("HP", new HpDialect(copybookService, messageService)); return changed.get(); } 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 3941821132..3fa17debc2 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 @@ -19,6 +19,7 @@ import org.antlr.v4.runtime.tree.ParseTreeListener; import org.eclipse.lsp.cobol.common.CleanerPreprocessor; import org.eclipse.lsp.cobol.common.SubroutineService; +import org.eclipse.lsp.cobol.common.copybook.CopybookService; import org.eclipse.lsp.cobol.common.dialects.TrueDialectService; import org.eclipse.lsp.cobol.common.message.MessageService; import org.eclipse.lsp.cobol.core.engine.analysis.AnalysisContext; @@ -55,7 +56,8 @@ public TrueDialectServiceImpl( DialectService dialectService, AstProcessor astProcessor, SymbolsRepository symbolsRepository, - CodeLayoutStore codeLayoutStore) { + CodeLayoutStore codeLayoutStore, + CopybookService copybookService) { dialects = new HashMap<>(); dialects.put(CobolLanguageId.COBOL, new IbmTrueCobolDialect(grammarPreprocessor, messageService, treeListener, subroutineService, cachingConfigurationService, dialectService, @@ -63,7 +65,7 @@ public TrueDialectServiceImpl( dialects.put(CobolLanguageId.HP_COBOL, new HpTrueCobolDialect(grammarPreprocessor, messageService, treeListener, subroutineService, cachingConfigurationService, dialectService, - astProcessor, symbolsRepository, codeLayoutStore)); + astProcessor, symbolsRepository, codeLayoutStore, copybookService)); } /** diff --git a/server/engine/src/main/java/org/eclipse/lsp/cobol/core/engine/dialects/hp/CopybookDescriptor.java b/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/hp/CopybookDescriptor.java similarity index 92% rename from server/engine/src/main/java/org/eclipse/lsp/cobol/core/engine/dialects/hp/CopybookDescriptor.java rename to server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/hp/CopybookDescriptor.java index 89614b6043..e3e5e62004 100644 --- a/server/engine/src/main/java/org/eclipse/lsp/cobol/core/engine/dialects/hp/CopybookDescriptor.java +++ b/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/hp/CopybookDescriptor.java @@ -12,7 +12,7 @@ * Broadcom, Inc. - initial API and implementation * */ -package org.eclipse.lsp.cobol.core.engine.dialects.hp; +package org.eclipse.lsp.cobol.dialects.hp; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/server/engine/src/main/java/org/eclipse/lsp/cobol/core/engine/dialects/hp/CopybookParser.java b/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/hp/CopybookParser.java similarity index 97% rename from server/engine/src/main/java/org/eclipse/lsp/cobol/core/engine/dialects/hp/CopybookParser.java rename to server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/hp/CopybookParser.java index 10c6d5e3ef..e18c8aa858 100644 --- a/server/engine/src/main/java/org/eclipse/lsp/cobol/core/engine/dialects/hp/CopybookParser.java +++ b/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/hp/CopybookParser.java @@ -12,7 +12,7 @@ * Broadcom, Inc. - initial API and implementation * */ -package org.eclipse.lsp.cobol.core.engine.dialects.hp; +package org.eclipse.lsp.cobol.dialects.hp; import org.eclipse.lsp.cobol.common.mapping.ExtendedDocument; import org.eclipse.lsp4j.Position; diff --git a/server/engine/src/main/java/org/eclipse/lsp/cobol/core/engine/dialects/hp/HpDialect.java b/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/hp/HpCopybookProcessingStage.java similarity index 66% rename from server/engine/src/main/java/org/eclipse/lsp/cobol/core/engine/dialects/hp/HpDialect.java rename to server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/hp/HpCopybookProcessingStage.java index e3522fa8b2..83b2626bc1 100644 --- a/server/engine/src/main/java/org/eclipse/lsp/cobol/core/engine/dialects/hp/HpDialect.java +++ b/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/hp/HpCopybookProcessingStage.java @@ -12,25 +12,28 @@ * Broadcom, Inc. - initial API and implementation * */ -package org.eclipse.lsp.cobol.core.engine.dialects.hp; +package org.eclipse.lsp.cobol.dialects.hp; import com.google.common.collect.ImmutableList; -import org.eclipse.lsp.cobol.common.ResultWithErrors; +import lombok.RequiredArgsConstructor; import org.eclipse.lsp.cobol.common.copybook.CopybookModel; import org.eclipse.lsp.cobol.common.copybook.CopybookName; import org.eclipse.lsp.cobol.common.copybook.CopybookService; -import org.eclipse.lsp.cobol.common.dialects.CobolDialect; import org.eclipse.lsp.cobol.common.dialects.DialectOutcome; import org.eclipse.lsp.cobol.common.dialects.DialectProcessingContext; import org.eclipse.lsp.cobol.common.error.ErrorCodes; import org.eclipse.lsp.cobol.common.error.ErrorSource; import org.eclipse.lsp.cobol.common.error.SyntaxError; +import org.eclipse.lsp.cobol.common.mapping.ExtendedDocument; import org.eclipse.lsp.cobol.common.mapping.ExtendedText; import org.eclipse.lsp.cobol.common.mapping.MappedCharacter; import org.eclipse.lsp.cobol.common.mapping.OriginalLocation; import org.eclipse.lsp.cobol.common.message.MessageService; import org.eclipse.lsp.cobol.common.model.Locality; import org.eclipse.lsp.cobol.common.model.tree.CopyNode; +import org.eclipse.lsp.cobol.common.pipeline.Stage; +import org.eclipse.lsp.cobol.common.pipeline.StageResult; +import org.eclipse.lsp.cobol.core.engine.analysis.AnalysisContext; import org.eclipse.lsp4j.Location; import java.util.HashSet; @@ -41,48 +44,41 @@ import static org.eclipse.lsp.cobol.common.error.ErrorSeverity.ERROR; /** - * HP Dialect support + * Resolving and inserting copybooks into the extended source stage */ -public class HpDialect implements CobolDialect { +@RequiredArgsConstructor +class HpCopybookProcessingStage implements Stage { - private final CopybookService copybookService; private final MessageService messageService; - - public HpDialect(CopybookService copybookService, MessageService messageService) { - this.copybookService = copybookService; - this.messageService = messageService; - } - - @Override - public String getName() { - return "HP"; - } + private final CopybookService copybookService; @Override - public List extend(DialectProcessingContext context) { + public StageResult run(AnalysisContext context, StageResult prevStageResult) { List errors = new LinkedList<>(); List cbs = CopybookParser.parseAndCleanup(context.getExtendedDocument()); cbs.forEach(cb -> { - String currentUri = context.getExtendedDocument().getUri(); - insertHpCopybook(context, cb, errors); + List copybookNodes = insertHpCopybook(context.getDocumentUri(), context.getExtendedDocument(), cb, errors); + context.getDialectNodes().addAll(copybookNodes); }); - return errors; + + DialectOutcome outcome = new DialectOutcome(context.getDialectNodes(), DialectProcessingContext.builder().build()); + return new StageResult<>(outcome); } @Override - public ResultWithErrors processText(DialectProcessingContext context) { - return new ResultWithErrors<>(new DialectOutcome(context.getDialectNodes(), context), ImmutableList.of()); + public String getName() { + return "Copybook processing"; } - private void insertHpCopybook(DialectProcessingContext context, CopybookDescriptor descriptor, List errors) { + private List insertHpCopybook(String programUri, ExtendedDocument extendedDocument, CopybookDescriptor descriptor, List errors) { CopybookName copybookName = new CopybookName(descriptor.getName()); - CopybookModel model = copybookService.resolve(copybookName.toCopybookId(context.getProgramDocumentUri()), - copybookName, context.getProgramDocumentUri(), - context.getExtendedDocument().getUri(), null) + CopybookModel model = copybookService.resolve(copybookName.toCopybookId(extendedDocument.getUri()), + copybookName, programUri, + extendedDocument.getUri(), null) .unwrap(errors::addAll); - Location nameLocation = new Location(context.getExtendedDocument().getUri(), descriptor.getNameRange()); + Location nameLocation = new Location(extendedDocument.getUri(), descriptor.getNameRange()); if (model.getUri() == null) { errors.add(SyntaxError.syntaxError() .errorSource(ErrorSource.DIALECT) @@ -94,7 +90,7 @@ private void insertHpCopybook(DialectProcessingContext context, CopybookDescript .errorCode(ErrorCodes.MISSING_COPYBOOK) .location(new OriginalLocation(nameLocation, null)) .build()); - return; + return ImmutableList.of(); } String text = model.getContent(); @@ -111,15 +107,16 @@ private void insertHpCopybook(DialectProcessingContext context, CopybookDescript } ); - context.getExtendedDocument().insertCopybook(descriptor.getStatementRange(), copybook); + extendedDocument.insertCopybook(descriptor.getStatementRange(), copybook); Locality statementLocality = Locality.builder() - .copybookId(copybookName.toCopybookId(context.getProgramDocumentUri()).toString()) + .copybookId(copybookName.toCopybookId(programUri).toString()) .range(descriptor.getStatementRange()) - .uri(context.getExtendedDocument().getUri()) + .uri(extendedDocument.getUri()) .build(); CopyNode copyNode = new CopyNode(statementLocality, nameLocation, descriptor.getName(), model.getUri()); - context.getDialectNodes().add(copyNode); + return ImmutableList.of(copyNode); } + } diff --git a/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/hp/HpTrueCobolDialect.java b/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/hp/HpTrueCobolDialect.java index 40bb0965b2..9621783357 100644 --- a/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/hp/HpTrueCobolDialect.java +++ b/server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/hp/HpTrueCobolDialect.java @@ -17,6 +17,7 @@ import org.antlr.v4.runtime.tree.ParseTreeListener; import org.eclipse.lsp.cobol.common.CleanerPreprocessor; import org.eclipse.lsp.cobol.common.SubroutineService; +import org.eclipse.lsp.cobol.common.copybook.CopybookService; import org.eclipse.lsp.cobol.common.message.MessageService; import org.eclipse.lsp.cobol.common.pipeline.Pipeline; import org.eclipse.lsp.cobol.core.engine.analysis.AnalysisContext; @@ -45,14 +46,15 @@ public HpTrueCobolDialect(GrammarPreprocessor grammarPreprocessor, DialectService dialectService, AstProcessor astProcessor, SymbolsRepository symbolsRepository, - CodeLayoutStore codeLayoutStore) { + CodeLayoutStore codeLayoutStore, + CopybookService copybookService) { preprocessor = new HpTextPreprocessor(messageService, codeLayoutStore); pipeline = new Pipeline<>(); pipeline.add(new HpCleanupStage(preprocessor)); pipeline.add(new DialectCompilerDirectiveStage(dialectService)); pipeline.add(new CompilerDirectivesStage(messageService)); - pipeline.add(new DialectProcessingStage(dialectService, preprocessor)); + pipeline.add(new HpCopybookProcessingStage(messageService, copybookService)); pipeline.add(new PreprocessorStage(grammarPreprocessor, preprocessor)); pipeline.add(new ImplicitDialectProcessingStage(dialectService)); pipeline.add(new ParserStage(messageService, treeListener)); diff --git a/server/engine/src/test/java/org/eclipse/lsp/cobol/core/engine/CobolLanguageEngineTest.java b/server/engine/src/test/java/org/eclipse/lsp/cobol/core/engine/CobolLanguageEngineTest.java index 72c73c2c20..c0ba86acba 100644 --- a/server/engine/src/test/java/org/eclipse/lsp/cobol/core/engine/CobolLanguageEngineTest.java +++ b/server/engine/src/test/java/org/eclipse/lsp/cobol/core/engine/CobolLanguageEngineTest.java @@ -27,6 +27,7 @@ import org.eclipse.lsp.cobol.common.*; import org.eclipse.lsp.cobol.common.benchmark.BenchmarkService; import org.eclipse.lsp.cobol.common.benchmark.BenchmarkSession; +import org.eclipse.lsp.cobol.common.copybook.CopybookService; import org.eclipse.lsp.cobol.common.dialects.DialectOutcome; import org.eclipse.lsp.cobol.common.dialects.DialectProcessingContext; import org.eclipse.lsp.cobol.common.dialects.TrueDialectService; @@ -78,6 +79,7 @@ class CobolLanguageEngineTest { private final SymbolsRepository symbolsRepository = mock(SymbolsRepository.class); private final CleanerPreprocessor preprocessor = mock(CleanerPreprocessor.class); private final CodeLayoutStore store = mock(CodeLayoutStore.class); + private final CopybookService copybookService = mock(CopybookService.class); @Test void testLanguageEngineRun() { @@ -91,7 +93,7 @@ void testLanguageEngineRun() { TrueDialectService trueDialectService = new TrueDialectServiceImpl(grammarPreprocessor, mockMessageService, treeListener, mock(SubroutineService.class), null, - dialectService, astProcessor, symbolsRepository, store); + dialectService, astProcessor, symbolsRepository, store, copybookService); CobolLanguageEngine engine = new CobolLanguageEngine(trueDialectService, mockMessageService, @@ -169,7 +171,7 @@ void testLanguageEngineRunWhenNativeServerWithDialects() { TrueDialectService trueDialectService = new TrueDialectServiceImpl(grammarPreprocessor, mockMessageService, treeListener, mock(SubroutineService.class), null, - dialectService, astProcessor, symbolsRepository, store); + dialectService, astProcessor, symbolsRepository, store, copybookService); CobolLanguageEngine engine = new CobolLanguageEngine(trueDialectService, mockMessageService,