|
25 | 25 |
|
26 | 26 | package com.sun.tools.javac.model;
|
27 | 27 |
|
| 28 | +import java.util.Arrays; |
28 | 29 | import java.util.Collections;
|
29 | 30 | import java.util.HashMap;
|
30 | 31 | import java.util.HashSet;
|
@@ -198,43 +199,48 @@ private <S extends Symbol> S unboundNameToSymbol(String methodName,
|
198 | 199 |
|
199 | 200 | return (S) resultCache.computeIfAbsent(Pair.of(methodName, nameStr), p -> {
|
200 | 201 | Set<S> found = new LinkedHashSet<>();
|
| 202 | + Set<ModuleSymbol> allModules = new HashSet<>(modules.allModules()); |
201 | 203 |
|
202 |
| - for (ModuleSymbol msym : modules.allModules()) { |
203 |
| - S sym = nameToSymbol(msym, nameStr, clazz); |
| 204 | + allModules.removeAll(modules.getRootModules()); |
204 | 205 |
|
205 |
| - if (sym == null) |
206 |
| - continue; |
| 206 | + for (Set<ModuleSymbol> modules : Arrays.asList(modules.getRootModules(), allModules)) { |
| 207 | + for (ModuleSymbol msym : modules) { |
| 208 | + S sym = nameToSymbol(msym, nameStr, clazz); |
| 209 | + |
| 210 | + if (sym == null) |
| 211 | + continue; |
207 | 212 |
|
208 |
| - if (clazz == ClassSymbol.class) { |
209 |
| - // Always include classes |
210 |
| - found.add(sym); |
211 |
| - } else if (clazz == PackageSymbol.class) { |
212 |
| - // In module mode, ignore the "spurious" empty packages that "enclose" module-specific packages. |
213 |
| - // For example, if a module contains classes or package info in package p.q.r, it will also appear |
214 |
| - // to have additional packages p.q and p, even though these packages have no content other |
215 |
| - // than the subpackage. We don't want those empty packages showing up in searches for p or p.q. |
216 |
| - if (!sym.members().isEmpty() || ((PackageSymbol) sym).package_info != null) { |
| 213 | + if (clazz == ClassSymbol.class) { |
| 214 | + // Always include classes |
217 | 215 | found.add(sym);
|
| 216 | + } else if (clazz == PackageSymbol.class) { |
| 217 | + // In module mode, ignore the "spurious" empty packages that "enclose" module-specific packages. |
| 218 | + // For example, if a module contains classes or package info in package p.q.r, it will also appear |
| 219 | + // to have additional packages p.q and p, even though these packages have no content other |
| 220 | + // than the subpackage. We don't want those empty packages showing up in searches for p or p.q. |
| 221 | + if (!sym.members().isEmpty() || ((PackageSymbol) sym).package_info != null) { |
| 222 | + found.add(sym); |
| 223 | + } |
218 | 224 | }
|
219 | 225 | }
|
220 |
| - } |
221 | 226 |
|
222 |
| - if (found.size() == 1) { |
223 |
| - return Optional.of(found.iterator().next()); |
224 |
| - } else if (found.size() > 1) { |
225 |
| - //more than one element found, produce a note: |
226 |
| - if (alreadyWarnedDuplicates.add(methodName + ":" + nameStr)) { |
227 |
| - String moduleNames = found.stream() |
228 |
| - .map(s -> s.packge().modle) |
229 |
| - .map(m -> m.toString()) |
230 |
| - .collect(Collectors.joining(", ")); |
231 |
| - log.note(Notes.MultipleElements(methodName, nameStr, moduleNames)); |
| 227 | + if (found.size() == 1) { |
| 228 | + return Optional.of(found.iterator().next()); |
| 229 | + } else if (found.size() > 1) { |
| 230 | + //more than one element found, produce a note: |
| 231 | + if (alreadyWarnedDuplicates.add(methodName + ":" + nameStr)) { |
| 232 | + String moduleNames = found.stream() |
| 233 | + .map(s -> s.packge().modle) |
| 234 | + .map(m -> m.toString()) |
| 235 | + .collect(Collectors.joining(", ")); |
| 236 | + log.note(Notes.MultipleElements(methodName, nameStr, moduleNames)); |
| 237 | + } |
| 238 | + return Optional.empty(); |
| 239 | + } else { |
| 240 | + //not found, try another option |
232 | 241 | }
|
233 |
| - return Optional.empty(); |
234 |
| - } else { |
235 |
| - //not found: |
236 |
| - return Optional.empty(); |
237 | 242 | }
|
| 243 | + return Optional.empty(); |
238 | 244 | }).orElse(null);
|
239 | 245 | }
|
240 | 246 |
|
|
0 commit comments