protected JvmType findNestedType(JvmDeclaredType outer, List<String> segments, int i) { Iterable<JvmDeclaredType> nestedTypesByName = outer.findAllNestedTypesByName(segments.get(i)); for(JvmDeclaredType nestedType: nestedTypesByName) { if (i == segments.size() - 1) { return nestedType; } JvmType result = findNestedType(nestedType, segments, i + 1); if (result != null) { return result; } } return null; } }
protected JvmType findNestedType(JvmType result, int index, QualifiedName name) { List<String> segments = name.getSegmentCount() == 1 ? Strings.split(name.getFirstSegment(), '$') : name.getSegments(); for(int i = 1; i < segments.size() && result instanceof JvmDeclaredType; i++) { JvmDeclaredType declaredType = (JvmDeclaredType) result; String simpleName = segments.get(i); // TODO handle ambiguous types for(JvmMember member: declaredType.findAllNestedTypesByName(simpleName)) { result = (JvmType) member; break; } if (declaredType == result) { return null; } } return result; }
@Override protected Iterable<IEObjectDescription> getLocalElementsByName(QualifiedName name) { List<JvmDeclaredType> nestedTypeDeclarators = session.getNestedTypeDeclarators(); if (nestedTypeDeclarators.isEmpty()) return Collections.emptyList(); Iterator<JvmDeclaredType> iterator = nestedTypeDeclarators.iterator(); String simpleName = name.getFirstSegment(); List<IEObjectDescription> result = null; while(iterator.hasNext()) { JvmDeclaredType declarator = iterator.next(); Iterable<JvmDeclaredType> nestedTypes = declarator.findAllNestedTypesByName(simpleName); if (name.getSegmentCount() == 1 && nestedTypes.iterator().hasNext()) { result = addDescriptions(name, 0, nestedTypes, result); } } if (result == null && name.getSegmentCount() == 1 && simpleName.indexOf('$') > 0) { QualifiedName splitted = QualifiedName.create(Strings.split(simpleName, '$')); return getLocalElementsByName(splitted); } if (result != null) return result; return Collections.emptyList(); }
while (iter.hasNext()) { String segment = iter.next(); Iterator<JvmDeclaredType> members = current.findAllNestedTypesByName(segment).iterator(); if (members.hasNext()) { current = members.next();
private List<IEObjectDescription> addDescriptions(QualifiedName name, int idx, Iterable<JvmDeclaredType> declaredTypes, List<IEObjectDescription> result) { if (idx == name.getSegmentCount()) { return result; } if (idx == name.getSegmentCount() - 1) { if (result == null) result = Lists.newArrayList(); for(JvmDeclaredType declaredType: declaredTypes) { result.add(createDescription(name, declaredType)); } return result; } String nextSegment = name.getSegment(idx); for(JvmDeclaredType declaredType: declaredTypes) { Iterable<JvmDeclaredType> nestedTypes = declaredType.findAllNestedTypesByName(nextSegment); addDescriptions(name, idx + 1, nestedTypes, result); } return result; }
protected IEObjectDescription doGetSingleElement(JvmDeclaredType declarator, QualifiedName name, String firstSegment, int dollarIndex) { if (declarator.isLocal()) { JvmTypeReference superTypeReference = Iterables.getLast(declarator.getSuperTypes()); if (InferredTypeIndicator.isInferred(superTypeReference)) return findNestedTypeInLocalTypeNonResolving(declarator, name, firstSegment, dollarIndex); } Iterable<JvmDeclaredType> nestedTypes = declarator.findAllNestedTypesByName(firstSegment); for(JvmDeclaredType nested: nestedTypes) { JvmType nestedType = findNestedType(nested, 0, name); if (nestedType != null) { return toDescription(name, nestedType, dollarIndex, 0); } } return null; }