You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by ne...@apache.org on 2019/07/03 11:53:02 UTC

[netbeans] branch master updated: [NETBEANS-2240] (partial) Switch DeferredComplationFailureHandler to javac move before running JavacTaskImpl.enter(), to ensure CompletionFailures are handled properly.

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

neilcsmith 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 b716d88  [NETBEANS-2240] (partial) Switch DeferredComplationFailureHandler to javac move before running JavacTaskImpl.enter(), to ensure CompletionFailures are handled properly.
     new 12f7f5e  Merge pull request #1352 from jlahoda/NETBEANS-2240-deferredcompletionhandler
b716d88 is described below

commit b716d887d4673a4698905b378a2476cb7a3f721e
Author: Jan Lahoda <jl...@netbeans.org>
AuthorDate: Tue Jul 2 23:05:53 2019 +0200

    [NETBEANS-2240] (partial) Switch DeferredComplationFailureHandler to javac move before running JavacTaskImpl.enter(), to ensure CompletionFailures are handled properly.
---
 .../modules/java/source/parsing/JavacParser.java   | 43 ++++++++++++++++++++-
 .../java/source/parsing/JavacParserTest.java       | 45 +++++++++++++++++++++-
 2 files changed, 86 insertions(+), 2 deletions(-)

diff --git a/java/java.source.base/src/org/netbeans/modules/java/source/parsing/JavacParser.java b/java/java.source.base/src/org/netbeans/modules/java/source/parsing/JavacParser.java
index 40a4091..62f3156 100644
--- a/java/java.source.base/src/org/netbeans/modules/java/source/parsing/JavacParser.java
+++ b/java/java.source.base/src/org/netbeans/modules/java/source/parsing/JavacParser.java
@@ -43,6 +43,9 @@ import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.lang.ref.Reference;
 import java.lang.ref.WeakReference;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -59,6 +62,8 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.util.stream.Collectors;
@@ -619,7 +624,43 @@ public class JavacParser extends Parser {
                     return Phase.MODIFIED;
                 }
                 long start = System.currentTimeMillis();
-                currentInfo.getJavacTask().enter();
+                Supplier<Object> setJavacHandler = () -> null;
+                Consumer<Object> restoreHandler = h -> {};
+                try {
+                    //the DeferredCompletionFailureHandler should be set to javac mode:
+                    Class<?> dcfhClass = Class.forName("com.sun.tools.javac.code.DeferredCompletionFailureHandler");
+                    Class<?> dcfhHandlerClass = Class.forName("com.sun.tools.javac.code.DeferredCompletionFailureHandler$Handler");
+                    Object dcfh = dcfhClass.getDeclaredMethod("instance", Context.class).invoke(null, currentInfo.getJavacTask().getContext());
+                    Method setHandler = dcfhClass.getDeclaredMethod("setHandler", dcfhHandlerClass);
+                    Object javacCodeHandler = dcfhClass.getDeclaredField("javacCodeHandler").get(dcfh);
+
+                    setJavacHandler = () -> {
+                        try {
+                            return setHandler.invoke(dcfh, javacCodeHandler);
+                        } catch (ReflectiveOperationException ex) {
+                            LOGGER.log(Level.FINE, null, ex);
+                            return null;
+                        }
+                    };
+                    restoreHandler = h -> {
+                        if (h != null) {
+                            try {
+                                setHandler.invoke(dcfh, h);
+                            } catch (ReflectiveOperationException ex) {
+                                LOGGER.log(Level.WARNING, null, ex);
+                            }
+                        }
+                    };
+                } catch (ReflectiveOperationException | SecurityException ex) {
+                    //ignore
+                    LOGGER.log(Level.FINEST, null, ex);
+                }
+                Object oldHandler = setJavacHandler.get();
+                try {
+                    currentInfo.getJavacTask().enter();
+                } finally {
+                    restoreHandler.accept(oldHandler);
+                }
                 currentPhase = Phase.ELEMENTS_RESOLVED;
                 long end = System.currentTimeMillis();
                 logTime(currentInfo.getFileObject(),currentPhase,(end-start));
diff --git a/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/JavacParserTest.java b/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/JavacParserTest.java
index bfadaae..e4dbec9 100644
--- a/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/JavacParserTest.java
+++ b/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/JavacParserTest.java
@@ -28,7 +28,9 @@ import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.OutputStream;
 import java.io.OutputStreamWriter;
+import java.net.URI;
 import java.net.URL;
 import java.util.Arrays;
 import java.util.Collection;
@@ -43,9 +45,12 @@ import javax.swing.event.ChangeListener;
 import javax.swing.text.Document;
 import javax.tools.Diagnostic;
 import javax.tools.JavaFileObject.Kind;
+import javax.tools.SimpleJavaFileObject;
+import javax.tools.ToolProvider;
 import static junit.framework.TestCase.assertEquals;
 import org.netbeans.api.editor.mimelookup.MimePath;
 import org.netbeans.api.editor.mimelookup.test.MockMimeLookup;
+import org.netbeans.api.java.classpath.ClassPath;
 import org.netbeans.api.java.lexer.JavaTokenId;
 import org.netbeans.api.java.source.ClasspathInfo;
 import org.netbeans.api.java.source.CompilationController;
@@ -92,6 +97,7 @@ public class JavacParserTest extends NbTestCase {
     }
 
     private FileObject sourceRoot;
+    private FileObject cp;
 
     protected void setUp() throws Exception {
         SourceUtilsTestUtil.prepareTest(new String[0], new Object[] {settings});
@@ -517,6 +523,42 @@ public class JavacParserTest extends NbTestCase {
         assertEquals(input, JavacParser.validateCompilerOptions(input, com.sun.tools.javac.code.Source.lookup("10")));
     }
 
+    public void testMissingSupertype() throws Exception {
+        FileObject file = createFile("test/Test.java", "package test; class Test extends Super {}");
+
+        createFile("test/Super.java", "package test; class Super extends Missing {}");
+
+        List<String> missingCompileOptions = Arrays.asList("-source", "8", "-d", FileUtil.toFile(cp).getAbsolutePath());
+        SimpleJavaFileObject missingFO = new SimpleJavaFileObject(URI.create("mem://Missing.java"), Kind.SOURCE) {
+            @Override
+            public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
+                return "package test; public class Missing {}";
+            }
+            @Override
+            public boolean isNameCompatible(String simpleName, Kind kind) {
+                return "Missing".equals(simpleName);
+            }
+        };
+
+        assertTrue(ToolProvider.getSystemJavaCompiler().getTask(null, null, null, missingCompileOptions, null, Arrays.asList(missingFO)).call());
+
+        FileObject testClass = cp.getFileObject("test/Missing.class");
+
+        assertNotNull(testClass);
+
+        JavaSource js = JavaSource.forFileObject(file);
+
+        SourceUtilsTestUtil.compileRecursively(sourceRoot);
+
+        testClass.delete();
+
+        js.runUserActionTask(new Task<CompilationController>() {
+            public void run(CompilationController parameter) throws Exception {
+                parameter.toPhase(Phase.RESOLVED);
+            }
+        }, true);
+    }
+
     private FileObject createFile(String path, String content) throws Exception {
         FileObject file = FileUtil.createData(sourceRoot, path);
         TestUtilities.copyStringToFile(file, content);
@@ -531,11 +573,12 @@ public class JavacParserTest extends NbTestCase {
         assertNotNull(workFO);
 
         sourceRoot = workFO.createFolder("src");
+        cp = workFO.createFolder("cp");
         
         FileObject buildRoot  = workFO.createFolder("build");
         FileObject cache = workFO.createFolder("cache");
 
-        SourceUtilsTestUtil.prepareTest(sourceRoot, buildRoot, cache);
+        SourceUtilsTestUtil.prepareTest(sourceRoot, buildRoot, cache, new FileObject[] {cp});
     }
     
     private static void copyResource(URL resource, File file) throws IOException {


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