1.1 --- a/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java Fri Jan 29 16:06:51 2010 -0800 1.2 +++ b/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java Fri Jan 29 16:54:52 2010 -0800 1.3 @@ -67,6 +67,7 @@ 1.4 import com.sun.tools.javac.tree.JCTree.*; 1.5 import com.sun.tools.javac.util.Abort; 1.6 import com.sun.tools.javac.util.Context; 1.7 +import com.sun.tools.javac.util.Convert; 1.8 import com.sun.tools.javac.util.List; 1.9 import com.sun.tools.javac.util.ListBuffer; 1.10 import com.sun.tools.javac.util.Log; 1.11 @@ -893,14 +894,20 @@ 1.12 errorStatus = true; 1.13 break runAround; 1.14 } else { 1.15 - ListBuffer<ClassSymbol> classes = enterNewClassFiles(currentContext); 1.16 + List<ClassSymbol> newClasses = enterNewClassFiles(currentContext); 1.17 compiler.enterTrees(roots); 1.18 1.19 // annotationsPresentInSource = 1.20 // collector.findAnnotations(parsedFiles); 1.21 - classes.appendList(getTopLevelClasses(parsedFiles)); 1.22 - topLevelClasses = classes.toList(); 1.23 - packageInfoFiles = getPackageInfoFiles(parsedFiles); 1.24 + ListBuffer<ClassSymbol> tlc = new ListBuffer<ClassSymbol>(); 1.25 + tlc.appendList(getTopLevelClasses(parsedFiles)); 1.26 + tlc.appendList(getTopLevelClassesFromClasses(newClasses)); 1.27 + topLevelClasses = tlc.toList(); 1.28 + 1.29 + ListBuffer<PackageSymbol> pif = new ListBuffer<PackageSymbol>(); 1.30 + pif.appendList(getPackageInfoFiles(parsedFiles)); 1.31 + pif.appendList(getPackageInfoFilesFromClasses(newClasses)); 1.32 + packageInfoFiles = pif.toList(); 1.33 1.34 annotationsPresent = new LinkedHashSet<TypeElement>(); 1.35 for (ClassSymbol classSym : topLevelClasses) 1.36 @@ -1026,20 +1033,30 @@ 1.37 } 1.38 } 1.39 1.40 - private ListBuffer<ClassSymbol> enterNewClassFiles(Context currentContext) { 1.41 + private List<ClassSymbol> enterNewClassFiles(Context currentContext) { 1.42 ClassReader reader = ClassReader.instance(currentContext); 1.43 Names names = Names.instance(currentContext); 1.44 - ListBuffer<ClassSymbol> list = new ListBuffer<ClassSymbol>(); 1.45 + List<ClassSymbol> list = List.nil(); 1.46 1.47 for (Map.Entry<String,JavaFileObject> entry : filer.getGeneratedClasses().entrySet()) { 1.48 Name name = names.fromString(entry.getKey()); 1.49 JavaFileObject file = entry.getValue(); 1.50 if (file.getKind() != JavaFileObject.Kind.CLASS) 1.51 throw new AssertionError(file); 1.52 - ClassSymbol cs = reader.enterClass(name, file); 1.53 - list.append(cs); 1.54 + ClassSymbol cs; 1.55 + if (isPkgInfo(file, JavaFileObject.Kind.CLASS)) { 1.56 + Name packageName = Convert.packagePart(name); 1.57 + PackageSymbol p = reader.enterPackage(packageName); 1.58 + if (p.package_info == null) 1.59 + p.package_info = reader.enterClass(Convert.shortName(name), p); 1.60 + cs = p.package_info; 1.61 + if (cs.classfile == null) 1.62 + cs.classfile = file; 1.63 + } else 1.64 + cs = reader.enterClass(name, file); 1.65 + list = list.prepend(cs); 1.66 } 1.67 - return list; 1.68 + return list.reverse(); 1.69 } 1.70 1.71 /** 1.72 @@ -1066,18 +1083,44 @@ 1.73 return classes.reverse(); 1.74 } 1.75 1.76 + private List<ClassSymbol> getTopLevelClassesFromClasses(List<? extends ClassSymbol> syms) { 1.77 + List<ClassSymbol> classes = List.nil(); 1.78 + for (ClassSymbol sym : syms) { 1.79 + if (!isPkgInfo(sym)) { 1.80 + classes = classes.prepend(sym); 1.81 + } 1.82 + } 1.83 + return classes.reverse(); 1.84 + } 1.85 + 1.86 private List<PackageSymbol> getPackageInfoFiles(List<? extends JCCompilationUnit> units) { 1.87 List<PackageSymbol> packages = List.nil(); 1.88 for (JCCompilationUnit unit : units) { 1.89 - boolean isPkgInfo = unit.sourcefile.isNameCompatible("package-info", 1.90 - JavaFileObject.Kind.SOURCE); 1.91 - if (isPkgInfo) { 1.92 + if (isPkgInfo(unit.sourcefile, JavaFileObject.Kind.SOURCE)) { 1.93 packages = packages.prepend(unit.packge); 1.94 } 1.95 } 1.96 return packages.reverse(); 1.97 } 1.98 1.99 + private List<PackageSymbol> getPackageInfoFilesFromClasses(List<? extends ClassSymbol> syms) { 1.100 + List<PackageSymbol> packages = List.nil(); 1.101 + for (ClassSymbol sym : syms) { 1.102 + if (isPkgInfo(sym)) { 1.103 + packages = packages.prepend((PackageSymbol) sym.owner); 1.104 + } 1.105 + } 1.106 + return packages.reverse(); 1.107 + } 1.108 + 1.109 + private boolean isPkgInfo(JavaFileObject fo, JavaFileObject.Kind kind) { 1.110 + return fo.isNameCompatible("package-info", kind); 1.111 + } 1.112 + 1.113 + private boolean isPkgInfo(ClassSymbol sym) { 1.114 + return isPkgInfo(sym.classfile, JavaFileObject.Kind.CLASS) && (sym.packge().package_info == sym); 1.115 + } 1.116 + 1.117 private Context contextForNextRound(Context context, boolean shareNames) 1.118 throws IOException 1.119 {