You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by ge...@apache.org on 2021/04/16 10:07:07 UTC

[netbeans] branch master updated: Fix parsing of constraints if the current parser does not have source files.

This is an automated email from the ASF dual-hosted git repository.

geertjan 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 f05bf43  Fix parsing of constraints if the current parser does not have source files.
     new c3f8aa7  Merge pull request #2892 from jlahoda/fix-constraint-parsing
f05bf43 is described below

commit f05bf43ea71a8db3795f0769c5184ccb1982d12f
Author: Jan Lahoda <jl...@netbeans.org>
AuthorDate: Thu Apr 15 07:20:39 2021 +0200

    Fix parsing of constraints if the current parser does not have source files.
---
 .../declarative/idebinding/HintsTaskTest.java      |  22 +++-
 .../netbeans/modules/java/hints/spiimpl/Hacks.java | 112 +++++----------------
 2 files changed, 48 insertions(+), 86 deletions(-)

diff --git a/java/java.hints.declarative/test/unit/src/org/netbeans/modules/java/hints/declarative/idebinding/HintsTaskTest.java b/java/java.hints.declarative/test/unit/src/org/netbeans/modules/java/hints/declarative/idebinding/HintsTaskTest.java
index 1510574..c3aab18 100644
--- a/java/java.hints.declarative/test/unit/src/org/netbeans/modules/java/hints/declarative/idebinding/HintsTaskTest.java
+++ b/java/java.hints.declarative/test/unit/src/org/netbeans/modules/java/hints/declarative/idebinding/HintsTaskTest.java
@@ -120,7 +120,27 @@ public class HintsTaskTest extends TestBase {
         
         assertFalse(new HashSet<String>(errors).contains("ERR_RemoveExpression"));
     }
-    
+
+    public void testTypeConditions() throws Exception {
+        prepareTest("test/Test.java", "");
+
+        FileObject hint = sourceRoot.createData("test.hint");
+        String code = "$1.length() :: $1 instanceof java.lang.String;;";
+
+        TestUtilities.copyStringToFile(hint, code);
+
+        TokenHierarchy<?> h = TokenHierarchy.create(code, DeclarativeHintTokenId.language());
+        DeclarativeHintsParser.Result res = new DeclarativeHintsParser().parse(hint, code, h.tokenSequence(DeclarativeHintTokenId.language()));
+        List<ErrorDescription> errorInstances = HintsTask.computeErrors(res, code, hint);
+        List<String> errors = new ArrayList<String>();
+
+        for (ErrorDescription ed : errorInstances) {
+            errors.add(ed.toString());
+        }
+
+        assertEquals(Arrays.asList(), errors);
+    }
+
     static {
         NbBundle.setBranding("test");
     }
diff --git a/java/spi.java.hints/src/org/netbeans/modules/java/hints/spiimpl/Hacks.java b/java/spi.java.hints/src/org/netbeans/modules/java/hints/spiimpl/Hacks.java
index 43e5c25..b031e03 100644
--- a/java/spi.java.hints/src/org/netbeans/modules/java/hints/spiimpl/Hacks.java
+++ b/java/spi.java.hints/src/org/netbeans/modules/java/hints/spiimpl/Hacks.java
@@ -20,44 +20,36 @@
 package org.netbeans.modules.java.hints.spiimpl;
 
 import com.sun.source.tree.BlockTree;
-import com.sun.source.tree.CompilationUnitTree;
 import com.sun.source.tree.LambdaExpressionTree;
 import com.sun.source.tree.MethodTree;
 import com.sun.source.tree.Scope;
+import com.sun.source.tree.StatementTree;
 import com.sun.source.tree.Tree;
+import com.sun.source.tree.Tree.Kind;
+import com.sun.source.tree.VariableTree;
+import com.sun.source.util.SourcePositions;
 import com.sun.source.util.TreePath;
 import org.netbeans.api.java.source.support.ErrorAwareTreePathScanner;
-import com.sun.tools.javac.api.JavacTaskImpl;
 import com.sun.tools.javac.code.Symbol.ClassSymbol;
 import com.sun.tools.javac.comp.AttrContext;
 import com.sun.tools.javac.comp.Enter;
 import com.sun.tools.javac.comp.Env;
-import com.sun.tools.javac.main.JavaCompiler;
 import com.sun.tools.javac.tree.JCTree;
 import com.sun.tools.javac.tree.JCTree.JCErroneous;
-import com.sun.tools.javac.util.Context;
-import com.sun.tools.javac.util.Log;
-
-import java.io.File;
-import java.io.IOException;
 import java.util.Collections;
 
 import javax.lang.model.element.Element;
 import javax.lang.model.element.TypeElement;
 import javax.lang.model.element.VariableElement;
 import javax.lang.model.type.TypeMirror;
-import javax.tools.JavaFileObject;
-
-import com.sun.tools.javac.parser.ParserFactory;
 import com.sun.tools.javac.tree.JCTree.JCLambda;
+import java.util.List;
 import org.netbeans.api.annotations.common.CheckForNull;
 import org.netbeans.api.annotations.common.NonNull;
 import org.netbeans.api.java.source.CompilationInfo;
 import org.netbeans.api.java.source.TreeUtilities;
 import org.netbeans.modules.java.hints.providers.spi.HintMetadata;
 import org.netbeans.modules.java.source.JavaSourceAccessor;
-import org.netbeans.modules.java.source.parsing.FileObjects;
-import org.openide.util.Exceptions;
 
 /**
  *
@@ -65,72 +57,10 @@ import org.openide.util.Exceptions;
  */
 public class Hacks {
 
-    //XXX: copied from Utilities, for declarative hints, different import management:
-    private static long inc;
-
-    public static Scope constructScope(CompilationInfo info, String... importedClasses) {
-        StringBuilder clazz = new StringBuilder();
-
-        clazz.append("package $$;\n");
-
-        for (String i : importedClasses) {
-            clazz.append("import ").append(i).append(";\n");
-        }
-
-        clazz.append("public class $$scopeclass$").append(inc++).append("{");
-
-        clazz.append("private void test() {\n");
-        clazz.append("}\n");
-        clazz.append("}\n");
-
-        JavacTaskImpl jti = JavaSourceAccessor.getINSTANCE().getJavacTask(info);
-        Context context = jti.getContext();
-
-        JavaCompiler jc = JavaCompiler.instance(context);
-        Log.instance(context).nerrors = 0;
-
-        JavaFileObject jfo = FileObjects.memoryFileObject("$$", "$", new File("/tmp/t.java").toURI(), System.currentTimeMillis(), clazz.toString());
-
-        try {
-            CompilationUnitTree cut = ParserFactory.instance(context).newParser(jfo.getCharContent(true), true, true, true).parseCompilationUnit();
-
-            jti.analyze(jti.enter(Collections.singletonList(cut)));
-
-            return new ScannerImpl().scan(cut, info);
-        } catch (IOException ex) {
-            Exceptions.printStackTrace(ex);
-            return null;
-        } finally {
-        }
-    }
-
     public static void copyLambdaKind(LambdaExpressionTree node, LambdaExpressionTree nue) {
         ((JCLambda) nue).paramKind = ((JCLambda) node).paramKind;
     }
 
-    private static final class ScannerImpl extends ErrorAwareTreePathScanner<Scope, CompilationInfo> {
-
-        @Override
-        public Scope visitBlock(BlockTree node, CompilationInfo p) {
-            return p.getTrees().getScope(getCurrentPath());
-        }
-
-        @Override
-        public Scope visitMethod(MethodTree node, CompilationInfo p) {
-            if (node.getReturnType() == null) {
-                return null;
-            }
-            return super.visitMethod(node, p);
-        }
-
-        @Override
-        public Scope reduce(Scope r1, Scope r2) {
-            return r1 != null ? r1 : r2;
-        }
-
-    }
-
-
     public static Tree createRenameTree(@NonNull Tree originalTree, @NonNull String newName) {
         return new RenameTree(originalTree, newName);
     }
@@ -153,19 +83,31 @@ public class Hacks {
             return null;
         }
         
-        TypeElement jlObject = info.getElements().getTypeElement("java.lang.Object");
-        
-        //XXX:
-        TypeElement scope;
-
         if (info.getTopLevelElements().isEmpty()) {
-            scope = jlObject;
+            //TreeUtilities.parseType requires a type that originates in source, but we have none.
+            //so, use a synthetic scope (keeping the case where we have a type that originates in source,
+            //to keep compatibility:
+            StatementTree block = info.getTreeUtilities().parseStatement("{" + spec + " $;}", new SourcePositions[1]);
+
+            if (block.getKind() != Kind.BLOCK) {
+                return null;
+            }
+
+            List<? extends StatementTree> statements = ((BlockTree) block).getStatements();
+
+            if (statements.size() != 1 || statements.get(0).getKind() != Kind.VARIABLE) {
+                return null;
+            }
+
+            VariableTree var = (VariableTree) statements.get(0);
+            Scope scope = Utilities.constructScope(info, Collections.emptyMap());
+
+            info.getTreeUtilities().attributeTree(var, scope);
+
+            return info.getTrees().getTypeMirror(new TreePath(new TreePath(info.getCompilationUnit()), var.getType()));
         } else {
-            scope = info.getTopLevelElements().iterator().next();
+            return info.getTreeUtilities().parseType(spec, info.getTopLevelElements().iterator().next());
         }
-        //XXX end
-        
-        return info.getTreeUtilities().parseType(spec, /*XXX: jlObject*/scope);
     }
 
     public static VariableElement attributeThis(CompilationInfo info, TreePath tp) {

---------------------------------------------------------------------
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