52 import com.sun.tools.javac.util.DefinedBy.Api; |
54 import com.sun.tools.javac.util.DefinedBy.Api; |
53 import com.sun.tools.javac.util.Name; |
55 import com.sun.tools.javac.util.Name; |
54 import static com.sun.tools.javac.code.Kinds.Kind.*; |
56 import static com.sun.tools.javac.code.Kinds.Kind.*; |
55 import static com.sun.tools.javac.code.Scope.LookupKind.NON_RECURSIVE; |
57 import static com.sun.tools.javac.code.Scope.LookupKind.NON_RECURSIVE; |
56 import static com.sun.tools.javac.code.TypeTag.CLASS; |
58 import static com.sun.tools.javac.code.TypeTag.CLASS; |
57 import com.sun.tools.javac.comp.CompileStates; |
|
58 import com.sun.tools.javac.comp.CompileStates.CompileState; |
|
59 import com.sun.tools.javac.comp.Modules; |
59 import com.sun.tools.javac.comp.Modules; |
|
60 import com.sun.tools.javac.comp.Resolve; |
|
61 import com.sun.tools.javac.comp.Resolve.RecoveryLoadClass; |
60 import static com.sun.tools.javac.tree.JCTree.Tag.*; |
62 import static com.sun.tools.javac.tree.JCTree.Tag.*; |
61 |
63 |
62 /** |
64 /** |
63 * Utility methods for operating on program elements. |
65 * Utility methods for operating on program elements. |
64 * |
66 * |
91 syms = Symtab.instance(context); |
93 syms = Symtab.instance(context); |
92 modules = Modules.instance(context); |
94 modules = Modules.instance(context); |
93 names = Names.instance(context); |
95 names = Names.instance(context); |
94 types = Types.instance(context); |
96 types = Types.instance(context); |
95 enter = Enter.instance(context); |
97 enter = Enter.instance(context); |
|
98 resolve = Resolve.instance(context); |
96 JavacTask t = context.get(JavacTask.class); |
99 JavacTask t = context.get(JavacTask.class); |
97 javacTaskImpl = t instanceof JavacTaskImpl ? (JavacTaskImpl) t : null; |
100 javacTaskImpl = t instanceof JavacTaskImpl ? (JavacTaskImpl) t : null; |
98 compileStates = CompileStates.instance(context); |
|
99 } |
101 } |
100 |
102 |
101 @Override @DefinedBy(Api.LANGUAGE_MODEL) |
103 @Override @DefinedBy(Api.LANGUAGE_MODEL) |
102 public ModuleSymbol getModuleElement(CharSequence name) { |
104 public ModuleSymbol getModuleElement(CharSequence name) { |
103 ensureEntered("getModuleElement"); |
105 ensureEntered("getModuleElement"); |
|
106 if (modules.getDefaultModule() == syms.noModule) |
|
107 return null; |
104 String strName = name.toString(); |
108 String strName = name.toString(); |
105 if (strName.equals("")) |
109 if (strName.equals("")) |
106 return syms.unnamedModule; |
110 return syms.unnamedModule; |
107 return modules.getObservableModule(names.fromString(strName)); |
111 return modules.getObservableModule(names.fromString(strName)); |
108 } |
112 } |
109 |
113 |
110 @Override @DefinedBy(Api.LANGUAGE_MODEL) |
114 @Override @DefinedBy(Api.LANGUAGE_MODEL) |
111 public PackageSymbol getPackageElement(CharSequence name) { |
115 public PackageSymbol getPackageElement(CharSequence name) { |
112 ensureEntered("getPackageElement"); |
116 return doGetPackageElement(null, name); |
113 return getPackageElement(modules.getDefaultModule(), name); |
|
114 } |
117 } |
115 |
118 |
116 @Override @DefinedBy(Api.LANGUAGE_MODEL) |
119 @Override @DefinedBy(Api.LANGUAGE_MODEL) |
117 public PackageSymbol getPackageElement(ModuleElement module, CharSequence name) { |
120 public PackageSymbol getPackageElement(ModuleElement module, CharSequence name) { |
118 String strName = name.toString(); |
121 module.getClass(); |
119 if (strName.equals("")) |
122 return doGetPackageElement(module, name); |
|
123 } |
|
124 |
|
125 private PackageSymbol doGetPackageElement(ModuleElement module, CharSequence name) { |
|
126 ensureEntered("getPackageElement"); |
|
127 if (name.length() == 0) |
120 return syms.unnamedModule.unnamedPackage; |
128 return syms.unnamedModule.unnamedPackage; |
121 return SourceVersion.isName(strName) |
129 return doGetElement(module, name, PackageSymbol.class); |
122 ? nameToSymbol((ModuleSymbol) module, strName, PackageSymbol.class) |
|
123 : null; |
|
124 } |
130 } |
125 |
131 |
126 @Override @DefinedBy(Api.LANGUAGE_MODEL) |
132 @Override @DefinedBy(Api.LANGUAGE_MODEL) |
127 public ClassSymbol getTypeElement(CharSequence name) { |
133 public ClassSymbol getTypeElement(CharSequence name) { |
128 ensureEntered("getTypeElement"); |
134 return doGetTypeElement(null, name); |
129 return getTypeElement(modules.getDefaultModule(), name); |
|
130 } |
135 } |
131 |
136 |
132 @Override @DefinedBy(Api.LANGUAGE_MODEL) |
137 @Override @DefinedBy(Api.LANGUAGE_MODEL) |
133 public ClassSymbol getTypeElement(ModuleElement module, CharSequence name) { |
138 public ClassSymbol getTypeElement(ModuleElement module, CharSequence name) { |
|
139 module.getClass(); |
|
140 |
|
141 return doGetTypeElement(module, name); |
|
142 } |
|
143 |
|
144 private ClassSymbol doGetTypeElement(ModuleElement module, CharSequence name) { |
|
145 ensureEntered("getTypeElement"); |
|
146 return doGetElement(module, name, ClassSymbol.class); |
|
147 } |
|
148 |
|
149 private <S extends Symbol> S doGetElement(ModuleElement module, CharSequence name, Class<S> clazz) { |
134 String strName = name.toString(); |
150 String strName = name.toString(); |
135 return SourceVersion.isName(strName) |
151 if (!SourceVersion.isName(strName)) { |
136 ? nameToSymbol((ModuleSymbol) module, strName, ClassSymbol.class) |
152 return null; |
137 : null; |
153 } |
|
154 if (module == null) { |
|
155 return unboundNameToSymbol(strName, clazz); |
|
156 } else { |
|
157 return nameToSymbol((ModuleSymbol) module, strName, clazz); |
|
158 } |
|
159 } |
|
160 |
|
161 private <S extends Symbol> S unboundNameToSymbol(String nameStr, Class<S> clazz) { |
|
162 if (modules.getDefaultModule() == syms.noModule) { //not a modular mode: |
|
163 return nameToSymbol(syms.noModule, nameStr, clazz); |
|
164 } |
|
165 |
|
166 RecoveryLoadClass prevRecoveryLoadClass = resolve.setRecoveryLoadClass((env, name) -> null); |
|
167 try { |
|
168 Set<S> found = new LinkedHashSet<>(); |
|
169 |
|
170 for (ModuleSymbol msym : modules.allModules()) { |
|
171 S sym = nameToSymbol(msym, nameStr, clazz); |
|
172 |
|
173 if (sym != null) { |
|
174 found.add(sym); |
|
175 } |
|
176 } |
|
177 |
|
178 if (found.size() == 1) { |
|
179 return found.iterator().next(); |
|
180 } else { |
|
181 //not found, or more than one element found: |
|
182 return null; |
|
183 } |
|
184 } finally { |
|
185 resolve.setRecoveryLoadClass(prevRecoveryLoadClass); |
|
186 } |
138 } |
187 } |
139 |
188 |
140 /** |
189 /** |
141 * Returns a symbol given the type's or package's canonical name, |
190 * Returns a symbol given the type's or package's canonical name, |
142 * or null if the name isn't found. |
191 * or null if the name isn't found. |