diff -r 4caf88912b7f -r 3b41f1c69604 langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Enter.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Enter.java Tue Mar 15 13:48:30 2016 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Enter.java Thu Mar 17 19:04:28 2016 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,9 @@ package com.sun.tools.javac.comp; +import java.util.Map; +import java.util.Optional; + import javax.tools.JavaFileObject; import javax.tools.JavaFileManager; @@ -34,13 +37,13 @@ import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.code.Type.*; import com.sun.tools.javac.main.Option.PkgInfo; +import com.sun.tools.javac.resources.CompilerProperties.Errors; import com.sun.tools.javac.tree.*; import com.sun.tools.javac.tree.JCTree.*; import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; import com.sun.tools.javac.util.List; - import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Kinds.Kind.*; @@ -97,6 +100,8 @@ JavaFileManager fileManager; PkgInfo pkginfoOpt; TypeEnvs typeEnvs; + Modules modules; + JCDiagnostic.Factory diags; private final Todo todo; @@ -119,6 +124,8 @@ annotate = Annotate.instance(context); lint = Lint.instance(context); names = Names.instance(context); + modules = Modules.instance(context); + diags = JCDiagnostic.Factory.instance(context); predefClassDef = make.ClassDef( make.Modifiers(PUBLIC), @@ -229,6 +236,24 @@ : env.info.scope; } + /** Create a fresh environment for modules. + * + * @param tree The module definition. + * @param env The environment current outside of the module definition. + */ + public Env moduleEnv(JCModuleDecl tree, Env env) { + Assert.checkNonNull(tree.sym); + Env localEnv = + env.dup(tree, env.info.dup(WriteableScope.create(tree.sym))); + localEnv.enclClass = predefClassDef; + localEnv.outer = env; + localEnv.info.isSelfCall = false; + localEnv.info.lint = null; // leave this to be filled in by Attr, + // when annotations have been processed + return localEnv; + } + + /* ************************************************************************ * Visitor methods for phase 1: class enter *************************************************************************/ @@ -276,57 +301,80 @@ @Override public void visitTopLevel(JCCompilationUnit tree) { +// Assert.checkNonNull(tree.modle, tree.sourcefile.toString()); + JavaFileObject prev = log.useSource(tree.sourcefile); boolean addEnv = false; boolean isPkgInfo = tree.sourcefile.isNameCompatible("package-info", JavaFileObject.Kind.SOURCE); - JCPackageDecl pd = tree.getPackage(); - if (pd != null) { - tree.packge = pd.packge = syms.enterPackage(TreeInfo.fullName(pd.pid)); - if ( pd.annotations.nonEmpty() - || pkginfoOpt == PkgInfo.ALWAYS - || tree.docComments != null) { - if (isPkgInfo) { - addEnv = true; - } else if (pd.annotations.nonEmpty()) { - log.error(pd.annotations.head.pos(), - "pkg.annotations.sb.in.package-info.java"); + if (TreeInfo.isModuleInfo(tree)) { + tree.packge = syms.rootPackage; + Env topEnv = topLevelEnv(tree); + classEnter(tree.defs, topEnv); + tree.modle.usesProvidesCompleter = modules.getUsesProvidesCompleter(); + } else { + JCPackageDecl pd = tree.getPackage(); + if (pd != null) { + tree.packge = pd.packge = syms.enterPackage(tree.modle, TreeInfo.fullName(pd.pid)); + if ( pd.annotations.nonEmpty() + || pkginfoOpt == PkgInfo.ALWAYS + || tree.docComments != null) { + if (isPkgInfo) { + addEnv = true; + } else if (pd.annotations.nonEmpty()) { + log.error(pd.annotations.head.pos(), + "pkg.annotations.sb.in.package-info.java"); + } } + } else { + tree.packge = tree.modle.unnamedPackage; } - } else { - tree.packge = syms.unnamedPackage; - } - tree.packge.complete(); // Find all classes in package. - Env topEnv = topLevelEnv(tree); - Env packageEnv = isPkgInfo ? topEnv.dup(pd) : null; + + Map visiblePackages = tree.modle.visiblePackages; + Optional dependencyWithPackage = + syms.listPackageModules(tree.packge.fullname) + .stream() + .filter(m -> m != tree.modle) + .filter(cand -> visiblePackages.get(tree.packge.fullname) == syms.getPackage(cand, tree.packge.fullname)) + .findAny(); - // Save environment of package-info.java file. - if (isPkgInfo) { - Env env0 = typeEnvs.get(tree.packge); - if (env0 != null) { - JCCompilationUnit tree0 = env0.toplevel; - if (!fileManager.isSameFile(tree.sourcefile, tree0.sourcefile)) { - log.warning(pd != null ? pd.pid.pos() : null, - "pkg-info.already.seen", - tree.packge); - } + if (dependencyWithPackage.isPresent()) { + log.error(pd, Errors.PackageInOtherModule(dependencyWithPackage.get())); } - typeEnvs.put(tree.packge, packageEnv); + + tree.packge.complete(); // Find all classes in package. + + Env topEnv = topLevelEnv(tree); + Env packageEnv = isPkgInfo ? topEnv.dup(pd) : null; - for (Symbol q = tree.packge; q != null && q.kind == PCK; q = q.owner) - q.flags_field |= EXISTS; + // Save environment of package-info.java file. + if (isPkgInfo) { + Env env0 = typeEnvs.get(tree.packge); + if (env0 != null) { + JCCompilationUnit tree0 = env0.toplevel; + if (!fileManager.isSameFile(tree.sourcefile, tree0.sourcefile)) { + log.warning(pd != null ? pd.pid.pos() : null, + "pkg-info.already.seen", + tree.packge); + } + } + typeEnvs.put(tree.packge, packageEnv); - Name name = names.package_info; - ClassSymbol c = syms.enterClass(name, tree.packge); - c.flatname = names.fromString(tree.packge + "." + name); - c.sourcefile = tree.sourcefile; + for (Symbol q = tree.packge; q != null && q.kind == PCK; q = q.owner) + q.flags_field |= EXISTS; + + Name name = names.package_info; + ClassSymbol c = syms.enterClass(tree.modle, name, tree.packge); + c.flatname = names.fromString(tree.packge + "." + name); + c.sourcefile = tree.sourcefile; c.completer = Completer.NULL_COMPLETER; - c.members_field = WriteableScope.create(c); - tree.packge.package_info = c; - } - classEnter(tree.defs, topEnv); - if (addEnv) { - todo.append(packageEnv); + c.members_field = WriteableScope.create(c); + tree.packge.package_info = c; + } + classEnter(tree.defs, topEnv); + if (addEnv) { + todo.append(packageEnv); + } } log.useSource(prev); result = null; @@ -342,7 +390,7 @@ PackageSymbol packge = (PackageSymbol)owner; for (Symbol q = packge; q != null && q.kind == PCK; q = q.owner) q.flags_field |= EXISTS; - c = syms.enterClass(tree.name, packge); + c = syms.enterClass(env.toplevel.modle, tree.name, packge); packge.members().enterIfAbsent(c); if ((tree.mods.flags & PUBLIC) != 0 && !classNameMatchesFileName(c, env)) { log.error(tree.pos(), @@ -356,7 +404,7 @@ } if (owner.kind == TYP) { // We are seeing a member class. - c = syms.enterClass(tree.name, (TypeSymbol)owner); + c = syms.enterClass(env.toplevel.modle, tree.name, (TypeSymbol)owner); if ((owner.flags_field & INTERFACE) != 0) { tree.mods.flags |= PUBLIC | STATIC; } @@ -371,13 +419,13 @@ tree.sym = c; // Enter class into `compiled' table and enclosing scope. - if (chk.compiled.get(c.flatname) != null) { + if (chk.getCompiled(c) != null) { duplicateClass(tree.pos(), c); result = types.createErrorType(tree.name, (TypeSymbol)owner, Type.noType); tree.sym = (ClassSymbol)result.tsym; return; } - chk.compiled.put(c.flatname, c); + chk.putCompiled(c); enclScope.enter(c); // Set up an environment for class block and store in `typeEnvs' @@ -421,6 +469,8 @@ // Recursively enter all member classes. classEnter(tree.defs, localEnv); +// Assert.checkNonNull(c.modle, c.sourcefile.toString()); + result = c.type; } //where @@ -453,6 +503,13 @@ result = a; } + @Override + public void visitModuleDef(JCModuleDecl tree) { + Env moduleEnv = moduleEnv(tree, env); + typeEnvs.put(tree.sym, moduleEnv); + todo.append(moduleEnv); + } + /** Default class enter visitor method: do nothing. */ @Override