diff -r a132763160d7 -r 655bba719625 langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java --- a/langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java Fri Jan 29 16:06:51 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java Fri Jan 29 16:54:52 2010 -0800 @@ -67,6 +67,7 @@ import com.sun.tools.javac.tree.JCTree.*; import com.sun.tools.javac.util.Abort; import com.sun.tools.javac.util.Context; +import com.sun.tools.javac.util.Convert; import com.sun.tools.javac.util.List; import com.sun.tools.javac.util.ListBuffer; import com.sun.tools.javac.util.Log; @@ -893,14 +894,20 @@ errorStatus = true; break runAround; } else { - ListBuffer classes = enterNewClassFiles(currentContext); + List newClasses = enterNewClassFiles(currentContext); compiler.enterTrees(roots); // annotationsPresentInSource = // collector.findAnnotations(parsedFiles); - classes.appendList(getTopLevelClasses(parsedFiles)); - topLevelClasses = classes.toList(); - packageInfoFiles = getPackageInfoFiles(parsedFiles); + ListBuffer tlc = new ListBuffer(); + tlc.appendList(getTopLevelClasses(parsedFiles)); + tlc.appendList(getTopLevelClassesFromClasses(newClasses)); + topLevelClasses = tlc.toList(); + + ListBuffer pif = new ListBuffer(); + pif.appendList(getPackageInfoFiles(parsedFiles)); + pif.appendList(getPackageInfoFilesFromClasses(newClasses)); + packageInfoFiles = pif.toList(); annotationsPresent = new LinkedHashSet(); for (ClassSymbol classSym : topLevelClasses) @@ -1026,20 +1033,30 @@ } } - private ListBuffer enterNewClassFiles(Context currentContext) { + private List enterNewClassFiles(Context currentContext) { ClassReader reader = ClassReader.instance(currentContext); Names names = Names.instance(currentContext); - ListBuffer list = new ListBuffer(); + List list = List.nil(); for (Map.Entry entry : filer.getGeneratedClasses().entrySet()) { Name name = names.fromString(entry.getKey()); JavaFileObject file = entry.getValue(); if (file.getKind() != JavaFileObject.Kind.CLASS) throw new AssertionError(file); - ClassSymbol cs = reader.enterClass(name, file); - list.append(cs); + ClassSymbol cs; + if (isPkgInfo(file, JavaFileObject.Kind.CLASS)) { + Name packageName = Convert.packagePart(name); + PackageSymbol p = reader.enterPackage(packageName); + if (p.package_info == null) + p.package_info = reader.enterClass(Convert.shortName(name), p); + cs = p.package_info; + if (cs.classfile == null) + cs.classfile = file; + } else + cs = reader.enterClass(name, file); + list = list.prepend(cs); } - return list; + return list.reverse(); } /** @@ -1066,18 +1083,44 @@ return classes.reverse(); } + private List getTopLevelClassesFromClasses(List syms) { + List classes = List.nil(); + for (ClassSymbol sym : syms) { + if (!isPkgInfo(sym)) { + classes = classes.prepend(sym); + } + } + return classes.reverse(); + } + private List getPackageInfoFiles(List units) { List packages = List.nil(); for (JCCompilationUnit unit : units) { - boolean isPkgInfo = unit.sourcefile.isNameCompatible("package-info", - JavaFileObject.Kind.SOURCE); - if (isPkgInfo) { + if (isPkgInfo(unit.sourcefile, JavaFileObject.Kind.SOURCE)) { packages = packages.prepend(unit.packge); } } return packages.reverse(); } + private List getPackageInfoFilesFromClasses(List syms) { + List packages = List.nil(); + for (ClassSymbol sym : syms) { + if (isPkgInfo(sym)) { + packages = packages.prepend((PackageSymbol) sym.owner); + } + } + return packages.reverse(); + } + + private boolean isPkgInfo(JavaFileObject fo, JavaFileObject.Kind kind) { + return fo.isNameCompatible("package-info", kind); + } + + private boolean isPkgInfo(ClassSymbol sym) { + return isPkgInfo(sym.classfile, JavaFileObject.Kind.CLASS) && (sym.packge().package_info == sym); + } + private Context contextForNextRound(Context context, boolean shareNames) throws IOException {