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