--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java Mon Mar 13 17:02:18 2017 -0700
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java Tue Mar 14 07:11:45 2017 +0100
@@ -69,12 +69,12 @@
import com.sun.tools.javac.tree.JCTree.JCLambda;
import com.sun.tools.javac.tree.JCTree.JCMemberReference;
import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
-import com.sun.tools.javac.tree.JCTree.JCModuleDecl;
import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
-import com.sun.tools.javac.tree.JCTree.Tag;
import com.sun.tools.javac.util.*;
import com.sun.tools.javac.util.DefinedBy.Api;
import com.sun.tools.javac.util.JCDiagnostic.Factory;
+import com.sun.tools.javac.util.Log.DiagnosticHandler;
+import com.sun.tools.javac.util.Log.DiscardDiagnosticHandler;
import com.sun.tools.javac.util.Log.WriterKind;
import static com.sun.tools.javac.code.Kinds.Kind.*;
@@ -89,6 +89,8 @@
import static javax.tools.StandardLocation.CLASS_OUTPUT;
+import com.sun.tools.javac.tree.JCTree.JCModuleDecl;
+
/** This class could be the main entry point for GJC when GJC is used as a
* component in a larger software system. It provides operations to
* construct a new compiler, and to run a new compiler on a set of source
@@ -340,13 +342,6 @@
protected final Symbol.Completer sourceCompleter =
sym -> readSourceFile((ClassSymbol) sym);
- protected final ModuleFinder.ModuleInfoSourceFileCompleter moduleInfoSourceFileCompleter =
- fo -> (ModuleSymbol) readSourceFile(parseImplicitFile(fo), null, tl -> {
- return tl.defs.nonEmpty() && tl.defs.head.hasTag(Tag.MODULEDEF) ?
- ((JCModuleDecl) tl.defs.head).sym.module_info :
- syms.defineClass(names.module_info, syms.errModule);
- }).owner;
-
/**
* Command line options.
*/
@@ -417,7 +412,7 @@
diags = Factory.instance(context);
finder.sourceCompleter = sourceCompleter;
- moduleFinder.sourceFileCompleter = moduleInfoSourceFileCompleter;
+ moduleFinder.moduleNameFromSourceReader = this::readModuleName;
options = Options.instance(context);
@@ -787,19 +782,6 @@
readSourceFile(null, c);
}
- private JCTree.JCCompilationUnit parseImplicitFile(JavaFileObject filename) {
- JavaFileObject prev = log.useSource(filename);
- try {
- JCTree.JCCompilationUnit t = parse(filename, filename.getCharContent(false));
- return t;
- } catch (IOException e) {
- log.error("error.reading.file", filename, JavacFileManager.getMessage(e));
- return make.TopLevel(List.nil());
- } finally {
- log.useSource(prev);
- }
- }
-
/** Compile a ClassSymbol from source, optionally using the given compilation unit as
* the source tree.
* @param tree the compilation unit in which the given ClassSymbol resides,
@@ -810,20 +792,20 @@
if (completionFailureName == c.fullname) {
throw new CompletionFailure(c, "user-selected completion failure by class name");
}
+ JavaFileObject filename = c.classfile;
+ JavaFileObject prev = log.useSource(filename);
if (tree == null) {
- tree = parseImplicitFile(c.classfile);
+ try {
+ tree = parse(filename, filename.getCharContent(false));
+ } catch (IOException e) {
+ log.error("error.reading.file", filename, JavacFileManager.getMessage(e));
+ tree = make.TopLevel(List.<JCTree>nil());
+ } finally {
+ log.useSource(prev);
+ }
}
- readSourceFile(tree, c, cut -> c);
- }
-
- private ClassSymbol readSourceFile(JCCompilationUnit tree,
- ClassSymbol expectedSymbol,
- Function<JCCompilationUnit, ClassSymbol> symbolGetter)
- throws CompletionFailure {
- Assert.checkNonNull(tree);
-
if (!taskListener.isEmpty()) {
TaskEvent e = new TaskEvent(TaskEvent.Kind.ENTER, tree);
taskListener.started(e);
@@ -835,20 +817,18 @@
// Note that if module resolution failed, we may not even
// have enough modules available to access java.lang, and
// so risk getting FatalError("no.java.lang") from MemberEnter.
- if (!modules.enter(List.of(tree), expectedSymbol)) {
- throw new CompletionFailure(symbolGetter.apply(tree),
- diags.fragment("cant.resolve.modules"));
+ if (!modules.enter(List.of(tree), c)) {
+ throw new CompletionFailure(c, diags.fragment("cant.resolve.modules"));
}
- enter.complete(List.of(tree), expectedSymbol);
+ enter.complete(List.of(tree), c);
if (!taskListener.isEmpty()) {
TaskEvent e = new TaskEvent(TaskEvent.Kind.ENTER, tree);
taskListener.finished(e);
}
- ClassSymbol sym = symbolGetter.apply(tree);
- if (sym == null || enter.getEnv(sym) == null) {
+ if (enter.getEnv(c) == null) {
boolean isPkgInfo =
tree.sourcefile.isNameCompatible("package-info",
JavaFileObject.Kind.SOURCE);
@@ -859,26 +839,24 @@
if (enter.getEnv(tree.modle) == null) {
JCDiagnostic diag =
diagFactory.fragment("file.does.not.contain.module");
- throw new ClassFinder.BadClassFile(sym, tree.sourcefile, diag, diagFactory);
+ throw new ClassFinder.BadClassFile(c, filename, diag, diagFactory);
}
} else if (isPkgInfo) {
if (enter.getEnv(tree.packge) == null) {
JCDiagnostic diag =
diagFactory.fragment("file.does.not.contain.package",
- sym.location());
- throw new ClassFinder.BadClassFile(sym, tree.sourcefile, diag, diagFactory);
+ c.location());
+ throw new ClassFinder.BadClassFile(c, filename, diag, diagFactory);
}
} else {
JCDiagnostic diag =
diagFactory.fragment("file.doesnt.contain.class",
- sym.getQualifiedName());
- throw new ClassFinder.BadClassFile(sym, tree.sourcefile, diag, diagFactory);
+ c.getQualifiedName());
+ throw new ClassFinder.BadClassFile(c, filename, diag, diagFactory);
}
}
implicitSourceFilesRead = true;
-
- return sym;
}
/** Track when the JavaCompiler has been used to compile something. */
@@ -1751,6 +1729,27 @@
return enterDone;
}
+ private Name readModuleName(JavaFileObject fo) {
+ return parseAndGetName(fo, t -> {
+ JCModuleDecl md = t.getModuleDecl();
+
+ return md != null ? TreeInfo.fullName(md.getName()) : null;
+ });
+ }
+
+ private Name parseAndGetName(JavaFileObject fo,
+ Function<JCTree.JCCompilationUnit, Name> tree2Name) {
+ DiagnosticHandler dh = new DiscardDiagnosticHandler(log);
+ try {
+ JCTree.JCCompilationUnit t = parse(fo, fo.getCharContent(false));
+ return tree2Name.apply(t);
+ } catch (IOException e) {
+ return null;
+ } finally {
+ log.popDiagnosticHandler(dh);
+ }
+ }
+
/** Close the compiler, flushing the logs
*/
public void close() {