private Set<ClassJavaType> interfacesOfType() { if (interfaces == null) { Deque<ClassJavaType> todo = getInterfaces().stream().map(ClassJavaType.class::cast).distinct().collect(Collectors.toCollection(LinkedList::new)); Set<ClassJavaType> builder = new LinkedHashSet<>(); while (!todo.isEmpty()) { ClassJavaType classType = todo.pop(); if(classType == type) { continue; } if (builder.add(classType)) { classType.symbol.getInterfaces().forEach(t -> todo.addLast((ClassJavaType) t)); } } interfaces = builder; } return interfaces; }
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(); }
private Set<ClassJavaType> interfacesOfType() { if (interfaces == null) { Deque<ClassJavaType> todo = getInterfaces().stream().map(ClassJavaType.class::cast).distinct().collect(Collectors.toCollection(LinkedList::new)); Set<ClassJavaType> builder = new LinkedHashSet<>(); while (!todo.isEmpty()) { ClassJavaType classType = todo.pop(); if(classType == type) { continue; } if (builder.add(classType)) { classType.symbol.getInterfaces().forEach(t -> todo.addLast((ClassJavaType) t)); } } interfaces = builder; } return interfaces; }
private JavaSymbol findMemberType(Env env, JavaSymbol.TypeJavaSymbol site, String name, JavaSymbol.TypeJavaSymbol c) { JavaSymbol bestSoFar = symbolNotFound; for (JavaSymbol symbol : c.members().lookup(name)) { if (symbol.kind == JavaSymbol.TYP) { return isAccessible(env, site, symbol) ? symbol : new AccessErrorJavaSymbol(symbol, symbols.unknownType); } } if (c.getSuperclass() != null) { JavaSymbol symbol = findMemberType(env, site, name, c.getSuperclass().symbol); if (symbol.kind < bestSoFar.kind) { bestSoFar = symbol; } } for (JavaType interfaceType : c.getInterfaces()) { JavaSymbol symbol = findMemberType(env, site, name, interfaceType.symbol); if (symbol.kind < bestSoFar.kind) { bestSoFar = symbol; } } return bestSoFar; }
/** * Finds field with given name. */ private Resolution findField(Env env, JavaSymbol.TypeJavaSymbol site, String name, JavaSymbol.TypeJavaSymbol c) { Resolution bestSoFar = unresolved(); for (JavaSymbol symbol : c.members().lookup(name)) { if (symbol.kind == JavaSymbol.VAR) { return resolveField(env, site, c, symbol); } } Resolution resolution; if (c.getSuperclass() != null) { resolution = findField(env, site, name, c.getSuperclass().symbol); if (resolution.symbol.kind < bestSoFar.symbol.kind) { resolution.type = typeSubstitutionSolver.applySiteSubstitution(resolution.type(), c.getSuperclass()); bestSoFar = resolution; } } for (JavaType interfaceType : c.getInterfaces()) { resolution = findField(env, site, name, interfaceType.symbol); if (resolution.symbol.kind < bestSoFar.symbol.kind) { bestSoFar = resolution; } } return bestSoFar; }
private JavaSymbol findMemberType(Env env, JavaSymbol.TypeJavaSymbol site, String name, JavaSymbol.TypeJavaSymbol c) { JavaSymbol bestSoFar = symbolNotFound; for (JavaSymbol symbol : c.members().lookup(name)) { if (symbol.kind == JavaSymbol.TYP) { return isAccessible(env, site, symbol) ? symbol : new AccessErrorJavaSymbol(symbol, Symbols.unknownType); } } if (c.getSuperclass() != null) { JavaSymbol symbol = findMemberType(env, site, name, c.getSuperclass().symbol); if (symbol.kind < bestSoFar.kind) { bestSoFar = symbol; } } if (c.getInterfaces() == null) { // Invariant to check that interfaces are not set only when we are looking into the symbol we are currently completing. // required for generics Preconditions.checkState(c.completing, "interfaces of a symbol not currently completing are not set."); Preconditions.checkState(c == site); } else { for (JavaType interfaceType : c.getInterfaces()) { JavaSymbol symbol = findMemberType(env, site, name, interfaceType.symbol); if (symbol.kind < bestSoFar.kind) { bestSoFar = symbol; } } } return bestSoFar; }
/** * Is given class a subclass of given base class? */ @VisibleForTesting static boolean isSubClass(JavaSymbol.TypeJavaSymbol c, JavaSymbol base) { // TODO get rid of null check if (c == null) { return false; } // TODO see Javac if (c == base) { // same class return true; } else if ((base.flags() & Flags.INTERFACE) != 0) { // check if class implements base for (JavaType interfaceType : c.getInterfaces()) { if (isSubClass(interfaceType.symbol, base)) { return true; } } // check if superclass implements base return isSubClass(superclassSymbol(c), base); } else { // check if class extends base or its superclass extends base return isSubClass(superclassSymbol(c), base); } }
@Override public List<Type> interfaces() { return Lists.<Type>newArrayList(getInterfaces()); }
@Override public List<Type> interfaces() { return Lists.<Type>newArrayList(getInterfaces()); }
@Override public List<Type> interfaces() { return Lists.<Type>newArrayList(getInterfaces()); }
private Set<JavaType.ClassJavaType> interfacesOfType() { ImmutableSet.Builder<JavaType.ClassJavaType> builder = ImmutableSet.builder(); for (JavaType interfaceType : getInterfaces()) { JavaType.ClassJavaType classType = (JavaType.ClassJavaType) interfaceType; builder.add(classType); builder.addAll(classType.getSymbol().interfacesOfType()); } return builder.build(); }
private boolean verifySuperTypes(Type superType) { JavaType superclass = getSuperType(); return (superclass != null && superclass.isSubtypeOf(superType)) || symbol.getInterfaces().stream().map(si -> typeSubstitutionSolver.applySubstitution(si, this.typeSubstitution)).anyMatch(si -> si.isSubtypeOf(superType)); }
@Override public Set<ClassJavaType> directSuperTypes() { ImmutableSet.Builder<ClassJavaType> types = ImmutableSet.builder(); ClassJavaType superClassType = getSuperType(); if(superClassType != null) { types.add(superClassType); } for (JavaType interfaceType : symbol.getInterfaces()) { types.add(substitutedType((ClassJavaType) interfaceType)); } return types.build(); }
private static boolean isSAM(ClassTree classBody) { if (hasOnlyOneMethod(classBody.members())) { // When overriding only one method of a functional interface, it can only be the single abstract method // and not one of the default methods. No need to check that the method signature matches. JavaSymbol.TypeJavaSymbol symbol = (JavaSymbol.TypeJavaSymbol) classBody.symbol(); // should be anonymous class of interface and not abstract class return symbol.getInterfaces().size() == 1 && symbol.getSuperclass().is(JAVA_LANG_OBJECT) && hasSingleAbstractMethodInHierarchy(symbol.superTypes()); } return false; }
@Override public List<Type> interfaces() { return Lists.<Type>newArrayList(getInterfaces()); }
private Set<JavaType.ClassJavaType> interfacesOfType() { ImmutableSet.Builder<JavaType.ClassJavaType> builder = ImmutableSet.builder(); for (JavaType interfaceType : getInterfaces()) { JavaType.ClassJavaType classType = (JavaType.ClassJavaType) interfaceType; builder.add(classType); builder.addAll(classType.getSymbol().interfacesOfType()); } return builder.build(); }
@Override public Set<ClassJavaType> directSuperTypes() { ImmutableSet.Builder<ClassJavaType> types = ImmutableSet.builder(); ClassJavaType superClassType = getSuperType(); if(superClassType != null) { types.add(superClassType); } for (JavaType interfaceType : symbol.getInterfaces()) { types.add(substitutedType((ClassJavaType) interfaceType)); } return types.build(); }
private static boolean isSAM(ClassTree classBody) { if (hasOnlyOneMethod(classBody.members())) { // When overriding only one method of a functional interface, it can only be the single abstract method // and not one of the default methods. No need to check that the method signature matches. JavaSymbol.TypeJavaSymbol symbol = (JavaSymbol.TypeJavaSymbol) classBody.symbol(); // should be anonymous class of interface and not abstract class return symbol.getInterfaces().size() == 1 && symbol.getSuperclass().is(JAVA_LANG_OBJECT) && hasSingleAbstractMethodInHierarchy(symbol.superTypes()); } return false; }
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(); }
private boolean verifySuperTypes(Type superType) { JavaType superclass = getSuperType(); return (superclass != null && superclass.isSubtypeOf(superType)) || symbol.getInterfaces().stream().map(si -> typeSubstitutionSolver.applySubstitution(si, this.typeSubstitution)).anyMatch(si -> si.isSubtypeOf(superType)); }