public Set<ClassJavaType> directSuperTypes() { ImmutableSet.Builder<ClassJavaType> types = ImmutableSet.builder(); ClassJavaType superClassType = (ClassJavaType) this.superClass(); if(superClassType != null) { types.add(superClassType); } for (JavaType interfaceType : getInterfaces()) { ClassJavaType classType = (ClassJavaType) interfaceType; types.add(classType); } return types.build(); }
public Set<ClassJavaType> directSuperTypes() { ImmutableSet.Builder<ClassJavaType> types = ImmutableSet.builder(); ClassJavaType superClassType = (ClassJavaType) this.superClass(); if(superClassType != null) { types.add(superClassType); } for (JavaType interfaceType : getInterfaces()) { ClassJavaType classType = (ClassJavaType) interfaceType; types.add(classType); } return types.build(); }
/** * Includes superclass and super interface hierarchy. * @return list of classTypes. */ public Set<JavaType.ClassJavaType> superTypes() { ImmutableSet.Builder<JavaType.ClassJavaType> types = ImmutableSet.builder(); JavaType.ClassJavaType superClassType = (JavaType.ClassJavaType) this.superClass(); types.addAll(this.interfacesOfType()); while (superClassType != null) { types.add(superClassType); TypeJavaSymbol superClassSymbol = superClassType.getSymbol(); types.addAll(superClassSymbol.interfacesOfType()); superClassType = (JavaType.ClassJavaType) superClassSymbol.superClass(); } return types.build(); }
@VisibleForTesting Set<Type> supertypes(JavaType type) { List<Type> result = new ArrayList<>(); result.add(type); Symbol.TypeSymbol symbol = type.symbol(); TypeSubstitution substitution = getTypeSubstitution(type); if(substitution.size() == 0 && !((JavaSymbol.TypeJavaSymbol) symbol).typeVariableTypes.isEmpty()) { // raw type : let's create a substitution based on erasures TypeSubstitution ts = new TypeSubstitution(); ((JavaSymbol.TypeJavaSymbol) symbol).typeVariableTypes.forEach(t -> ts.add(t, t.erasure())); substitution = ts; } result.addAll(interfacesWithSubstitution(symbol, substitution)); Type superClass = symbol.superClass(); while (superClass != null) { JavaType substitutedSuperClass = applySubstitution(superClass, substitution); result.add(substitutedSuperClass); substitution = getTypeSubstitution(substitutedSuperClass); JavaSymbol.TypeJavaSymbol superClassSymbol = substitutedSuperClass.getSymbol(); result.addAll(interfacesWithSubstitution(superClassSymbol, substitution)); superClass = superClassSymbol.superClass(); } return new LinkedHashSet<>(result); }
@VisibleForTesting List<JavaType> applySiteSubstitutionToFormalParameters(List<JavaType> formals, JavaType site, Set<Type> visited) { TypeSubstitution typeSubstitution = new TypeSubstitution(); if (site.isParameterized()) { typeSubstitution = ((ParametrizedTypeJavaType) site).typeSubstitution; } TypeJavaSymbol siteSymbol = site.getSymbol(); List<JavaType> newFormals = formals; Type superClass = siteSymbol.superClass(); if (superClass != null) { JavaType newSuperClass = applySubstitution((JavaType) superClass, typeSubstitution); if(visited.add(newSuperClass)) { newFormals = applySiteSubstitutionToFormalParameters(newFormals, newSuperClass, visited); } } for (Type interfaceType : siteSymbol.interfaces()) { JavaType newInterfaceType = applySubstitution((JavaType) interfaceType, typeSubstitution); if(visited.add(newInterfaceType)) { newFormals = applySiteSubstitutionToFormalParameters(newFormals, newInterfaceType, visited); } } return applySubstitutionToFormalParameters(newFormals, typeSubstitution); }
@VisibleForTesting Set<Type> supertypes(JavaType type) { List<Type> result = new ArrayList<>(); result.add(type); Symbol.TypeSymbol symbol = type.symbol(); TypeSubstitution substitution = getTypeSubstitution(type); if(substitution.size() == 0 && !((JavaSymbol.TypeJavaSymbol) symbol).typeVariableTypes.isEmpty()) { // raw type : let's create a substitution based on erasures TypeSubstitution ts = new TypeSubstitution(); ((JavaSymbol.TypeJavaSymbol) symbol).typeVariableTypes.forEach(t -> ts.add(t, t.erasure())); substitution = ts; } result.addAll(interfacesWithSubstitution(symbol, substitution)); Type superClass = symbol.superClass(); while (superClass != null) { JavaType substitutedSuperClass = applySubstitution(superClass, substitution); result.add(substitutedSuperClass); substitution = getTypeSubstitution(substitutedSuperClass); JavaSymbol.TypeJavaSymbol superClassSymbol = substitutedSuperClass.getSymbol(); result.addAll(interfacesWithSubstitution(superClassSymbol, substitution)); superClass = superClassSymbol.superClass(); } return new LinkedHashSet<>(result); }
@VisibleForTesting List<JavaType> applySiteSubstitutionToFormalParameters(List<JavaType> formals, JavaType site, Set<Type> visited) { TypeSubstitution typeSubstitution = new TypeSubstitution(); if (site.isParameterized()) { typeSubstitution = ((ParametrizedTypeJavaType) site).typeSubstitution; } TypeJavaSymbol siteSymbol = site.getSymbol(); List<JavaType> newFormals = formals; Type superClass = siteSymbol.superClass(); if (superClass != null) { JavaType newSuperClass = applySubstitution((JavaType) superClass, typeSubstitution); if(visited.add(newSuperClass)) { newFormals = applySiteSubstitutionToFormalParameters(newFormals, newSuperClass, visited); } } for (Type interfaceType : siteSymbol.interfaces()) { JavaType newInterfaceType = applySubstitution((JavaType) interfaceType, typeSubstitution); if(visited.add(newInterfaceType)) { newFormals = applySiteSubstitutionToFormalParameters(newFormals, newInterfaceType, visited); } } return applySubstitutionToFormalParameters(newFormals, typeSubstitution); }
static TypeSubstitution substitutionFromSuperType(ParametrizedTypeJavaType target, ParametrizedTypeJavaType source) { TypeSubstitution result = new TypeSubstitution(target.typeSubstitution); if (target.rawType != source.rawType) { TypeJavaSymbol targetSymbol = target.symbol; Type superClass = targetSymbol.superClass(); if (superClass != null && ((JavaType) superClass).isParameterized()) { TypeSubstitution newSub = substitutionFromSuperType((ParametrizedTypeJavaType) superClass, source); result = result.combine(newSub); } for (Type superInterface : targetSymbol.interfaces()) { if (((JavaType) superInterface).isParameterized()) { TypeSubstitution newSub = substitutionFromSuperType((ParametrizedTypeJavaType) superInterface, source); result = result.combine(newSub); } } } else { result = target.typeSubstitution.combine(source.typeSubstitution); } return result; } }
/** * Includes superclass and super interface hierarchy. * @return list of classTypes. */ public Set<ClassJavaType> superTypes() { if (superTypes == null) { ImmutableSet.Builder<ClassJavaType> types = ImmutableSet.builder(); ClassJavaType superClassType = (ClassJavaType) this.superClass(); types.addAll(this.interfacesOfType()); while (superClassType != null) { types.add(superClassType); TypeJavaSymbol superClassSymbol = superClassType.getSymbol(); types.addAll(superClassSymbol.interfacesOfType()); superClassType = (ClassJavaType) superClassSymbol.superClass(); } superTypes = types.build(); } return superTypes; }
/** * Includes superclass and super interface hierarchy. * @return list of classTypes. */ public Set<ClassJavaType> superTypes() { if (superTypes == null) { ImmutableSet.Builder<ClassJavaType> types = ImmutableSet.builder(); ClassJavaType superClassType = (ClassJavaType) this.superClass(); types.addAll(this.interfacesOfType()); while (superClassType != null) { types.add(superClassType); TypeJavaSymbol superClassSymbol = superClassType.getSymbol(); types.addAll(superClassSymbol.interfacesOfType()); superClassType = (ClassJavaType) superClassSymbol.superClass(); } superTypes = types.build(); } return superTypes; }
/** * Includes superclass and super interface hierarchy. * @return list of classTypes. */ public Set<JavaType.ClassJavaType> superTypes() { ImmutableSet.Builder<JavaType.ClassJavaType> types = ImmutableSet.builder(); JavaType.ClassJavaType superClassType = (JavaType.ClassJavaType) this.superClass(); types.addAll(this.interfacesOfType()); while (superClassType != null) { types.add(superClassType); TypeJavaSymbol superClassSymbol = superClassType.getSymbol(); types.addAll(superClassSymbol.interfacesOfType()); superClassType = (JavaType.ClassJavaType) superClassSymbol.superClass(); } return types.build(); }
static TypeSubstitution substitutionFromSuperType(ParametrizedTypeJavaType target, ParametrizedTypeJavaType source) { TypeSubstitution result = new TypeSubstitution(target.typeSubstitution); if (target.rawType != source.rawType) { TypeJavaSymbol targetSymbol = target.symbol; Type superClass = targetSymbol.superClass(); if (superClass != null && ((JavaType) superClass).isParameterized()) { TypeSubstitution newSub = substitutionFromSuperType((ParametrizedTypeJavaType) superClass, source); result = result.combine(newSub); } for (Type superInterface : targetSymbol.interfaces()) { if (((JavaType) superInterface).isParameterized()) { TypeSubstitution newSub = substitutionFromSuperType((ParametrizedTypeJavaType) superInterface, source); result = result.combine(newSub); } } } else { result = target.typeSubstitution.combine(source.typeSubstitution); } return result; } }
@Override @CheckForNull public ClassJavaType getSuperType() { ClassJavaType type = (ClassJavaType) symbol.superClass(); if (type == null) { return null; } return substitutedType(type); }
@Override @CheckForNull public ClassJavaType getSuperType() { ClassJavaType type = (ClassJavaType) symbol.superClass(); if (type == null) { return null; } return substitutedType(type); }