You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by db...@apache.org on 2021/12/14 09:37:27 UTC
[netbeans] branch master updated: LSP: Provide completion for SQL queries for repository annotations. (#3367)
This is an automated email from the ASF dual-hosted git repository.
dbalek pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/master by this push:
new 0f6425b LSP: Provide completion for SQL queries for repository annotations. (#3367)
0f6425b is described below
commit 0f6425b70a3e49c5464d4f4b07db2db23e504df5
Author: Dusan Balek <du...@oracle.com>
AuthorDate: Tue Dec 14 10:37:15 2021 +0100
LSP: Provide completion for SQL queries for repository annotations. (#3367)
---
java/j2ee.persistence/nbproject/project.xml | 9 ++
.../persistence/editor/completion/CCParser.java | 8 ++
.../completion/ETCompletionContextResolver.java | 4 +-
.../completion/JPACodeCompletionProvider.java | 110 ++++++++++++---------
.../editor/completion/JPACompletionItem.java | 2 +-
.../nbcode/nbproject/platform.properties | 16 ---
6 files changed, 86 insertions(+), 63 deletions(-)
diff --git a/java/j2ee.persistence/nbproject/project.xml b/java/j2ee.persistence/nbproject/project.xml
index 089d1a2..f8ecc68 100644
--- a/java/j2ee.persistence/nbproject/project.xml
+++ b/java/j2ee.persistence/nbproject/project.xml
@@ -53,6 +53,15 @@
</run-dependency>
</dependency>
<dependency>
+ <code-name-base>org.netbeans.api.lsp</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <release-version>1</release-version>
+ <specification-version>1.7</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
<code-name-base>org.netbeans.api.progress</code-name-base>
<build-prerequisite/>
<compile-dependency/>
diff --git a/java/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/editor/completion/CCParser.java b/java/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/editor/completion/CCParser.java
index 196edcb..99b2116 100644
--- a/java/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/editor/completion/CCParser.java
+++ b/java/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/editor/completion/CCParser.java
@@ -147,6 +147,14 @@ public class CCParser {
case COMMA:
//just consume, still in INNN
break;
+ case STRING_LITERAL:
+ if (attrs.isEmpty()) {
+ state = EQ;
+ currAttrStartOffset = currAttrStartOffset<0 ? ts.offset() : currAttrStartOffset;
+ currAttrQuated = true;//currently is used in cc and we support qq for one literal only, may need to be revieved later for "combined" cases
+ currAttrValue = Utils.unquote(titk.text().toString());
+ break;
+ }
default:
//we reached end of the annotation, or error
state = ERROR;
diff --git a/java/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/editor/completion/ETCompletionContextResolver.java b/java/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/editor/completion/ETCompletionContextResolver.java
index edf1a2a..f806c40 100644
--- a/java/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/editor/completion/ETCompletionContextResolver.java
+++ b/java/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/editor/completion/ETCompletionContextResolver.java
@@ -80,6 +80,8 @@ public class ETCompletionContextResolver implements CompletionContextResolver {
completeJPQLContext(ctx, ctx.getMethod(), result);
} else if("NamedQuery".equals(annotationName)){//NOI18N
completeJPQLContext(ctx, parsedNN, nnattr, result);
+ } else if("Query".equals(annotationName) && parsedNN.getAttributesList().size() == 1){//NOI18N
+ completeJPQLContext(ctx, parsedNN, nnattr, result);
}
@@ -119,7 +121,7 @@ public class ETCompletionContextResolver implements CompletionContextResolver {
private List completeJPQLContext(JPACodeCompletionProvider.Context ctx, CCParser.CC nn, CCParser.NNAttr nnattr, List<JPACompletionItem> results) {
String completedMember = nnattr.getName();
- if ("query".equals(completedMember)) { // NOI18N
+ if (completedMember == null || "query".equals(completedMember)) { // NOI18N
String completedValue = nnattr.getValue().toString() == null ? "" : nnattr.getValue().toString();
DefaultJPQLQueryHelper helper = new DefaultJPQLQueryHelper(DefaultJPQLGrammar.instance());
diff --git a/java/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/editor/completion/JPACodeCompletionProvider.java b/java/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/editor/completion/JPACodeCompletionProvider.java
index 88ebd56..ff29a36 100644
--- a/java/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/editor/completion/JPACodeCompletionProvider.java
+++ b/java/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/editor/completion/JPACodeCompletionProvider.java
@@ -22,6 +22,7 @@ import com.sun.source.util.TreePath;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.*;
+import java.util.function.Consumer;
import javax.lang.model.element.ElementKind;
import javax.lang.model.type.TypeKind;
import javax.swing.text.Document;
@@ -46,10 +47,12 @@ import org.netbeans.modules.parsing.api.ParserManager;
import org.netbeans.modules.parsing.api.ResultIterator;
import org.netbeans.modules.parsing.api.Source;
import org.netbeans.modules.parsing.api.UserTask;
+import org.netbeans.modules.parsing.spi.ParseException;
import org.netbeans.modules.parsing.spi.Parser.Result;
import org.netbeans.spi.editor.completion.*;
import org.netbeans.spi.editor.completion.support.AsyncCompletionQuery;
import org.netbeans.spi.editor.completion.support.AsyncCompletionTask;
+import org.netbeans.spi.lsp.CompletionCollector;
import org.openide.ErrorManager;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.URLMapper;
@@ -70,7 +73,7 @@ public class JPACodeCompletionProvider implements CompletionProvider {
if (queryType != CompletionProvider.COMPLETION_QUERY_TYPE && queryType != CompletionProvider.COMPLETION_ALL_QUERY_TYPE) {
return null;
}
- return new AsyncCompletionTask(new JPACodeCompletionQuery(queryType, component, component.getSelectionStart(), true), component);
+ return new AsyncCompletionTask(new JPACodeCompletionQuery(queryType, component.getDocument(), component.getSelectionStart(), true), component);
}
@Override
@@ -78,22 +81,42 @@ public class JPACodeCompletionProvider implements CompletionProvider {
return 0;//will not appear automatically
}
- class JPACodeCompletionQuery extends AsyncCompletionQuery {
+ @MimeRegistration(mimeType = "text/x-java", service = CompletionCollector.class) //NOI18N
+ public static class JPACompletionCollector implements CompletionCollector {
+
+ @Override
+ public boolean collectCompletions(Document doc, int offset, org.netbeans.api.lsp.Completion.Context context, Consumer<org.netbeans.api.lsp.Completion> consumer) {
+ JPACodeCompletionQuery query = new JPACodeCompletionQuery(COMPLETION_QUERY_TYPE, doc, offset, false);
+ try {
+ query.doQuery(doc, offset);
+ } catch (ParseException ex) {
+ Exceptions.printStackTrace(ex);
+ }
+ for (JPACompletionItem result : query.results) {
+ Builder builder = CompletionCollector.newBuilder(result instanceof JPACompletionItem.DBElementItem ? ((JPACompletionItem.DBElementItem) result).getName() : result.getItemText())
+ .sortText(String.format("%04d%s", result.getSortPriority(), result.getSortText()));
+ consumer.accept(builder.build());
+ }
+ return query.hasAdditionalItems == 0;
+ }
+ }
+
+ static class JPACodeCompletionQuery extends AsyncCompletionQuery {
private ArrayList<CompletionContextResolver> resolvers;
private List<JPACompletionItem> results;
private byte hasAdditionalItems = 0; //no additional items
private int anchorOffset;
- private JTextComponent component;
+ private Document doc;
private int queryType;
private int caretOffset;
private boolean hasTask;
- public JPACodeCompletionQuery(int queryType, JTextComponent component, int caretOffset, boolean hasTask) {
+ public JPACodeCompletionQuery(int queryType, Document doc, int caretOffset, boolean hasTask) {
this.queryType = queryType;
this.caretOffset = caretOffset;
this.hasTask = hasTask;
- this.component = component;
+ this.doc = doc;
initResolvers();
}
@@ -106,40 +129,38 @@ public class JPACodeCompletionProvider implements CompletionProvider {
@Override
protected void query(CompletionResultSet resultSet, Document doc, int caretOffset) {
- {
- try {
- this.caretOffset = caretOffset;
- //if (queryType == TOOLTIP_QUERY_TYPE || Utilities.isJavaContext(component, caretOffset))
- {
- results = null;
- anchorOffset = -1;
- Source source = Source.create(doc);
- if (source != null) {
- ParserManager.parse(Collections.singletonList(source), getTask());
- if ((queryType & COMPLETION_QUERY_TYPE) != 0) {
- if (results != null) {
- resultSet.addAllItems(results);
- }
- resultSet.setHasAdditionalItems(hasAdditionalItems > 0);
- if (hasAdditionalItems == 1) {
- resultSet.setHasAdditionalItemsText(NbBundle.getMessage(JPACodeCompletionProvider.class, "JCP-imported-items")); //NOI18N
- }
- if (hasAdditionalItems == 2) {
- resultSet.setHasAdditionalItemsText(NbBundle.getMessage(JPACodeCompletionProvider.class, "JCP-instance-members")); //NOI18N
- }
- }
- if (anchorOffset > -1) {
- resultSet.setAnchorOffset(anchorOffset);
- }
- }
+ try {
+ doQuery(doc, caretOffset);
+ if ((queryType & COMPLETION_QUERY_TYPE) != 0) {
+ if (results != null) {
+ resultSet.addAllItems(results);
+ }
+ resultSet.setHasAdditionalItems(hasAdditionalItems > 0);
+ if (hasAdditionalItems == 1) {
+ resultSet.setHasAdditionalItemsText(NbBundle.getMessage(JPACodeCompletionProvider.class, "JCP-imported-items")); //NOI18N
}
- } catch (Exception e) {
- Exceptions.printStackTrace(e);
- } finally {
- resultSet.finish();
+ if (hasAdditionalItems == 2) {
+ resultSet.setHasAdditionalItemsText(NbBundle.getMessage(JPACodeCompletionProvider.class, "JCP-instance-members")); //NOI18N
+ }
+ }
+ if (anchorOffset > -1) {
+ resultSet.setAnchorOffset(anchorOffset);
}
+ } catch (Exception e) {
+ Exceptions.printStackTrace(e);
+ } finally {
+ resultSet.finish();
}
+ }
+ private void doQuery(Document doc, int caretOffset) throws ParseException {
+ this.caretOffset = caretOffset;
+ results = null;
+ anchorOffset = -1;
+ Source source = Source.create(doc);
+ if (source != null) {
+ ParserManager.parse(Collections.singletonList(source), getTask());
+ }
}
private UserTask getTask() {
@@ -182,7 +203,7 @@ public class JPACodeCompletionProvider implements CompletionProvider {
}
private void run(CompilationController controller) {
- if(hasTask && !isTaskCancelled()){
+ if (!hasTask || !isTaskCancelled()){
int startOffset = caretOffset;
Iterator resolversItr = resolvers.iterator();
TreePath env = null;
@@ -237,7 +258,7 @@ public class JPACodeCompletionProvider implements CompletionProvider {
@Override
public Boolean run(EntityMappingsMetadata metadata) throws Exception {
- Context ctx = new Context(component, controller, startOffset, false);
+ Context ctx = new Context(doc, controller, startOffset, false);
if (ctx.getEntityMappings() == null) {
ErrorManager.getDefault().log(ErrorManager.INFORMATIONAL, "No EnitityMappings defined.");
} else {
@@ -262,7 +283,7 @@ public class JPACodeCompletionProvider implements CompletionProvider {
}
//
- private TreePath getCompletionTreePath(CompilationController controller, int curOffset, int queryType) throws IOException {
+ private static TreePath getCompletionTreePath(CompilationController controller, int curOffset, int queryType) throws IOException {
controller.toPhase(Phase.PARSED);
int offset = controller.getSnapshot().getEmbeddedOffset(curOffset);
if (offset < 0) {
@@ -304,12 +325,12 @@ public class JPACodeCompletionProvider implements CompletionProvider {
return path;
}
- public final class Context {
+ public static final class Context {
/**
- * Text component
+ * Document
*/
- private JTextComponent component;
+ private Document doc;
CompilationController controller;
/**
* End position of the scanning - usually the caret position
@@ -322,8 +343,8 @@ public class JPACodeCompletionProvider implements CompletionProvider {
private CCParser.CC parsednn = null;
private CCParser.MD methodName = null;
- public Context(JTextComponent component, CompilationController controller, int endOffset, boolean autoPopup) {
- this.component = component;
+ public Context(Document doc, CompilationController controller, int endOffset, boolean autoPopup) {
+ this.doc = doc;
this.controller = controller;
this.endOffset = endOffset;
@@ -364,8 +385,7 @@ public class JPACodeCompletionProvider implements CompletionProvider {
}
public BaseDocument getBaseDocument() {
- BaseDocument doc = (BaseDocument) component.getDocument();
- return doc;
+ return (BaseDocument) doc;
}
public FileObject getFileObject() {
diff --git a/java/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/editor/completion/JPACompletionItem.java b/java/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/editor/completion/JPACompletionItem.java
index 32a1177..cb5b150 100644
--- a/java/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/editor/completion/JPACompletionItem.java
+++ b/java/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/editor/completion/JPACompletionItem.java
@@ -285,7 +285,7 @@ public abstract class JPACompletionItem implements CompletionItem {
return substituteText(component, substOffset, component.getCaret().getDot() - substOffset, false);
}
- private abstract static class DBElementItem extends JPACompletionItem {
+ abstract static class DBElementItem extends JPACompletionItem {
private String name;
private boolean quote;
diff --git a/java/java.lsp.server/nbcode/nbproject/platform.properties b/java/java.lsp.server/nbcode/nbproject/platform.properties
index 859b736..b079f8f 100644
--- a/java/java.lsp.server/nbcode/nbproject/platform.properties
+++ b/java/java.lsp.server/nbcode/nbproject/platform.properties
@@ -122,8 +122,6 @@ disabled.modules=\
org.netbeans.modules.db.mysql,\
org.netbeans.modules.db.sql.editor,\
org.netbeans.modules.db.sql.visualeditor,\
- org.netbeans.modules.dbapi,\
- org.netbeans.modules.dbschema,\
org.netbeans.modules.deadlock.detector,\
org.netbeans.modules.debugger.jpda.ant,\
org.netbeans.modules.debugger.jpda.js,\
@@ -145,7 +143,6 @@ disabled.modules=\
org.netbeans.modules.editor.plain,\
org.netbeans.modules.editor.plain.lib,\
org.netbeans.modules.editor.search,\
- org.netbeans.modules.editor.structure,\
org.netbeans.modules.editor.tools.storage,\
org.netbeans.modules.extbrowser.chrome,\
org.netbeans.modules.extexecution.impl,\
@@ -158,7 +155,6 @@ disabled.modules=\
org.netbeans.modules.gradle.htmlui,\
org.netbeans.modules.gradle.java.coverage,\
org.netbeans.modules.gradle.kit,\
- org.netbeans.modules.gradle.persistence,\
org.netbeans.modules.gradle.spring,\
org.netbeans.modules.html.angular,\
org.netbeans.modules.html.custom,\
@@ -181,16 +177,9 @@ disabled.modules=\
org.netbeans.modules.ide.branding.kit,\
org.netbeans.modules.ide.kit,\
org.netbeans.modules.image,\
- org.netbeans.modules.j2ee.core.utilities,\
- org.netbeans.modules.j2ee.eclipselink,\
- org.netbeans.modules.j2ee.eclipselinkmodelgen,\
org.netbeans.modules.j2ee.jpa.refactoring,\
org.netbeans.modules.j2ee.jpa.verification,\
- org.netbeans.modules.j2ee.metadata,\
- org.netbeans.modules.j2ee.metadata.model.support,\
- org.netbeans.modules.j2ee.persistence,\
org.netbeans.modules.j2ee.persistence.kit,\
- org.netbeans.modules.j2ee.persistenceapi,\
org.netbeans.modules.java.editor.lib,\
org.netbeans.modules.java.examples,\
org.netbeans.modules.java.freeform,\
@@ -209,7 +198,6 @@ disabled.modules=\
org.netbeans.modules.java.source.compat8,\
org.netbeans.modules.java.testrunner.ant,\
org.netbeans.modules.javadoc,\
- org.netbeans.modules.javaee.injection,\
org.netbeans.modules.javascript.bower,\
org.netbeans.modules.javascript.cdnjs,\
org.netbeans.modules.javascript.grunt,\
@@ -256,7 +244,6 @@ disabled.modules=\
org.netbeans.modules.maven.hints,\
org.netbeans.modules.maven.kit,\
org.netbeans.modules.maven.osgi,\
- org.netbeans.modules.maven.persistence,\
org.netbeans.modules.maven.refactoring,\
org.netbeans.modules.maven.repository,\
org.netbeans.modules.maven.search,\
@@ -273,7 +260,6 @@ disabled.modules=\
org.netbeans.modules.projectimport.eclipse.core,\
org.netbeans.modules.projectimport.eclipse.j2se,\
org.netbeans.modules.projectui.buildmenu,\
- org.netbeans.modules.schema2beans,\
org.netbeans.modules.selenium2.java,\
org.netbeans.modules.selenium2.maven,\
org.netbeans.modules.selenium2.webclient.mocha,\
@@ -325,12 +311,10 @@ disabled.modules=\
org.netbeans.modules.xml.catalog.ui,\
org.netbeans.modules.xml.jaxb,\
org.netbeans.modules.xml.jaxb.api,\
- org.netbeans.modules.xml.multiview,\
org.netbeans.modules.xml.retriever,\
org.netbeans.modules.xml.schema.completion,\
org.netbeans.modules.xml.schema.model,\
org.netbeans.modules.xml.tax,\
- org.netbeans.modules.xml.text,\
org.netbeans.modules.xml.text.obsolete90,\
org.netbeans.modules.xml.tools,\
org.netbeans.modules.xml.tools.java,\
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists