15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25 package com.sun.tools.sjavac.comp.dependencies;
26
27 import java.util.HashSet;
28 import java.util.Set;
29
30 import com.sun.source.tree.Tree;
31 import com.sun.source.util.TaskEvent;
32 import com.sun.source.util.TaskListener;
33 import com.sun.tools.javac.code.Symbol.ClassSymbol;
34 import com.sun.tools.javac.tree.JCTree.JCClassDecl;
35 import com.sun.tools.javac.util.DefinedBy;
36 import com.sun.tools.javac.util.DefinedBy.Api;
37
38 public class PublicApiCollector implements TaskListener {
39
40 final Set<ClassSymbol> classSymbols = new HashSet<>();
41
42 @Override
43 @DefinedBy(Api.COMPILER_TREE)
44 public void started(TaskEvent e) {
45 }
46
47 @Override
48 @DefinedBy(Api.COMPILER_TREE)
49 public void finished(TaskEvent e) {
50 if (e.getKind() == TaskEvent.Kind.ANALYZE) {
51 for (Tree t : e.getCompilationUnit().getTypeDecls()) {
52 if (t instanceof JCClassDecl) // Can also be a JCSkip
53 classSymbols.add(((JCClassDecl) t).sym);
54 }
55 }
56 }
57
58 public Set<ClassSymbol> getClassSymbols() {
59 return classSymbols;
60 }
61 }
|
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25 package com.sun.tools.sjavac.comp.dependencies;
26
27 import java.util.HashSet;
28 import java.util.Set;
29
30 import com.sun.source.tree.Tree;
31 import com.sun.source.util.TaskEvent;
32 import com.sun.source.util.TaskListener;
33 import com.sun.tools.javac.code.Symbol.ClassSymbol;
34 import com.sun.tools.javac.tree.JCTree.JCClassDecl;
35 import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
36 import com.sun.tools.javac.util.Context;
37 import com.sun.tools.javac.util.DefinedBy;
38 import com.sun.tools.javac.util.DefinedBy.Api;
39 import com.sun.tools.sjavac.comp.Dependencies;
40
41 public class PublicApiCollector implements TaskListener {
42
43 private Context context;
44 private final Set<ClassSymbol> classSymbols = new HashSet<>();
45
46 public PublicApiCollector(Context context) {
47 this.context = context;
48 }
49
50 @Override
51 @DefinedBy(Api.COMPILER_TREE)
52 public void finished(TaskEvent e) {
53 switch (e.getKind()) {
54 case ANALYZE:
55 collectClassSymbols((JCCompilationUnit) e.getCompilationUnit());
56 break;
57 case COMPILATION:
58 extractPubApis();
59 break;
60 }
61 }
62
63 private void collectClassSymbols(JCCompilationUnit cu) {
64 for (Tree t : cu.getTypeDecls()) {
65 if (t instanceof JCClassDecl) // Can also be a JCSkip
66 classSymbols.add(((JCClassDecl) t).sym);
67 }
68 }
69
70 private void extractPubApis() {
71 // For incremental builds we need to remember the public api of what
72 // we depend upon.
73 // Within a single compilation loop, we need to keep track of public
74 // api of what we're compiling to decide if any dependants needs to
75 // be tainted.
76 Dependencies deps = Dependencies.instance(context);
77 for (ClassSymbol cs : classSymbols)
78 deps.visitPubapi(cs);
79 }
80 }
|