author | alundblad |
Thu, 22 Oct 2015 09:05:54 +0200 | |
changeset 33366 | a113e08cc061 |
parent 30731 | 38eaf2ca243e |
child 39599 | 3c7da4996d8c |
permissions | -rw-r--r-- |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
1 |
/* |
30066
d74c06a92bd8
8078600: Infinite loop when compiling annotations with -XDcompletionDeps
alundblad
parents:
27857
diff
changeset
|
2 |
* Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. |
25844
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; |
33366
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
33 |
import com.sun.tools.javac.util.GraphUtils.DependencyKind; |
25844
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.LinkedHashMap; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
46 |
import java.util.List; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
47 |
import java.util.Map; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
48 |
import java.util.Properties; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
49 |
import java.util.Stack; |
33366
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
50 |
import java.util.stream.Collectors; |
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
51 |
import java.util.stream.Stream; |
25844
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 |
* Push a new completion node on the stack. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
82 |
*/ |
27857 | 83 |
abstract public void push(ClassSymbol s, CompletionCause phase); |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
84 |
|
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 |
* Remove current dependency node from the stack. |
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 |
abstract public void pop(); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
89 |
|
33366
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
90 |
public enum CompletionCause implements GraphUtils.DependencyKind { |
27857 | 91 |
CLASS_READER, |
92 |
HEADER_PHASE, |
|
93 |
HIERARCHY_PHASE, |
|
94 |
IMPORTS_PHASE, |
|
95 |
MEMBER_ENTER, |
|
33366
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
96 |
MEMBERS_PHASE, |
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
97 |
OTHER; |
27857 | 98 |
} |
99 |
||
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
100 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
101 |
* This class creates a graph of all dependencies as symbols are completed; |
30731
38eaf2ca243e
8080870: Open up Dependencies for use from other packages
alundblad
parents:
30066
diff
changeset
|
102 |
* when compilation finishes, the resulting dependency graph is then dumped |
38eaf2ca243e
8080870: Open up Dependencies for use from other packages
alundblad
parents:
30066
diff
changeset
|
103 |
* onto a dot file. Several options are provided to customize the output of the graph. |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
104 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
105 |
public static class GraphDependencies extends Dependencies implements Closeable, Completer { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
106 |
|
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 |
* set of enabled dependencies modes |
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 |
private EnumSet<DependenciesMode> dependenciesModes; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
111 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
112 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
113 |
* file in which the dependency graph should be written |
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 |
private String dependenciesFile; |
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 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
118 |
* Register a Context.Factory to create a Dependencies. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
119 |
*/ |
33366
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
120 |
public static void preRegister(Context context) { |
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
121 |
context.put(dependenciesKey, (Context.Factory<Dependencies>) GraphDependencies::new); |
25844
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 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
124 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
125 |
* Build a Dependencies instance. |
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 |
GraphDependencies(Context context) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
128 |
super(context); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
129 |
Options options = Options.instance(context); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
130 |
//fetch filename |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
131 |
String[] modes = options.get("completionDeps").split(","); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
132 |
for (String mode : modes) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
133 |
if (mode.startsWith("file=")) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
134 |
dependenciesFile = mode.substring(5); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
135 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
136 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
137 |
//parse modes |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
138 |
dependenciesModes = DependenciesMode.getDependenciesModes(modes); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
139 |
//add to closeables |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
140 |
JavaCompiler compiler = JavaCompiler.instance(context); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
141 |
compiler.closeables = compiler.closeables.prepend(this); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
142 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
143 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
144 |
enum DependenciesMode { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
145 |
SOURCE("source"), |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
146 |
CLASS("class"), |
33366
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
147 |
REDUNDANT("redundant"); |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
148 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
149 |
final String opt; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
150 |
|
33366
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
151 |
DependenciesMode(String opt) { |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
152 |
this.opt = opt; |
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 |
|
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 |
* 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
|
157 |
* 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
|
158 |
* 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
|
159 |
* add all modes to the resulting enum. |
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 |
static EnumSet<DependenciesMode> getDependenciesModes(String[] modes) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
162 |
EnumSet<DependenciesMode> res = EnumSet.noneOf(DependenciesMode.class); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
163 |
Collection<String> args = Arrays.asList(modes); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
164 |
if (args.contains("all")) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
165 |
res = EnumSet.allOf(DependenciesMode.class); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
166 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
167 |
for (DependenciesMode mode : values()) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
168 |
if (args.contains(mode.opt)) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
169 |
res.add(mode); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
170 |
} else if (args.contains("-" + mode.opt)) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
171 |
res.remove(mode); |
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 |
return res; |
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 |
} |
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 |
/** |
33366
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
179 |
* Class representing a node in the dependency graph. |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
180 |
*/ |
33366
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
181 |
public static abstract class Node extends GraphUtils.AbstractNode<ClassSymbol, Node> |
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
182 |
implements GraphUtils.DottableNode<ClassSymbol, Node> { |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
183 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
184 |
* dependant nodes grouped by kind |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
185 |
*/ |
33366
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
186 |
EnumMap<CompletionCause, List<Node>> depsByKind; |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
187 |
|
33366
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
188 |
Node(ClassSymbol value) { |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
189 |
super(value); |
33366
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
190 |
this.depsByKind = new EnumMap<>(CompletionCause.class); |
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
191 |
for (CompletionCause depKind : CompletionCause.values()) { |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
192 |
depsByKind.put(depKind, new ArrayList<Node>()); |
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 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
196 |
void addDependency(DependencyKind depKind, Node dep) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
197 |
List<Node> deps = depsByKind.get(depKind); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
198 |
if (!deps.contains(dep)) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
199 |
deps.add(dep); |
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 |
} |
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 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
204 |
public boolean equals(Object obj) { |
33366
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
205 |
return obj instanceof Node && data.equals(((Node) obj).data); |
25844
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 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
209 |
public int hashCode() { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
210 |
return data.hashCode(); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
211 |
} |
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 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
214 |
public GraphUtils.DependencyKind[] getSupportedDependencyKinds() { |
33366
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
215 |
return CompletionCause.values(); |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
216 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
217 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
218 |
@Override |
33366
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
219 |
public java.util.Collection<? extends Node> getDependenciesByKind(DependencyKind dk) { |
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
220 |
return depsByKind.get(dk); |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
221 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
222 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
223 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
224 |
public Properties nodeAttributes() { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
225 |
Properties p = new Properties(); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
226 |
p.put("label", DotVisitor.wrap(toString())); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
227 |
return p; |
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 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
231 |
public Properties dependencyAttributes(Node to, GraphUtils.DependencyKind dk) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
232 |
Properties p = new Properties(); |
33366
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
233 |
p.put("label", dk); |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
234 |
return p; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
235 |
} |
33366
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
236 |
|
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
237 |
@Override |
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
238 |
public String toString() { |
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
239 |
return data.getQualifiedName().toString(); |
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
240 |
} |
25844
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 |
|
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 |
* 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
|
245 |
* Completion requests can come from either source or class. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
246 |
*/ |
30731
38eaf2ca243e
8080870: Open up Dependencies for use from other packages
alundblad
parents:
30066
diff
changeset
|
247 |
public static class CompletionNode extends Node { |
25844
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 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
250 |
* Completion kind (source vs. classfile) |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
251 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
252 |
enum Kind { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
253 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
254 |
* Source completion request |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
255 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
256 |
SOURCE("solid"), |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
257 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
258 |
* Classfile completion request |
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 |
CLASS("dotted"); |
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 |
final String dotStyle; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
263 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
264 |
Kind(String dotStyle) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
265 |
this.dotStyle = dotStyle; |
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 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
268 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
269 |
final Kind ck; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
270 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
271 |
CompletionNode(ClassSymbol sym) { |
33366
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
272 |
super(sym); |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
273 |
//infer completion kind by looking at the symbol fields |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
274 |
boolean fromClass = (sym.classfile == null && sym.sourcefile == null) || |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
275 |
(sym.classfile != null && sym.classfile.getKind() == JavaFileObject.Kind.CLASS); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
276 |
ck = fromClass ? |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
277 |
CompletionNode.Kind.CLASS : |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
278 |
CompletionNode.Kind.SOURCE; |
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 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
282 |
public Properties nodeAttributes() { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
283 |
Properties p = super.nodeAttributes(); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
284 |
p.put("style", ck.dotStyle); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
285 |
p.put("shape", "ellipse"); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
286 |
return p; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
287 |
} |
30731
38eaf2ca243e
8080870: Open up Dependencies for use from other packages
alundblad
parents:
30066
diff
changeset
|
288 |
|
38eaf2ca243e
8080870: Open up Dependencies for use from other packages
alundblad
parents:
30066
diff
changeset
|
289 |
public ClassSymbol getClassSymbol() { |
33366
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
290 |
return data; |
25844
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 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
294 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
295 |
* stack of dependency nodes currently being processed |
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 |
Stack<Node> nodeStack = new Stack<>(); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
298 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
299 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
300 |
* map containing all dependency nodes seen so far |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
301 |
*/ |
33366
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
302 |
Map<ClassSymbol, Node> dependencyNodeMap = new LinkedHashMap<>(); |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
303 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
304 |
@Override |
27857 | 305 |
public void push(ClassSymbol s, CompletionCause phase) { |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
306 |
Node n = new CompletionNode(s); |
33366
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
307 |
if (n == push(n, phase)) { |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
308 |
s.completer = this; |
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 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
311 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
312 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
313 |
* Push a new dependency on the stack. |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
314 |
*/ |
33366
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
315 |
protected Node push(Node newNode, CompletionCause cc) { |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
316 |
Node cachedNode = dependencyNodeMap.get(newNode.data); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
317 |
if (cachedNode == null) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
318 |
dependencyNodeMap.put(newNode.data, newNode); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
319 |
} else { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
320 |
newNode = cachedNode; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
321 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
322 |
if (!nodeStack.isEmpty()) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
323 |
Node currentNode = nodeStack.peek(); |
33366
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
324 |
currentNode.addDependency(cc, newNode); |
25844
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 |
nodeStack.push(newNode); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
327 |
return newNode; |
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 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
330 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
331 |
public void pop() { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
332 |
nodeStack.pop(); |
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 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
335 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
336 |
public void close() throws IOException { |
30731
38eaf2ca243e
8080870: Open up Dependencies for use from other packages
alundblad
parents:
30066
diff
changeset
|
337 |
if (!dependenciesModes.contains(DependenciesMode.REDUNDANT)) { |
38eaf2ca243e
8080870: Open up Dependencies for use from other packages
alundblad
parents:
30066
diff
changeset
|
338 |
//prune spurious edges |
38eaf2ca243e
8080870: Open up Dependencies for use from other packages
alundblad
parents:
30066
diff
changeset
|
339 |
new PruneVisitor().visit(dependencyNodeMap.values(), null); |
38eaf2ca243e
8080870: Open up Dependencies for use from other packages
alundblad
parents:
30066
diff
changeset
|
340 |
} |
38eaf2ca243e
8080870: Open up Dependencies for use from other packages
alundblad
parents:
30066
diff
changeset
|
341 |
if (!dependenciesModes.contains(DependenciesMode.CLASS)) { |
38eaf2ca243e
8080870: Open up Dependencies for use from other packages
alundblad
parents:
30066
diff
changeset
|
342 |
//filter class completions |
38eaf2ca243e
8080870: Open up Dependencies for use from other packages
alundblad
parents:
30066
diff
changeset
|
343 |
new FilterVisitor(CompletionNode.Kind.SOURCE).visit(dependencyNodeMap.values(), null); |
38eaf2ca243e
8080870: Open up Dependencies for use from other packages
alundblad
parents:
30066
diff
changeset
|
344 |
} |
38eaf2ca243e
8080870: Open up Dependencies for use from other packages
alundblad
parents:
30066
diff
changeset
|
345 |
if (!dependenciesModes.contains(DependenciesMode.SOURCE)) { |
38eaf2ca243e
8080870: Open up Dependencies for use from other packages
alundblad
parents:
30066
diff
changeset
|
346 |
//filter source completions |
38eaf2ca243e
8080870: Open up Dependencies for use from other packages
alundblad
parents:
30066
diff
changeset
|
347 |
new FilterVisitor(CompletionNode.Kind.CLASS).visit(dependencyNodeMap.values(), null); |
38eaf2ca243e
8080870: Open up Dependencies for use from other packages
alundblad
parents:
30066
diff
changeset
|
348 |
} |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
349 |
if (dependenciesFile != null) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
350 |
//write to file |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
351 |
try (FileWriter fw = new FileWriter(dependenciesFile)) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
352 |
fw.append(GraphUtils.toDot(dependencyNodeMap.values(), "CompletionDeps", "")); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
353 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
354 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
355 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
356 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
357 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
358 |
public void complete(Symbol sym) throws CompletionFailure { |
33366
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
359 |
push((ClassSymbol)sym, CompletionCause.OTHER); |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
360 |
pop(); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
361 |
sym.completer = this; |
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 |
|
30066
d74c06a92bd8
8078600: Infinite loop when compiling annotations with -XDcompletionDeps
alundblad
parents:
27857
diff
changeset
|
364 |
@Override |
d74c06a92bd8
8078600: Infinite loop when compiling annotations with -XDcompletionDeps
alundblad
parents:
27857
diff
changeset
|
365 |
public boolean isTerminal() { |
d74c06a92bd8
8078600: Infinite loop when compiling annotations with -XDcompletionDeps
alundblad
parents:
27857
diff
changeset
|
366 |
return true; |
d74c06a92bd8
8078600: Infinite loop when compiling annotations with -XDcompletionDeps
alundblad
parents:
27857
diff
changeset
|
367 |
} |
d74c06a92bd8
8078600: Infinite loop when compiling annotations with -XDcompletionDeps
alundblad
parents:
27857
diff
changeset
|
368 |
|
30731
38eaf2ca243e
8080870: Open up Dependencies for use from other packages
alundblad
parents:
30066
diff
changeset
|
369 |
public Collection<Node> getNodes() { |
38eaf2ca243e
8080870: Open up Dependencies for use from other packages
alundblad
parents:
30066
diff
changeset
|
370 |
return dependencyNodeMap.values(); |
38eaf2ca243e
8080870: Open up Dependencies for use from other packages
alundblad
parents:
30066
diff
changeset
|
371 |
} |
38eaf2ca243e
8080870: Open up Dependencies for use from other packages
alundblad
parents:
30066
diff
changeset
|
372 |
|
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
373 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
374 |
* 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
|
375 |
*/ |
33366
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
376 |
private static class PruneVisitor extends NodeVisitor<ClassSymbol, Node, Void> { |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
377 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
378 |
public void visitNode(Node node, Void arg) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
379 |
//do nothing |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
380 |
} |
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 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
383 |
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
|
384 |
//heuristic - skips dependencies that are likely to be fake |
33366
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
385 |
if (from.equals(to)) { |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
386 |
to.depsByKind.get(dk).remove(from); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
387 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
388 |
} |
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 |
* 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
|
393 |
*/ |
33366
a113e08cc061
8087349: Test tools/sjavac/IncCompInheritance.java is failing
alundblad
parents:
30731
diff
changeset
|
394 |
private class FilterVisitor extends NodeVisitor<ClassSymbol, Node, Void> { |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
395 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
396 |
CompletionNode.Kind ck; |
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 |
private FilterVisitor(CompletionNode.Kind ck) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
399 |
this.ck = ck; |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
400 |
} |
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 |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
403 |
public void visitNode(Node node, Void arg) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
404 |
if (node instanceof CompletionNode) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
405 |
if (((CompletionNode) node).ck != ck) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
406 |
dependencyNodeMap.remove(node.data); |
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 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
411 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
412 |
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
|
413 |
if (to instanceof CompletionNode) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
414 |
if (((CompletionNode) to).ck != ck) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
415 |
from.depsByKind.get(dk).remove(to); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
416 |
} |
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 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
419 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
420 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
421 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
422 |
/** |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
423 |
* 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
|
424 |
* 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
|
425 |
*/ |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
426 |
private static class DummyDependencies extends Dependencies { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
427 |
|
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
428 |
private DummyDependencies(Context context) { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
429 |
super(context); |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
430 |
} |
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 |
@Override |
27857 | 433 |
public void push(ClassSymbol s, CompletionCause phase) { |
25844
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
434 |
//do nothing |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
435 |
} |
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 |
@Override |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
438 |
public void pop() { |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
439 |
//do nothing |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
440 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
441 |
} |
48eab270456c
8048890: Add option to keep track of symbol completion dependencies
mcimadamore
parents:
diff
changeset
|
442 |
} |