From e966d644bae39c3230c18f06addfa28928e9eeba Mon Sep 17 00:00:00 2001 From: Jonathan Percival Date: Thu, 6 Oct 2022 12:18:55 -0600 Subject: [PATCH] WIP towards better hover / completion support --- .../cql/ls/server/config/ServerConfig.java | 14 ++- .../server/provider/CompletionProvider.java | 23 +++++ .../cql/ls/server/provider/HoverProvider.java | 93 +++++++------------ .../service/CqlTextDocumentService.java | 25 ++++- .../cql/ls/server/utility/Diagnostics.java | 11 +-- .../cqf/cql/ls/server/utility/Elements.java | 30 ++++++ .../cqf/cql/ls/server/utility/TrackBacks.java | 31 +++++++ .../visitor/ExpressionTrackBackVisitor.java | 52 +++-------- .../provider/CompletionProviderTest.java | 21 +++++ .../ExpressionTrackBackVisitorTest.java | 24 +++-- pom.xml | 26 +----- 11 files changed, 206 insertions(+), 144 deletions(-) create mode 100644 ls/server/src/main/java/org/opencds/cqf/cql/ls/server/provider/CompletionProvider.java create mode 100644 ls/server/src/main/java/org/opencds/cqf/cql/ls/server/utility/Elements.java create mode 100644 ls/server/src/main/java/org/opencds/cqf/cql/ls/server/utility/TrackBacks.java create mode 100644 ls/server/src/test/java/org/opencds/cqf/cql/ls/server/provider/CompletionProviderTest.java diff --git a/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/config/ServerConfig.java b/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/config/ServerConfig.java index 8ff2cb8..ed50075 100644 --- a/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/config/ServerConfig.java +++ b/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/config/ServerConfig.java @@ -12,6 +12,7 @@ import org.opencds.cqf.cql.ls.server.manager.CqlTranslationManager; import org.opencds.cqf.cql.ls.server.manager.TranslatorOptionsManager; import org.opencds.cqf.cql.ls.server.plugin.CommandContribution; +import org.opencds.cqf.cql.ls.server.provider.CompletionProvider; import org.opencds.cqf.cql.ls.server.provider.FormattingProvider; import org.opencds.cqf.cql.ls.server.provider.HoverProvider; import org.opencds.cqf.cql.ls.server.service.ActiveContentService; @@ -68,10 +69,10 @@ public CompletableFuture languageClient() { @Bean public CqlTextDocumentService cqlTextDocumentService( - CompletableFuture languageClient, HoverProvider hoverProvider, - FormattingProvider formattingProvider, EventBus eventBus) { - return new CqlTextDocumentService(languageClient, hoverProvider, formattingProvider, - eventBus); + CompletableFuture languageClient, CompletionProvider completionProvider, + HoverProvider hoverProvider, FormattingProvider formattingProvider, EventBus eventBus) { + return new CqlTextDocumentService(languageClient, completionProvider, hoverProvider, + formattingProvider, eventBus); } @Bean @@ -96,8 +97,11 @@ TranslatorOptionsManager translatorOptionsManager(ContentService contentService, CqlTranslationManager cqlTranslationManager(ContentService contentService, TranslatorOptionsManager translatorOptionsManager) { return new CqlTranslationManager(contentService, translatorOptionsManager); + } - + @Bean + CompletionProvider completionProvider(CqlTranslationManager cqlTranslationManager) { + return new CompletionProvider(cqlTranslationManager); } @Bean diff --git a/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/provider/CompletionProvider.java b/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/provider/CompletionProvider.java new file mode 100644 index 0000000..3483269 --- /dev/null +++ b/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/provider/CompletionProvider.java @@ -0,0 +1,23 @@ +package org.opencds.cqf.cql.ls.server.provider; + +import java.util.List; +import org.eclipse.lsp4j.CompletionItem; +import org.eclipse.lsp4j.CompletionList; +import org.eclipse.lsp4j.CompletionParams; +import org.eclipse.lsp4j.jsonrpc.messages.Either; +import org.opencds.cqf.cql.ls.server.manager.CqlTranslationManager; + +public class CompletionProvider { + + private CqlTranslationManager cqlTranslationManager; + + public CompletionProvider(CqlTranslationManager cqlTranslationManager) { + this.cqlTranslationManager = cqlTranslationManager; + } + + public Either, CompletionList> completion( + CompletionParams completionParams) { + return null; + } + +} diff --git a/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/provider/HoverProvider.java b/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/provider/HoverProvider.java index 11a7216..94f51d9 100644 --- a/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/provider/HoverProvider.java +++ b/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/provider/HoverProvider.java @@ -1,19 +1,22 @@ package org.opencds.cqf.cql.ls.server.provider; import java.net.URI; -import org.apache.commons.lang3.tuple.Pair; import org.cqframework.cql.cql2elm.CqlTranslator; -import org.cqframework.cql.elm.tracking.TrackBack; +import org.cqframework.cql.cql2elm.model.TranslatedLibrary; import org.eclipse.lsp4j.Hover; import org.eclipse.lsp4j.HoverParams; import org.eclipse.lsp4j.MarkupContent; import org.eclipse.lsp4j.Position; -import org.eclipse.lsp4j.Range; import org.hl7.cql.model.DataType; +import org.hl7.elm.r1.Element; import org.hl7.elm.r1.ExpressionDef; -import org.hl7.elm.r1.Library.Statements; +import org.hl7.elm.r1.ExpressionRef; +import org.hl7.elm.r1.Library; +import org.hl7.elm.r1.Retrieve; import org.opencds.cqf.cql.ls.core.utility.Uris; import org.opencds.cqf.cql.ls.server.manager.CqlTranslationManager; +import org.opencds.cqf.cql.ls.server.utility.TrackBacks; +import org.opencds.cqf.cql.ls.server.visitor.ExpressionTrackBackVisitor; public class HoverProvider { private CqlTranslationManager cqlTranslationManager; @@ -35,87 +38,63 @@ public Hover hover(HoverParams position) { return null; } - // The ExpressionTrackBackVisitor is supposed to replace this eventually. - // Basically, for any given position in the text document there's a graph of nodes - // that represent the parents nodes for that position. For example: - // - // define: "EncounterExists": - // exists([Encounter]) - // - // ExpressionDef -> Expression -> Exists -> Retrieve - // - // For that given position, we want to select the most specific node we support generating - // hover information for and return that. - // - // (maybe.. the alternative is to select the specific node under the cursor, but that may be - // less user friendly) - // - // The current code always picks the first ExpressionDef in the graph. - Pair exp = getExpressionDefForPosition(position.getPosition(), - translator.getTranslatedLibrary().getLibrary().getStatements()); - - if (exp == null) { + var elm = elementForPosition(translator.getTranslatedLibrary().getLibrary(), + position.getPosition()); + + if (elm == null) { return null; } - MarkupContent markup = markup(exp.getRight()); + MarkupContent markup = markup(elm, translator.getTranslatedLibrary()); if (markup == null) { return null; } - return new Hover(markup, exp.getLeft()); + return new Hover(markup, TrackBacks.toRange(elm.getTrackbacks().get(0))); } - private Pair getExpressionDefForPosition(Position position, - Statements statements) { - if (statements == null || statements.getDef() == null || statements.getDef().isEmpty()) { - return null; - } - - for (ExpressionDef def : statements.getDef()) { - if (def.getTrackbacks() == null || def.getTrackbacks().isEmpty()) { - continue; - } - - for (TrackBack tb : def.getTrackbacks()) { - if (positionInTrackBack(position, tb)) { - Range range = - new Range(new Position(tb.getStartLine() - 1, tb.getStartChar() - 1), - new Position(tb.getEndLine() - 1, tb.getEndChar())); - return Pair.of(range, def); - } - } + public MarkupContent markup(Element elm, TranslatedLibrary translatedLibrary) { + if (elm instanceof ExpressionDef) { + return markup((ExpressionDef) elm); + } else if (elm instanceof Retrieve) { + return markup((Retrieve) elm); + } else if (elm instanceof ExpressionRef) { + var resolved = translatedLibrary.resolveExpressionRef(((ExpressionDef) elm).getName()); + return markup(resolved); } return null; } - private boolean positionInTrackBack(Position p, TrackBack tb) { - int startLine = tb.getStartLine() - 1; - int endLine = tb.getEndLine() - 1; - - // Just kidding. We need intervals. - if (p.getLine() >= startLine && p.getLine() <= endLine) { - return true; - } else { - return false; - } - } - public MarkupContent markup(ExpressionDef def) { if (def == null || def.getExpression() == null) { return null; } + /* + * // This def has comments // @andtags define "Expression" returns "Whatever" + */ + + DataType resultType = def.getExpression().getResultType(); if (resultType == null) { return null; } + // Specifying the Markdown type as cql allows the client to apply // cql syntax highlighting the resulting pop-up String result = String.join("\n", "```cql", resultType.toString(), "```"); return new MarkupContent("markdown", result); } + + public MarkupContent markup(Retrieve retrieve) { + return null; + } + + public Element elementForPosition(Library library, Position position) { + var visitor = new ExpressionTrackBackVisitor(); + return visitor.visitLibrary(library, position); + } } diff --git a/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/service/CqlTextDocumentService.java b/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/service/CqlTextDocumentService.java index a7b3980..4689869 100644 --- a/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/service/CqlTextDocumentService.java +++ b/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/service/CqlTextDocumentService.java @@ -2,6 +2,10 @@ import java.util.List; import java.util.concurrent.CompletableFuture; +import org.eclipse.lsp4j.CompletionItem; +import org.eclipse.lsp4j.CompletionList; +import org.eclipse.lsp4j.CompletionOptions; +import org.eclipse.lsp4j.CompletionParams; import org.eclipse.lsp4j.DidChangeTextDocumentParams; import org.eclipse.lsp4j.DidCloseTextDocumentParams; import org.eclipse.lsp4j.DidOpenTextDocumentParams; @@ -15,6 +19,7 @@ import org.eclipse.lsp4j.ServerCapabilities; import org.eclipse.lsp4j.TextDocumentSyncKind; import org.eclipse.lsp4j.TextEdit; +import org.eclipse.lsp4j.jsonrpc.messages.Either; import org.eclipse.lsp4j.services.LanguageClient; import org.eclipse.lsp4j.services.TextDocumentService; import org.greenrobot.eventbus.EventBus; @@ -22,10 +27,12 @@ import org.opencds.cqf.cql.ls.server.event.DidCloseTextDocumentEvent; import org.opencds.cqf.cql.ls.server.event.DidOpenTextDocumentEvent; import org.opencds.cqf.cql.ls.server.event.DidSaveTextDocumentEvent; +import org.opencds.cqf.cql.ls.server.provider.CompletionProvider; import org.opencds.cqf.cql.ls.server.provider.FormattingProvider; import org.opencds.cqf.cql.ls.server.provider.HoverProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.collect.ImmutableList; public class CqlTextDocumentService implements TextDocumentService { private static final Logger log = LoggerFactory.getLogger(CqlTextDocumentService.class); @@ -34,13 +41,16 @@ public class CqlTextDocumentService implements TextDocumentService { private final CompletableFuture client; private final FormattingProvider formattingProvider; private final HoverProvider hoverProvider; + private final CompletionProvider completionProvider; private final EventBus eventBus; public CqlTextDocumentService(CompletableFuture client, - HoverProvider hoverProvider, FormattingProvider formattingProvider, EventBus eventBus) { + CompletionProvider completionProvider, HoverProvider hoverProvider, + FormattingProvider formattingProvider, EventBus eventBus) { this.client = client; - this.formattingProvider = formattingProvider; + this.completionProvider = completionProvider; this.hoverProvider = hoverProvider; + this.formattingProvider = formattingProvider; this.eventBus = eventBus; } @@ -48,7 +58,8 @@ public CqlTextDocumentService(CompletableFuture client, public void initialize(InitializeParams params, ServerCapabilities serverCapabilities) { serverCapabilities.setTextDocumentSync(TextDocumentSyncKind.Full); // c.setDefinitionProvider(true); - // c.setCompletionProvider(new CompletionOptions(true, ImmutableList.of("."))); + serverCapabilities + .setCompletionProvider(new CompletionOptions(false, ImmutableList.of("."))); serverCapabilities.setDocumentFormattingProvider(true); // serverCapabilities.setDocumentRangeFormattingProvider(false); serverCapabilities.setHoverProvider(true); @@ -65,6 +76,14 @@ public CompletableFuture hover(HoverParams position) { .exceptionally(this::notifyClient); } + @Override + public CompletableFuture, CompletionList>> completion( + CompletionParams position) { + return CompletableFuture.supplyAsync(() -> this.completionProvider.completion(position)) + .exceptionally(this::notifyClient); + } + + @Override public CompletableFuture> formatting(DocumentFormattingParams params) { diff --git a/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/utility/Diagnostics.java b/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/utility/Diagnostics.java index bef912c..8ac9da4 100644 --- a/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/utility/Diagnostics.java +++ b/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/utility/Diagnostics.java @@ -5,7 +5,6 @@ import org.cqframework.cql.cql2elm.CqlTranslatorException; import org.eclipse.lsp4j.Diagnostic; import org.eclipse.lsp4j.DiagnosticSeverity; -import org.eclipse.lsp4j.Position; import org.eclipse.lsp4j.Range; public class Diagnostics { @@ -14,7 +13,7 @@ private Diagnostics() {} public static Diagnostic convert(CqlTranslatorException error) { if (error.getLocator() != null) { - Range range = position(error); + Range range = TrackBacks.toRange(error.getLocator()); Diagnostic diagnostic = new Diagnostic(); DiagnosticSeverity severity = severity(error.getSeverity()); @@ -50,12 +49,4 @@ private static DiagnosticSeverity severity(CqlTranslatorException.ErrorSeverity return DiagnosticSeverity.Information; } } - - private static Range position(CqlTranslatorException error) { - // The Language server API assumes 0 based indices and an exclusive range - return new Range( - new Position(error.getLocator().getStartLine() - 1, - Math.max(error.getLocator().getStartChar() - 1, 0)), - new Position(error.getLocator().getEndLine() - 1, error.getLocator().getEndChar())); - } } diff --git a/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/utility/Elements.java b/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/utility/Elements.java new file mode 100644 index 0000000..6b5d262 --- /dev/null +++ b/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/utility/Elements.java @@ -0,0 +1,30 @@ +package org.opencds.cqf.cql.ls.server.utility; + +import org.cqframework.cql.elm.tracking.TrackBack; +import org.eclipse.lsp4j.Position; +import org.hl7.elm.r1.Element; + +public class Elements { + + private Elements() {} + + public static boolean containsTrackBack(Element elm, TrackBack context) { + for (TrackBack tb : elm.getTrackbacks()) { + if (TrackBacks.containsTrackBack(tb, context)) { + return true; + } + } + + return false; + } + + public static boolean containsPosition(Element elm, Position position) { + for (TrackBack tb : elm.getTrackbacks()) { + if (TrackBacks.containsPosition(tb, position)) { + return true; + } + } + + return false; + } +} diff --git a/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/utility/TrackBacks.java b/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/utility/TrackBacks.java new file mode 100644 index 0000000..696718d --- /dev/null +++ b/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/utility/TrackBacks.java @@ -0,0 +1,31 @@ +package org.opencds.cqf.cql.ls.server.utility; + +import org.cqframework.cql.elm.tracking.TrackBack; +import org.eclipse.lsp4j.Position; +import org.eclipse.lsp4j.Range; +import org.eclipse.lsp4j.util.Ranges; + +public class TrackBacks { + + private TrackBacks() {} + + public static Range toRange(TrackBack trackBack) { + // The Language server API assumes 0 based indices and an exclusive range + return new Range( + new Position(trackBack.getStartLine() - 1, + Math.max(trackBack.getStartChar() - 1, 0)), + new Position(trackBack.getEndLine() - 1, trackBack.getEndChar())); + } + + public static boolean containsTrackBack(TrackBack bigger, TrackBack smaller) { + var range1 = toRange(bigger); + var range2 = toRange(smaller); + + return Ranges.containsRange(range1, range2); + } + + public static boolean containsPosition(TrackBack trackBack, Position p) { + Range range = toRange(trackBack); + return Ranges.containsPosition(range, p); + } +} diff --git a/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/visitor/ExpressionTrackBackVisitor.java b/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/visitor/ExpressionTrackBackVisitor.java index c6e3370..397994e 100644 --- a/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/visitor/ExpressionTrackBackVisitor.java +++ b/ls/server/src/main/java/org/opencds/cqf/cql/ls/server/visitor/ExpressionTrackBackVisitor.java @@ -1,13 +1,15 @@ package org.opencds.cqf.cql.ls.server.visitor; -import org.cqframework.cql.elm.tracking.TrackBack; import org.cqframework.cql.elm.visiting.ElmBaseLibraryVisitor; +import org.eclipse.lsp4j.Position; import org.hl7.elm.r1.Element; import org.hl7.elm.r1.ExpressionDef; +import org.hl7.elm.r1.ExpressionRef; import org.hl7.elm.r1.FunctionDef; import org.hl7.elm.r1.Retrieve; +import org.opencds.cqf.cql.ls.server.utility.Elements; -public class ExpressionTrackBackVisitor extends ElmBaseLibraryVisitor { +public class ExpressionTrackBackVisitor extends ElmBaseLibraryVisitor { // Return the child result if it's not null (IOW, it's more specific than this result). // Otherwise, return the current result @@ -21,57 +23,29 @@ protected Element aggregateResult(Element aggregate, Element nextResult) { } @Override - public Element visitExpressionDef(ExpressionDef elm, TrackBack context) { + public Element visitExpressionDef(ExpressionDef elm, Position context) { if (elm instanceof FunctionDef) { return visitFunctionDef((FunctionDef) elm, context); } Element childResult = visitChildren(elm, context); - return aggregateResult(elementCoversTrackBack(elm, context) ? elm : null, childResult); + return aggregateResult(Elements.containsPosition(elm, context) ? elm : null, childResult); } @Override - public Element visitRetrieve(Retrieve retrieve, TrackBack context) { - if (elementCoversTrackBack(retrieve, context)) { + public Element visitRetrieve(Retrieve retrieve, Position context) { + if (Elements.containsPosition(retrieve, context)) { return retrieve; } return null; } - protected boolean elementCoversTrackBack(Element elm, TrackBack context) { - for (TrackBack tb : elm.getTrackbacks()) { - if (startsOnOrBefore(tb, context) && endsOnOrAfter(tb, context)) { - return true; - } - } - - return false; - } - - protected boolean startsOnOrBefore(TrackBack left, TrackBack right) { - if (left.getStartLine() > right.getStartLine()) { - return false; - } - - if (left.getStartLine() < right.getStartLine()) { - return true; - } - - // Same line - return left.getStartChar() <= right.getStartChar(); - } - - protected boolean endsOnOrAfter(TrackBack left, TrackBack right) { - if (left.getEndLine() < right.getEndLine()) { - return false; - } - - if (left.getEndLine() > right.getEndLine()) { - return true; + @Override + public Element visitExpressionRef(ExpressionRef elm, Position context) { + if (Elements.containsPosition(elm, context)) { + return elm; } - // Same line - return left.getEndChar() >= right.getEndChar(); + return null; } - } diff --git a/ls/server/src/test/java/org/opencds/cqf/cql/ls/server/provider/CompletionProviderTest.java b/ls/server/src/test/java/org/opencds/cqf/cql/ls/server/provider/CompletionProviderTest.java new file mode 100644 index 0000000..d06ad2c --- /dev/null +++ b/ls/server/src/test/java/org/opencds/cqf/cql/ls/server/provider/CompletionProviderTest.java @@ -0,0 +1,21 @@ +package org.opencds.cqf.cql.ls.server.provider; + +import org.junit.jupiter.api.BeforeAll; +import org.opencds.cqf.cql.ls.core.ContentService; +import org.opencds.cqf.cql.ls.server.manager.CqlTranslationManager; +import org.opencds.cqf.cql.ls.server.manager.TranslatorOptionsManager; +import org.opencds.cqf.cql.ls.server.service.TestContentService; + +public class CompletionProviderTest { + + private static CompletionProvider completionProvider; + + @BeforeAll + public static void beforeAll() { + ContentService cs = new TestContentService(); + CqlTranslationManager cqlTranslationManager = + new CqlTranslationManager(cs, new TranslatorOptionsManager(cs)); + completionProvider = new CompletionProvider(cqlTranslationManager); + } + +} diff --git a/ls/server/src/test/java/org/opencds/cqf/cql/ls/server/visitor/ExpressionTrackBackVisitorTest.java b/ls/server/src/test/java/org/opencds/cqf/cql/ls/server/visitor/ExpressionTrackBackVisitorTest.java index 7c47238..6907029 100644 --- a/ls/server/src/test/java/org/opencds/cqf/cql/ls/server/visitor/ExpressionTrackBackVisitorTest.java +++ b/ls/server/src/test/java/org/opencds/cqf/cql/ls/server/visitor/ExpressionTrackBackVisitorTest.java @@ -4,9 +4,10 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; -import org.cqframework.cql.elm.tracking.TrackBack; +import org.eclipse.lsp4j.Position; import org.hl7.elm.r1.Element; import org.hl7.elm.r1.ExpressionDef; +import org.hl7.elm.r1.ExpressionRef; import org.hl7.elm.r1.Library; import org.hl7.elm.r1.Retrieve; import org.junit.jupiter.api.BeforeAll; @@ -33,8 +34,8 @@ public static void beforeAll() { @Test public void positionInRetrieve_returnsRetrieve() { ExpressionTrackBackVisitor visitor = new ExpressionTrackBackVisitor(); - TrackBack tb = new TrackBack(library.getIdentifier(), 9, 9, 9, 9); - Element e = visitor.visitLibrary(library, tb); + Position p = new Position(8, 9); + Element e = visitor.visitLibrary(library, p); assertNotNull(e); assertThat(e, instanceOf(Retrieve.class)); } @@ -42,17 +43,26 @@ public void positionInRetrieve_returnsRetrieve() { @Test public void positionOutsideExpression_returnsNull() { ExpressionTrackBackVisitor visitor = new ExpressionTrackBackVisitor(); - TrackBack tb = new TrackBack(library.getIdentifier(), 10, 0, 10, 0); - Element e = visitor.visitLibrary(library, tb); + Position p = new Position(9, 0); + Element e = visitor.visitLibrary(library, p); assertNull(e); } @Test public void positionInExpression_returnsExpressionDef() { ExpressionTrackBackVisitor visitor = new ExpressionTrackBackVisitor(); - TrackBack tb = new TrackBack(library.getIdentifier(), 15, 10, 15, 10); - Element e = visitor.visitLibrary(library, tb); + Position p = new Position(13, 10); + Element e = visitor.visitLibrary(library, p); assertNotNull(e); assertThat(e, instanceOf(ExpressionDef.class)); } + + @Test + public void positionInExpressionDef_returnsExpressionRef() { + ExpressionTrackBackVisitor visitor = new ExpressionTrackBackVisitor(); + Position p = new Position(14, 10); + Element e = visitor.visitLibrary(library, p); + assertNotNull(e); + assertThat(e, instanceOf(ExpressionRef.class)); + } } diff --git a/pom.xml b/pom.xml index 4abb429..d0f0748 100644 --- a/pom.xml +++ b/pom.xml @@ -242,14 +242,13 @@ maven-compiler-plugin 3.8.1 - 1.8 - 1.8 + 11 + 11 + 11 true true -Xlint:all - - -Xlint:-options -Xlint:-processing -Werror @@ -421,24 +420,5 @@ - - java-9 - - [9,) - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 8 - - - - - - \ No newline at end of file