public static List<TypeReference> getBaseTypes(TypeReference input) { List<TypeReference> result = new ArrayList<>(); while (true) { result.add(input); TypeDefinition td = input.resolve(); if (td == null) break; input = td.getBaseType(); if (input == null) break; } Collections.reverse(result); return result; }
public static TypeReference getBaseType(final TypeReference type) { if (type == null) { return null; } final TypeDefinition resolvedType = type.resolve(); if (resolvedType == null) { return null; } final TypeReference baseType = resolvedType.getBaseType(); if (baseType == null) { return null; } return substituteGenericArguments(baseType, type); }
public static TypeReference getBaseType(final TypeReference type) { if (type == null) { return null; } final TypeDefinition resolvedType = type.resolve(); if (resolvedType == null) { return null; } final TypeReference baseType = resolvedType.getBaseType(); if (baseType == null) { return null; } return substituteGenericArguments(baseType, type); }
public static TypeReference getBaseType(final TypeReference type) { if (type == null) { return null; } final TypeDefinition resolvedType = type.resolve(); if (resolvedType == null) { return null; } final TypeReference baseType = resolvedType.getBaseType(); if (baseType == null) { return null; } return substituteGenericArguments(baseType, type); }
final FieldDefinition getField(final TypeDefinition declaringType, final FieldReference reference) { TypeDefinition type = declaringType; while (type != null) { final FieldDefinition field = getField(type.getDeclaredFields(), reference); if (field != null) { return field; } final TypeReference baseType = type.getBaseType(); if (baseType == null) { return null; } type = resolve(baseType); } return null; }
final FieldDefinition getField(final TypeDefinition declaringType, final FieldReference reference) { TypeDefinition type = declaringType; while (type != null) { final FieldDefinition field = getField(type.getDeclaredFields(), reference); if (field != null) { return field; } final TypeReference baseType = type.getBaseType(); if (baseType == null) { return null; } type = resolve(baseType); } return null; }
final FieldDefinition getField(final TypeDefinition declaringType, final FieldReference reference) { TypeDefinition type = declaringType; while (type != null) { final FieldDefinition field = getField(type.getDeclaredFields(), reference); if (field != null) { return field; } final TypeReference baseType = type.getBaseType(); if (baseType == null) { return null; } type = resolve(baseType); } return null; }
public static boolean isEnclosedBy(final TypeReference innerType, final TypeReference outerType) { if (innerType == null) { return false; } for (TypeReference current = innerType; current != null; current = current.getDeclaringType()) { if (isSameType(current, outerType)) { return true; } } final TypeDefinition resolvedInnerType = innerType.resolve(); return resolvedInnerType != null && isEnclosedBy(resolvedInnerType.getBaseType(), outerType); }
@Override protected StringBuilder appendGenericSignature(final StringBuilder sb) { StringBuilder s = super.appendGenericSignature(sb); final TypeReference baseType = getBaseType(); final List<TypeReference> interfaces = getExplicitInterfaces(); if (baseType == null) { if (interfaces.isEmpty()) { s = BuiltinTypes.Object.appendSignature(s); } } else { s = baseType.appendSignature(s); } for (final TypeReference interfaceType : interfaces) { s = interfaceType.appendSignature(s); } return s; }
public static boolean isEnclosedBy(final TypeReference innerType, final TypeReference outerType) { if (innerType == null) { return false; } for (TypeReference current = innerType; current != null; current = current.getDeclaringType()) { if (isSameType(current, outerType)) { return true; } } final TypeDefinition resolvedInnerType = innerType.resolve(); return resolvedInnerType != null && isEnclosedBy(resolvedInnerType.getBaseType(), outerType); }
private static MethodDefinition getSuperfinalizer(TypeDefinition type) { TypeDefinition superType = type.getBaseType().resolve(); if (superType == null || Types.isObject(superType)) return null; for (MethodDefinition child : superType.getDeclaredMethods()) { if (isFinalizer(child)) return child; } return getSuperfinalizer(superType); } }
@Override protected void visitType(TypeDefinition td) { TypeHierarchy th = getOrCreate(td); th.flags = td.getFlags(); link(th, td.getBaseType()); for (TypeReference id : td.getExplicitInterfaces()) link(th, id); }
private static boolean isEnclosedBy(final TypeReference innerType, final TypeReference outerType) { if (innerType == null) { return false; } for (TypeReference current = innerType.getDeclaringType(); current != null; current = current.getDeclaringType()) { if (MetadataResolver.areEquivalent(current, outerType)) { return true; } } final TypeDefinition resolvedInnerType = innerType.resolve(); return resolvedInnerType != null && isEnclosedBy(resolvedInnerType.getBaseType(), outerType); } }
private static boolean isEnclosedBy(final TypeReference innerType, final TypeReference outerType) { if (innerType == null) { return false; } for (TypeReference current = innerType.getDeclaringType(); current != null; current = current.getDeclaringType()) { if (MetadataResolver.areEquivalent(current, outerType)) { return true; } } final TypeDefinition resolvedInnerType = innerType.resolve(); return resolvedInnerType != null && isEnclosedBy(resolvedInnerType.getBaseType(), outerType); } }
private static boolean isEnclosedBy(final TypeReference innerType, final TypeReference outerType) { if (innerType == null) { return false; } for (TypeReference current = innerType.getDeclaringType(); current != null; current = current.getDeclaringType()) { if (MetadataResolver.areEquivalent(current, outerType)) { return true; } } final TypeDefinition resolvedInnerType = innerType.resolve(); return resolvedInnerType != null && isEnclosedBy(resolvedInnerType.getBaseType(), outerType); }
private static boolean isEnclosedBy(final TypeReference innerType, final TypeReference outerType) { if (innerType == null) { return false; } for (TypeReference current = innerType.getDeclaringType(); current != null; current = current.getDeclaringType()) { if (MetadataResolver.areEquivalent(current, outerType)) { return true; } } final TypeDefinition resolvedInnerType = innerType.resolve(); return resolvedInnerType != null && isEnclosedBy(resolvedInnerType.getBaseType(), outerType); }
private static boolean isEnclosedBy(final TypeReference innerType, final TypeReference outerType) { if (innerType == null) { return false; } for (TypeReference current = innerType.getDeclaringType(); current != null; current = current.getDeclaringType()) { if (MetadataResolver.areEquivalent(current, outerType)) { return true; } } final TypeDefinition resolvedInnerType = innerType.resolve(); return resolvedInnerType != null && isEnclosedBy(resolvedInnerType.getBaseType(), outerType); } }
@ClassVisitor public void visit(TypeDefinition td, ClassContext cc) { TypeDefinition baseType = td.getBaseType().resolve(); if(baseType == null || Types.isObject(baseType)) return; for(TypeReference tr : td.getExplicitInterfaces()) { if(tr.getInternalName().equals("java/io/Serializable")) { continue; } if(Types.isInstance(baseType, tr)) { cc.report("RedundantInterface", td.isPublic() ? 0 : 10, Roles.INTERFACE.create(tr)); } } } }
/** * @param type type to check * @return true if all superclasses and superinterfaces could be loaded */ public static boolean hasCompleteHierarchy(TypeDefinition type) { if(type == null) return false; if(type.isArray()) return hasCompleteHierarchy(type.getElementType().resolve()); TypeReference base = type.getBaseType(); if(base != null && !hasCompleteHierarchy(base.resolve())) return false; for(TypeReference tr : type.getExplicitInterfaces()) { if(!hasCompleteHierarchy(tr.resolve())) return false; } return true; }
@AstVisitor(nodes=AstNodes.EXPRESSIONS, methodName="<clinit>") public void visit(Expression expr, NodeChain nc, MethodContext mc, TypeDefinition td) { if(expr.getOperand() instanceof MemberReference) { MemberReference mr = (MemberReference) expr.getOperand(); TypeReference tr = mr.getDeclaringType(); TypeDefinition subType = tr == null ? null : tr.resolve(); if (subType != null && (subType.isAnonymous() || subType.isLocalClass())) { subType = subType.getBaseType().resolve(); } if (subType != null && !td.isEquivalentTo(subType) && Types.isInstance(subType, td) && nc .getLambdaMethod() == null) { mc.report("InitializerRefersSubclass", td.isNonPublic() || subType.isNonPublic() ? 5 : 0, expr, Roles.SUBCLASS.create(subType)); } } } }