author | jlahoda |
Wed, 03 Dec 2014 13:46:12 +0100 | |
changeset 27857 | 7e913a535736 |
parent 25874 | 83c19f00452c |
child 30066 | d74c06a92bd8 |
permissions | -rw-r--r-- |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
1 |
/* |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
2 |
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
4 |
* |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
5 |
* This code is free software; you can redistribute it and/or modify it |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
6 |
* under the terms of the GNU General Public License version 2 only, as |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
7 |
* published by the Free Software Foundation. Oracle designates this |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
8 |
* particular file as subject to the "Classpath" exception as provided |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
9 |
* by Oracle in the LICENSE file that accompanied this code. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
10 |
* |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
11 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
12 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
13 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
14 |
* version 2 for more details (a copy is included in the LICENSE file that |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
15 |
* accompanied this code). |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
16 |
* |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
17 |
* You should have received a copy of the GNU General Public License version |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
18 |
* 2 along with this work; if not, write to the Free Software Foundation, |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
19 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
20 |
* |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
21 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
22 |
* or visit www.oracle.com if you need additional information or have any |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
23 |
* questions. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
24 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
25 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
26 |
package com.sun.tools.javac.util; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
27 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
28 |
import com.sun.tools.javac.code.Symbol; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
29 |
import com.sun.tools.javac.code.Symbol.ClassSymbol; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
30 |
import com.sun.tools.javac.code.Symbol.Completer; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
31 |
import com.sun.tools.javac.code.Symbol.CompletionFailure; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
32 |
import com.sun.tools.javac.main.JavaCompiler; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
33 |
import com.sun.tools.javac.tree.JCTree; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
34 |
import com.sun.tools.javac.util.GraphUtils.DotVisitor; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
35 |
import com.sun.tools.javac.util.GraphUtils.NodeVisitor; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
36 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
37 |
import java.io.Closeable; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
38 |
import java.io.FileWriter; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
39 |
import java.io.IOException; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
40 |
import java.util.ArrayList; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
41 |
import java.util.Arrays; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
42 |
import java.util.Collection; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
43 |
import java.util.EnumMap; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
44 |
import java.util.EnumSet; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
45 |
import java.util.HashSet; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
46 |
import java.util.LinkedHashMap; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
47 |
import java.util.List; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
48 |
import java.util.Map; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
49 |
import java.util.Properties; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
50 |
import java.util.Set; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
51 |
import java.util.Stack; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
52 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
53 |
import javax.tools.JavaFileObject; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
54 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
55 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
56 |
* This class is used to track dependencies in the javac symbol completion process. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
57 |
* |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
58 |
* <p><b>This is NOT part of any supported API. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
59 |
* If you write code that depends on this, you do so at your own risk. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
60 |
* This code and its internal interfaces are subject to change or |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
61 |
* deletion without notice.</b> |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
62 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
63 |
public abstract class Dependencies { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
64 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
65 |
protected static final Context.Key<Dependencies> dependenciesKey = new Context.Key<>(); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
66 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
67 |
public static Dependencies instance(Context context) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
68 |
Dependencies instance = context.get(dependenciesKey); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
69 |
if (instance == null) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
70 |
//use a do-nothing implementation in case no other implementation has been set by preRegister |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
71 |
instance = new DummyDependencies(context); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
72 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
73 |
return instance; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
74 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
75 |
|
27857 | 76 |
protected Dependencies(Context context) { |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
77 |
context.put(dependenciesKey, this); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
78 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
79 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
80 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
81 |
* This enum models different kinds of attribution actions triggered during |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
82 |
* symbol completion. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
83 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
84 |
public enum AttributionKind { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
85 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
86 |
* Attribution of superclass (i.e. @{code extends} clause). |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
87 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
88 |
EXTENDS { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
89 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
90 |
String format(JCTree tree) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
91 |
return "extends " + super.format(tree); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
92 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
93 |
}, |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
94 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
95 |
* Attribution of superinterface (i.e. an type in the @{code interface} clause). |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
96 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
97 |
IMPLEMENTS { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
98 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
99 |
String format(JCTree tree) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
100 |
return "implements " + super.format(tree); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
101 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
102 |
}, |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
103 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
104 |
* Attribution of an import statement |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
105 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
106 |
IMPORT, |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
107 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
108 |
* Attribution of type-variable bound |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
109 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
110 |
TVAR { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
111 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
112 |
String format(JCTree tree) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
113 |
return "<" + super.format(tree) + ">"; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
114 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
115 |
}; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
116 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
117 |
String format(JCTree tree) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
118 |
return tree.toString(); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
119 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
120 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
121 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
122 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
123 |
* Push a new completion node on the stack. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
124 |
*/ |
27857 | 125 |
abstract public void push(ClassSymbol s, CompletionCause phase); |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
126 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
127 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
128 |
* Push a new attribution node on the stack. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
129 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
130 |
abstract public void push(AttributionKind ak, JCTree t); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
131 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
132 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
133 |
* Remove current dependency node from the stack. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
134 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
135 |
abstract public void pop(); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
136 |
|
27857 | 137 |
public enum CompletionCause { |
138 |
CLASS_READER, |
|
139 |
HEADER_PHASE, |
|
140 |
HIERARCHY_PHASE, |
|
141 |
IMPORTS_PHASE, |
|
142 |
MEMBER_ENTER, |
|
143 |
MEMBERS_PHASE; |
|
144 |
} |
|
145 |
||
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
146 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
147 |
* This class creates a graph of all dependencies as symbols are completed; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
148 |
* when compilation finishes, the resulting dependecy graph is then dumped |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
149 |
* onto a dot file. Several options are provided to customise the output of the graph. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
150 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
151 |
public static class GraphDependencies extends Dependencies implements Closeable, Completer { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
152 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
153 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
154 |
* set of enabled dependencies modes |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
155 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
156 |
private EnumSet<DependenciesMode> dependenciesModes; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
157 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
158 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
159 |
* file in which the dependency graph should be written |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
160 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
161 |
private String dependenciesFile; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
162 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
163 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
164 |
* Register a Context.Factory to create a Dependencies. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
165 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
166 |
public static void preRegister(final Context context) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
167 |
context.put(dependenciesKey, new Context.Factory<Dependencies>() { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
168 |
public Dependencies make(Context c) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
169 |
Dependencies deps = new GraphDependencies(context); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
170 |
return deps; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
171 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
172 |
}); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
173 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
174 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
175 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
176 |
* Build a Dependencies instance. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
177 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
178 |
GraphDependencies(Context context) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
179 |
super(context); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
180 |
Options options = Options.instance(context); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
181 |
//fetch filename |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
182 |
String[] modes = options.get("completionDeps").split(","); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
183 |
for (String mode : modes) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
184 |
if (mode.startsWith("file=")) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
185 |
dependenciesFile = mode.substring(5); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
186 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
187 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
188 |
//parse modes |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
189 |
dependenciesModes = DependenciesMode.getDependenciesModes(modes); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
190 |
//add to closeables |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
191 |
JavaCompiler compiler = JavaCompiler.instance(context); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
192 |
compiler.closeables = compiler.closeables.prepend(this); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
193 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
194 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
195 |
enum DependenciesMode { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
196 |
SOURCE("source"), |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
197 |
CLASS("class"), |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
198 |
REDUNDANT("redundant"), |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
199 |
SIDE_EFFECTS("side-effects"); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
200 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
201 |
final String opt; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
202 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
203 |
private DependenciesMode(String opt) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
204 |
this.opt = opt; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
205 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
206 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
207 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
208 |
* This method is used to parse the {@code completionDeps} option. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
209 |
* Possible modes are separated by colon; a mode can be excluded by |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
210 |
* prepending '-' to its name. Finally, the special mode 'all' can be used to |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
211 |
* add all modes to the resulting enum. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
212 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
213 |
static EnumSet<DependenciesMode> getDependenciesModes(String[] modes) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
214 |
EnumSet<DependenciesMode> res = EnumSet.noneOf(DependenciesMode.class); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
215 |
Collection<String> args = Arrays.asList(modes); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
216 |
if (args.contains("all")) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
217 |
res = EnumSet.allOf(DependenciesMode.class); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
218 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
219 |
for (DependenciesMode mode : values()) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
220 |
if (args.contains(mode.opt)) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
221 |
res.add(mode); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
222 |
} else if (args.contains("-" + mode.opt)) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
223 |
res.remove(mode); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
224 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
225 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
226 |
return res; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
227 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
228 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
229 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
230 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
231 |
* Class representing a node in the dependency graph. Nodes are of two main |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
232 |
* kinds: (i) symbol nodes, corresponding to symbol completion requests |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
233 |
* (either from source or classfile); (ii) attribution nodes, corresponding to |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
234 |
* attribution actions triggered during (source) completion. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
235 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
236 |
static abstract class Node extends GraphUtils.AbstractNode<String, Node> |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
237 |
implements GraphUtils.DottableNode<String, Node> { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
238 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
239 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
240 |
* Model the dependencies between nodes. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
241 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
242 |
enum DependencyKind implements GraphUtils.DependencyKind { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
243 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
244 |
* standard dependency - i.e. completion of the source node depends |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
245 |
* on completion of the sink node. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
246 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
247 |
REQUIRES("solid"), |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
248 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
249 |
* soft dependencies - i.e. completion of the source node depends |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
250 |
* on side-effects of the source node. These dependencies are meant |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
251 |
* to capture the order in which javac processes all dependants of a given node. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
252 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
253 |
SIDE_EFFECTS("dashed"); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
254 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
255 |
final String dotStyle; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
256 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
257 |
DependencyKind(String dotStyle) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
258 |
this.dotStyle = dotStyle; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
259 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
260 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
261 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
262 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
263 |
* dependant nodes grouped by kind |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
264 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
265 |
EnumMap<DependencyKind, List<Node>> depsByKind; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
266 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
267 |
Node(String value) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
268 |
super(value); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
269 |
this.depsByKind = new EnumMap<>(DependencyKind.class); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
270 |
for (DependencyKind depKind : DependencyKind.values()) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
271 |
depsByKind.put(depKind, new ArrayList<Node>()); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
272 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
273 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
274 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
275 |
void addDependency(DependencyKind depKind, Node dep) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
276 |
List<Node> deps = depsByKind.get(depKind); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
277 |
if (!deps.contains(dep)) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
278 |
deps.add(dep); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
279 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
280 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
281 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
282 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
283 |
public boolean equals(Object obj) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
284 |
return obj instanceof Node && |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
285 |
data.equals(((Node) obj).data); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
286 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
287 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
288 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
289 |
public int hashCode() { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
290 |
return data.hashCode(); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
291 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
292 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
293 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
294 |
public GraphUtils.DependencyKind[] getSupportedDependencyKinds() { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
295 |
return DependencyKind.values(); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
296 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
297 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
298 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
299 |
public java.util.Collection<? extends Node> getDependenciesByKind(GraphUtils.DependencyKind dk) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
300 |
List<Node> deps = depsByKind.get(dk); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
301 |
if (dk == DependencyKind.REQUIRES) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
302 |
return deps; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
303 |
} else { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
304 |
Set<Node> temp = new HashSet<>(deps); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
305 |
temp.removeAll(depsByKind.get(DependencyKind.REQUIRES)); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
306 |
return temp; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
307 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
308 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
309 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
310 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
311 |
public Properties nodeAttributes() { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
312 |
Properties p = new Properties(); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
313 |
p.put("label", DotVisitor.wrap(toString())); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
314 |
return p; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
315 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
316 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
317 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
318 |
public Properties dependencyAttributes(Node to, GraphUtils.DependencyKind dk) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
319 |
Properties p = new Properties(); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
320 |
p.put("style", ((DependencyKind) dk).dotStyle); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
321 |
return p; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
322 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
323 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
324 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
325 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
326 |
* This is a dependency node used to model symbol completion requests. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
327 |
* Completion requests can come from either source or class. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
328 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
329 |
static class CompletionNode extends Node { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
330 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
331 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
332 |
* Completion kind (source vs. classfile) |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
333 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
334 |
enum Kind { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
335 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
336 |
* Source completion request |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
337 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
338 |
SOURCE("solid"), |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
339 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
340 |
* Classfile completion request |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
341 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
342 |
CLASS("dotted"); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
343 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
344 |
final String dotStyle; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
345 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
346 |
Kind(String dotStyle) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
347 |
this.dotStyle = dotStyle; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
348 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
349 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
350 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
351 |
final Kind ck; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
352 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
353 |
CompletionNode(ClassSymbol sym) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
354 |
super(sym.getQualifiedName().toString()); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
355 |
//infer completion kind by looking at the symbol fields |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
356 |
boolean fromClass = (sym.classfile == null && sym.sourcefile == null) || |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
357 |
(sym.classfile != null && sym.classfile.getKind() == JavaFileObject.Kind.CLASS); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
358 |
ck = fromClass ? |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
359 |
CompletionNode.Kind.CLASS : |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
360 |
CompletionNode.Kind.SOURCE; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
361 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
362 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
363 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
364 |
public Properties nodeAttributes() { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
365 |
Properties p = super.nodeAttributes(); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
366 |
p.put("style", ck.dotStyle); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
367 |
p.put("shape", "ellipse"); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
368 |
return p; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
369 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
370 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
371 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
372 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
373 |
* This is a dependency node used to model attribution actions triggered during |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
374 |
* source symbol completion. The possible kinds of attribution actions are |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
375 |
* captured in {@link AttributionNode}. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
376 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
377 |
static class AttributionNode extends Node { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
378 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
379 |
AttributionNode(AttributionKind ak, JCTree tree) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
380 |
super(ak.format(tree)); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
381 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
382 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
383 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
384 |
public Properties nodeAttributes() { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
385 |
Properties p = super.nodeAttributes(); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
386 |
p.put("shape", "box"); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
387 |
p.put("style", "solid"); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
388 |
return p; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
389 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
390 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
391 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
392 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
393 |
* stack of dependency nodes currently being processed |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
394 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
395 |
Stack<Node> nodeStack = new Stack<>(); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
396 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
397 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
398 |
* map containing all dependency nodes seen so far |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
399 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
400 |
Map<String, Node> dependencyNodeMap = new LinkedHashMap<>(); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
401 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
402 |
@Override |
27857 | 403 |
public void push(ClassSymbol s, CompletionCause phase) { |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
404 |
Node n = new CompletionNode(s); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
405 |
if (n == push(n)) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
406 |
s.completer = this; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
407 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
408 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
409 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
410 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
411 |
public void push(AttributionKind ak, JCTree t) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
412 |
push(new AttributionNode(ak, t)); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
413 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
414 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
415 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
416 |
* Push a new dependency on the stack. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
417 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
418 |
protected Node push(Node newNode) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
419 |
Node cachedNode = dependencyNodeMap.get(newNode.data); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
420 |
if (cachedNode == null) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
421 |
dependencyNodeMap.put(newNode.data, newNode); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
422 |
} else { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
423 |
newNode = cachedNode; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
424 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
425 |
if (!nodeStack.isEmpty()) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
426 |
Node currentNode = nodeStack.peek(); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
427 |
currentNode.addDependency(Node.DependencyKind.REQUIRES, newNode); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
428 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
429 |
nodeStack.push(newNode); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
430 |
return newNode; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
431 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
432 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
433 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
434 |
public void pop() { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
435 |
nodeStack.pop(); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
436 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
437 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
438 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
439 |
public void close() throws IOException { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
440 |
if (dependenciesFile != null) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
441 |
if (!dependenciesModes.contains(DependenciesMode.REDUNDANT)) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
442 |
//prune spurious edges |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
443 |
new PruneVisitor().visit(dependencyNodeMap.values(), null); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
444 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
445 |
if (!dependenciesModes.contains(DependenciesMode.CLASS)) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
446 |
//filter class completions |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
447 |
new FilterVisitor(CompletionNode.Kind.SOURCE).visit(dependencyNodeMap.values(), null); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
448 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
449 |
if (!dependenciesModes.contains(DependenciesMode.SOURCE)) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
450 |
//filter source completions |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
451 |
new FilterVisitor(CompletionNode.Kind.CLASS).visit(dependencyNodeMap.values(), null); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
452 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
453 |
if (dependenciesModes.contains(DependenciesMode.SIDE_EFFECTS)) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
454 |
//add side-effects edges |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
455 |
new SideEffectVisitor().visit(dependencyNodeMap.values(), null); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
456 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
457 |
//write to file |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
458 |
try (FileWriter fw = new FileWriter(dependenciesFile)) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
459 |
fw.append(GraphUtils.toDot(dependencyNodeMap.values(), "CompletionDeps", "")); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
460 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
461 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
462 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
463 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
464 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
465 |
public void complete(Symbol sym) throws CompletionFailure { |
27857 | 466 |
push((ClassSymbol) sym, null); |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
467 |
pop(); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
468 |
sym.completer = this; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
469 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
470 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
471 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
472 |
* This visitor is used to generate the special side-effect dependencies |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
473 |
* given a graph containing only standard dependencies. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
474 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
475 |
private static class SideEffectVisitor extends NodeVisitor<String, Node, Void> { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
476 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
477 |
public void visitNode(Node node, Void arg) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
478 |
//do nothing |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
479 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
480 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
481 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
482 |
public void visitDependency(GraphUtils.DependencyKind dk, Node from, Node to, Void arg) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
483 |
//if we are adding multiple dependencies to same node |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
484 |
//make order explicit via special 'side-effect' dependencies |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
485 |
List<Node> deps = from.depsByKind.get(dk); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
486 |
int pos = deps.indexOf(to); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
487 |
if (dk == Node.DependencyKind.REQUIRES && pos > 0) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
488 |
to.addDependency(Node.DependencyKind.SIDE_EFFECTS, deps.get(pos - 1)); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
489 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
490 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
491 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
492 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
493 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
494 |
* This visitor is used to prune the graph from spurious edges using some heuristics. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
495 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
496 |
private static class PruneVisitor extends NodeVisitor<String, Node, Void> { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
497 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
498 |
public void visitNode(Node node, Void arg) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
499 |
//do nothing |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
500 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
501 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
502 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
503 |
public void visitDependency(GraphUtils.DependencyKind dk, Node from, Node to, Void arg) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
504 |
//heuristic - skips dependencies that are likely to be fake |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
505 |
if (from.equals(to) || |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
506 |
from.depsByKind.get(Node.DependencyKind.REQUIRES).contains(to)) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
507 |
to.depsByKind.get(dk).remove(from); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
508 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
509 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
510 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
511 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
512 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
513 |
* This visitor is used to retain only completion nodes with given kind. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
514 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
515 |
private class FilterVisitor extends NodeVisitor<String, Node, Void> { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
516 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
517 |
CompletionNode.Kind ck; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
518 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
519 |
private FilterVisitor(CompletionNode.Kind ck) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
520 |
this.ck = ck; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
521 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
522 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
523 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
524 |
public void visitNode(Node node, Void arg) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
525 |
if (node instanceof CompletionNode) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
526 |
if (((CompletionNode) node).ck != ck) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
527 |
dependencyNodeMap.remove(node.data); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
528 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
529 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
530 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
531 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
532 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
533 |
public void visitDependency(GraphUtils.DependencyKind dk, Node from, Node to, Void arg) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
534 |
if (to instanceof CompletionNode) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
535 |
if (((CompletionNode) to).ck != ck) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
536 |
from.depsByKind.get(dk).remove(to); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
537 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
538 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
539 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
540 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
541 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
542 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
543 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
544 |
* Dummy class to be used when dependencies options are not set. This keeps |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
545 |
* performance cost of calling push/pop methods during completion marginally low. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
546 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
547 |
private static class DummyDependencies extends Dependencies { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
548 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
549 |
private DummyDependencies(Context context) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
550 |
super(context); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
551 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
552 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
553 |
@Override |
27857 | 554 |
public void push(ClassSymbol s, CompletionCause phase) { |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
555 |
//do nothing |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
556 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
557 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
558 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
559 |
public void push(AttributionKind ak, JCTree t) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
560 |
//do nothing |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
561 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
562 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
563 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
564 |
public void pop() { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
565 |
//do nothing |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
566 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
567 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
568 |
} |