src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java

changeset 483
8e638442522a
parent 382
25f15fdd168a
child 489
4b4e282a3146
     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      {

mercurial