src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/dependencies/DependencyCollector.java

Print this page
rev 2819 : imported patch my-classpath-deps-00

*** 22,76 **** * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.tools.sjavac.comp.dependencies; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import com.sun.source.util.TaskEvent; import com.sun.source.util.TaskListener; import com.sun.tools.javac.code.Symbol.PackageSymbol; import com.sun.tools.javac.tree.JCTree.JCCompilationUnit; import com.sun.tools.javac.util.DefinedBy; import com.sun.tools.javac.util.DefinedBy.Api; ! import com.sun.tools.sjavac.Util; public class DependencyCollector implements TaskListener { ! Map<PackageSymbol, Set<PackageSymbol>> collectedDependencies = new HashMap<>(); ! @Override ! @DefinedBy(Api.COMPILER_TREE) ! public void started(TaskEvent e) { } @Override @DefinedBy(Api.COMPILER_TREE) public void finished(TaskEvent e) { if (e.getKind() == TaskEvent.Kind.ANALYZE) { JCCompilationUnit cu = (JCCompilationUnit) e.getCompilationUnit(); PackageSymbol thisPkg = cu.packge; if (thisPkg == null) { // Compilation unit in default package. See JDK-8048144. return; } ! DependencyScanner ds = new DependencyScanner(); cu.accept(ds); ! Set<PackageSymbol> pkgDeps = ds.getResult() ! .stream() ! .flatMap(dep -> dep.getPackages().stream()) ! .collect(Collectors.toSet()); ! collectedDependencies.merge(thisPkg, pkgDeps, Util::union); } } ! public Set<PackageSymbol> getSourcePackages() { ! return collectedDependencies.keySet(); } ! public Set<PackageSymbol> getDependenciesForPkg(PackageSymbol ps) { ! return collectedDependencies.get(ps); } } --- 22,134 ---- * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.tools.sjavac.comp.dependencies; + import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; + import javax.tools.JavaFileManager.Location; + import javax.tools.JavaFileObject; + import javax.tools.StandardLocation; + import com.sun.source.util.TaskEvent; import com.sun.source.util.TaskListener; + import com.sun.tools.javac.code.Symbol; + import com.sun.tools.javac.code.Symbol.ClassSymbol; import com.sun.tools.javac.code.Symbol.PackageSymbol; import com.sun.tools.javac.tree.JCTree.JCCompilationUnit; + import com.sun.tools.javac.util.Context; import com.sun.tools.javac.util.DefinedBy; import com.sun.tools.javac.util.DefinedBy.Api; ! import com.sun.tools.sjavac.Log; ! import com.sun.tools.sjavac.comp.Dependencies; ! import com.sun.tools.sjavac.comp.JavaFileObjectWithLocation; public class DependencyCollector implements TaskListener { ! private Context context; ! // Compilation unit -> fully qualified name -> class symbol ! public final Map<JCCompilationUnit, Map<String, Set<ClassSymbol>>> collectedDependencies = new HashMap<>(); ! ! public DependencyCollector(Context context) { ! this.context = context; } @Override @DefinedBy(Api.COMPILER_TREE) public void finished(TaskEvent e) { if (e.getKind() == TaskEvent.Kind.ANALYZE) { JCCompilationUnit cu = (JCCompilationUnit) e.getCompilationUnit(); + //com.sun.tools.sjavac.Log.info("Finished compilation unit: " + cu.sourcefile); PackageSymbol thisPkg = cu.packge; if (thisPkg == null) { // Compilation unit in default package. See JDK-8048144. return; } ! DependencyScanner ds = new DependencyScanner(context); cu.accept(ds); ! ! collectedDependencies.put(cu, ds.dependencies); ! } ! ! if (e.getKind() == TaskEvent.Kind.COMPILATION) { ! Dependencies deps = Dependencies.instance(context); ! ! // Collect dependencies ! for (JCCompilationUnit fromCu : collectedDependencies.keySet()) { ! ! // fqName -> set of type deps ! Map<String, Set<ClassSymbol>> map = collectedDependencies.get(fromCu); ! for (String fromFqName : map.keySet()) { ! Set<ClassSymbol> toSymbols = map.get(fromFqName); ! Set<ClassSymbol> toOutermostSymbols = collectOutermostClassSymbols(toSymbols); ! ! for (ClassSymbol toTypeSymbol : toOutermostSymbols) { ! ! // Ignore self-dependencies ! if (fromFqName.equals(toTypeSymbol.flatname.toString())) ! continue; ! Location loc = getLocationOf(toTypeSymbol); ! if (loc != StandardLocation.PLATFORM_CLASS_PATH) ! deps.collect(loc, fromCu, fromFqName, toTypeSymbol); ! } ! } ! } ! ! // Collect pubapi of dependencies ! Collection<Map<String, Set<ClassSymbol>>> allDepMaps = collectedDependencies.values(); ! for (Map<String, Set<ClassSymbol>> depMap : allDepMaps) { ! for (String fromFqName : depMap.keySet()) { ! Set<ClassSymbol> toSymbols = depMap.get(fromFqName); ! Set<ClassSymbol> toOutermostSymbols = collectOutermostClassSymbols(toSymbols); ! for (ClassSymbol ts : toOutermostSymbols) { ! // Ignore self-dependencies ! if (fromFqName.equals(ts.flatname.toString())) ! continue; ! if (getLocationOf(ts) != StandardLocation.PLATFORM_CLASS_PATH) ! deps.visitPubapi(ts); ! } } } ! } } ! private Location getLocationOf(ClassSymbol cs) { ! JavaFileObject jfo = cs.outermostClass().classfile; ! if (jfo != null) ! return ((JavaFileObjectWithLocation<?>) jfo).getLocation(); ! Log.warn("Could not determine location of " + cs.flatName()); ! return null; ! } ! ! private Set<ClassSymbol> collectOutermostClassSymbols(Set<ClassSymbol> cs) { ! return cs.stream() ! .map(Symbol::outermostClass) ! .collect(Collectors.toSet()); } }