diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/springloaded/SpringLoadedPositionManager.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/springloaded/SpringLoadedPositionManager.java index 2ae607ecf1d5..45a2bddbeb4c 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/springloaded/SpringLoadedPositionManager.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/springloaded/SpringLoadedPositionManager.java @@ -61,10 +61,7 @@ public class SpringLoadedPositionManager implements PositionManager { Set res = new HashSet(); for (ReferenceType referenceType : referenceTypes) { - List types = findNested(referenceType, classPosition); - if (types != null) { - res.addAll(types); - } + findNested(res, referenceType, classPosition); } if (res.isEmpty()) { @@ -166,51 +163,37 @@ public class SpringLoadedPositionManager implements PositionManager { && GENERATED_CLASS_NAME.matcher(name.substring(ownerClassName.length())).matches(); } - @Nullable - private static List findNested(ReferenceType fromClass, SourcePosition classPosition) { - if (!fromClass.isPrepared()) return null; + private static void findNested(Set res, ReferenceType fromClass, SourcePosition classPosition) { + if (!fromClass.isPrepared()) return; List nestedTypes = fromClass.nestedTypes(); - List springLoadedGeneratedClasses = new ArrayList(); - + ReferenceType springLoadedGeneratedClass = null; + for (ReferenceType nested : nestedTypes) { if (!nested.isPrepared()) continue; if (isSpringLoadedGeneratedClass(fromClass, nested)) { - if (springLoadedGeneratedClasses.size() > 0 && !springLoadedGeneratedClasses.get(0).name().equals(nested.name())) { - springLoadedGeneratedClasses.clear(); // Only latest generated classes should be used. + if (springLoadedGeneratedClass == null || !springLoadedGeneratedClass.name().equals(nested.name())) { + springLoadedGeneratedClass = nested; // Only latest generated classes should be used. } - - springLoadedGeneratedClasses.add(nested); } else { - final List found = findNested(nested, classPosition); - if (found != null) { - return found; - } + findNested(res, nested, classPosition); } } try { final int lineNumber = classPosition.getLine() + 1; - if (springLoadedGeneratedClasses.isEmpty()) { - if (fromClass.locationsOfLine(lineNumber).size() > 0) { - return Collections.singletonList(fromClass); - } - } - else { - ReferenceType referenceType = springLoadedGeneratedClasses.get(0); - if (referenceType.locationsOfLine(lineNumber).size() > 0) { - return springLoadedGeneratedClasses; - } + ReferenceType effectiveRef = springLoadedGeneratedClass == null ? fromClass : springLoadedGeneratedClass; + + if (effectiveRef.locationsOfLine(lineNumber).size() > 0) { + res.add(effectiveRef); } } catch (AbsentInformationException ignored) { } - - return null; } }