8208184: IllegalArgumentException while invoking code completion on netbeans IDE
Set Log.useSource and fix the issue in Modules.java when broken module is encountered Co-authored-by: Jan Lahoda <jan.lahoda@oracle.com> Reviewed-by: jjg
This commit is contained in:
parent
4769c9fbad
commit
ead8577920
@ -450,7 +450,12 @@ public class Modules extends JCTree.Visitor {
|
|||||||
String moduleOverride = singleModuleOverride(trees);
|
String moduleOverride = singleModuleOverride(trees);
|
||||||
switch (rootModules.size()) {
|
switch (rootModules.size()) {
|
||||||
case 0:
|
case 0:
|
||||||
defaultModule = moduleFinder.findSingleModule();
|
try {
|
||||||
|
defaultModule = moduleFinder.findSingleModule();
|
||||||
|
} catch (CompletionFailure cf) {
|
||||||
|
chk.completionError(null, cf);
|
||||||
|
defaultModule = syms.unnamedModule;
|
||||||
|
}
|
||||||
if (defaultModule == syms.unnamedModule) {
|
if (defaultModule == syms.unnamedModule) {
|
||||||
if (moduleOverride != null) {
|
if (moduleOverride != null) {
|
||||||
checkNoAllModulePath();
|
checkNoAllModulePath();
|
||||||
|
@ -1761,6 +1761,7 @@ public class JavaCompiler {
|
|||||||
private Name parseAndGetName(JavaFileObject fo,
|
private Name parseAndGetName(JavaFileObject fo,
|
||||||
Function<JCTree.JCCompilationUnit, Name> tree2Name) {
|
Function<JCTree.JCCompilationUnit, Name> tree2Name) {
|
||||||
DiagnosticHandler dh = new DiscardDiagnosticHandler(log);
|
DiagnosticHandler dh = new DiscardDiagnosticHandler(log);
|
||||||
|
JavaFileObject prevSource = log.useSource(fo);
|
||||||
try {
|
try {
|
||||||
JCTree.JCCompilationUnit t = parse(fo, fo.getCharContent(false));
|
JCTree.JCCompilationUnit t = parse(fo, fo.getCharContent(false));
|
||||||
return tree2Name.apply(t);
|
return tree2Name.apply(t);
|
||||||
@ -1768,6 +1769,7 @@ public class JavaCompiler {
|
|||||||
return null;
|
return null;
|
||||||
} finally {
|
} finally {
|
||||||
log.popDiagnosticHandler(dh);
|
log.popDiagnosticHandler(dh);
|
||||||
|
log.useSource(prevSource);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @test
|
* @test
|
||||||
|
* @bug 8208184
|
||||||
* @summary tests for module resolution
|
* @summary tests for module resolution
|
||||||
* @library /tools/lib
|
* @library /tools/lib
|
||||||
* @modules
|
* @modules
|
||||||
@ -33,19 +34,33 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
import java.nio.file.*;
|
import java.nio.file.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import javax.annotation.processing.AbstractProcessor;
|
import javax.annotation.processing.AbstractProcessor;
|
||||||
import javax.annotation.processing.RoundEnvironment;
|
import javax.annotation.processing.RoundEnvironment;
|
||||||
import javax.annotation.processing.SupportedAnnotationTypes;
|
import javax.annotation.processing.SupportedAnnotationTypes;
|
||||||
import javax.annotation.processing.SupportedSourceVersion;
|
|
||||||
import javax.lang.model.SourceVersion;
|
import javax.lang.model.SourceVersion;
|
||||||
import javax.lang.model.element.TypeElement;
|
import javax.lang.model.element.TypeElement;
|
||||||
|
import javax.tools.FileObject;
|
||||||
|
import javax.tools.ForwardingJavaFileManager;
|
||||||
import javax.tools.JavaCompiler;
|
import javax.tools.JavaCompiler;
|
||||||
|
import javax.tools.JavaFileManager;
|
||||||
|
import javax.tools.JavaFileObject;
|
||||||
|
import javax.tools.JavaFileObject.Kind;
|
||||||
|
import javax.tools.SimpleJavaFileObject;
|
||||||
import javax.tools.StandardJavaFileManager;
|
import javax.tools.StandardJavaFileManager;
|
||||||
|
import javax.tools.StandardLocation;
|
||||||
import javax.tools.ToolProvider;
|
import javax.tools.ToolProvider;
|
||||||
|
|
||||||
// import com.sun.source.util.JavacTask;
|
// import com.sun.source.util.JavacTask;
|
||||||
@ -427,6 +442,125 @@ public class QueryBeforeEnter extends ModuleTestBase {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBrokenModule(Path base) throws Exception {
|
||||||
|
Map<String, String> sourceFileName2Content = new HashMap<>();
|
||||||
|
|
||||||
|
sourceFileName2Content.put("module-info.java", "module test { requires unknown.; } ");
|
||||||
|
sourceFileName2Content.put("test/Test.java", "package test; public class Test {}");
|
||||||
|
|
||||||
|
Path out = base.resolve("out");
|
||||||
|
|
||||||
|
Files.createDirectories(out);
|
||||||
|
|
||||||
|
JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
|
||||||
|
try (StandardJavaFileManager fm = javaCompiler.getStandardFileManager(null, null, null)) {
|
||||||
|
com.sun.source.util.JavacTask task =
|
||||||
|
(com.sun.source.util.JavacTask) javaCompiler.getTask(null,
|
||||||
|
new TestMemoryFileManager(fm, sourceFileName2Content),
|
||||||
|
null,
|
||||||
|
Arrays.asList("-d", out.toString()),
|
||||||
|
null,
|
||||||
|
null);
|
||||||
|
task.getElements().getTypeElement("test.Test");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final class TestMemoryFileManager extends ForwardingJavaFileManager<JavaFileManager> {
|
||||||
|
|
||||||
|
private final Map<String, String> sourceFileName2Content;
|
||||||
|
|
||||||
|
public TestMemoryFileManager(JavaFileManager fileManager, Map<String, String> sourceFileName2Content) {
|
||||||
|
super(fileManager);
|
||||||
|
this.sourceFileName2Content = sourceFileName2Content;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<JavaFileObject> list(Location location, String packageName, Set<Kind> kinds, boolean recurse) throws IOException {
|
||||||
|
if (location == StandardLocation.SOURCE_PATH) {
|
||||||
|
List<JavaFileObject> result = new ArrayList<>();
|
||||||
|
String dir = packageName.replace('.', '/') + "/";
|
||||||
|
|
||||||
|
for (Entry<String, String> e : sourceFileName2Content.entrySet()) {
|
||||||
|
if (e.getKey().startsWith(dir) &&
|
||||||
|
!e.getKey().substring(dir.length()).contains("/")) {
|
||||||
|
try {
|
||||||
|
result.add(new SourceFileObject(e.getKey(), e.getValue()));
|
||||||
|
} catch (URISyntaxException ex) {
|
||||||
|
throw new IOException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return super.list(location, packageName, kinds, recurse);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JavaFileObject getJavaFileForInput(Location location, String className, Kind kind) throws IOException {
|
||||||
|
if (location == StandardLocation.SOURCE_PATH) {
|
||||||
|
String path = className.replace('.', '/') + ".java";
|
||||||
|
String code = sourceFileName2Content.get(path);
|
||||||
|
|
||||||
|
if (code == null) return null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
return new SourceFileObject(path, code);
|
||||||
|
} catch (URISyntaxException ex) {
|
||||||
|
throw new IOException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return super.getJavaFileForInput(location, className, kind);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasLocation(Location location) {
|
||||||
|
return super.hasLocation(location) || location == StandardLocation.SOURCE_PATH;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean contains(Location location, FileObject fo) throws IOException {
|
||||||
|
if (location == StandardLocation.SOURCE_PATH) {
|
||||||
|
return fo instanceof SourceFileObject;
|
||||||
|
}
|
||||||
|
return super.contains(location, fo);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String inferBinaryName(Location location, JavaFileObject file) {
|
||||||
|
if (location == StandardLocation.SOURCE_PATH) {
|
||||||
|
String path = ((SourceFileObject) file).path;
|
||||||
|
String fileName = path.substring(path.lastIndexOf('/'));
|
||||||
|
return fileName.substring(0, fileName.length() - ".java".length());
|
||||||
|
}
|
||||||
|
return super.inferBinaryName(location, file);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final class SourceFileObject extends SimpleJavaFileObject {
|
||||||
|
private final String path;
|
||||||
|
private final String code;
|
||||||
|
|
||||||
|
public SourceFileObject(String path, String code) throws URISyntaxException {
|
||||||
|
super(new URI("mem://" + path), Kind.SOURCE);
|
||||||
|
this.path = path;
|
||||||
|
this.code = code;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNameCompatible(String simpleName, Kind kind) {
|
||||||
|
return path.endsWith(simpleName + kind.extension);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private static void assertNotNull(Object actual) {
|
private static void assertNotNull(Object actual) {
|
||||||
if (actual == null) {
|
if (actual == null) {
|
||||||
throw new AssertionError("unexpected null!");
|
throw new AssertionError("unexpected null!");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user