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