@Override public Void visitParameterizedType(final TypeReference t, final Map<TypeReference, TypeReference> map) { final TypeReference r = MetadataHelper.asSuper(t.getUnderlyingType(), argumentType); final TypeReference s = MetadataHelper.asSubType(argumentType, r != null ? r : t.getUnderlyingType()); if (s != null && s instanceof IGenericInstance) { final List<TypeReference> tArgs = ((IGenericInstance) t).getTypeArguments(); final List<TypeReference> sArgs = ((IGenericInstance) s).getTypeArguments(); if (tArgs.size() == sArgs.size()) { for (int i = 0, n = tArgs.size(); i < n; i++) { argumentType = sArgs.get(i); visit(tArgs.get(i), map); } } } return null; }
@Override public TypeReference visitGenericParameter(final GenericParameter t, final TypeReference s) { if (isSameType(t, s)) { return t; } return asSuper(s, t.hasExtendsBound() ? t.getExtendsBound() : BuiltinTypes.Object); }
@Override public Void visitParameterizedType(final TypeReference t, final Map<TypeReference, TypeReference> map) { final TypeReference r = MetadataHelper.asSuper(t.getUnderlyingType(), argumentType); final TypeReference s = MetadataHelper.asSubType(argumentType, r != null ? r : t.getUnderlyingType()); if (s != null && s instanceof IGenericInstance) { final List<TypeReference> tArgs = ((IGenericInstance) t).getTypeArguments(); final List<TypeReference> sArgs = ((IGenericInstance) s).getTypeArguments(); if (tArgs.size() == sArgs.size()) { for (int i = 0, n = tArgs.size(); i < n; i++) { argumentType = sArgs.get(i); visit(tArgs.get(i), map); } } } return null; }
@Override public Void visitParameterizedType(final TypeReference t, final Map<TypeReference, TypeReference> map) { final TypeReference r = MetadataHelper.asSuper(t.getUnderlyingType(), argumentType); final TypeReference s = MetadataHelper.asSubType(argumentType, r != null ? r : t.getUnderlyingType()); if (s != null && s instanceof IGenericInstance) { final List<TypeReference> tArgs = ((IGenericInstance) t).getTypeArguments(); final List<TypeReference> sArgs = ((IGenericInstance) s).getTypeArguments(); if (tArgs.size() == sArgs.size()) { for (int i = 0, n = tArgs.size(); i < n; i++) { argumentType = sArgs.get(i); visit(tArgs.get(i), map); } } } return null; }
@Override public Void visitParameterizedType(final TypeReference t, final Map<TypeReference, TypeReference> map) { final TypeReference r = MetadataHelper.asSuper(t.getUnderlyingType(), argumentType); final TypeReference s = MetadataHelper.asSubType(argumentType, r != null ? r : t.getUnderlyingType()); if (s != null && s instanceof IGenericInstance) { final List<TypeReference> tArgs = ((IGenericInstance) t).getTypeArguments(); final List<TypeReference> sArgs = ((IGenericInstance) s).getTypeArguments(); if (tArgs.size() == sArgs.size()) { for (int i = 0, n = tArgs.size(); i < n; i++) { argumentType = sArgs.get(i); visit(tArgs.get(i), map); } } } return null; }
@Override public Void visitParameterizedType(final TypeReference t, final Map<TypeReference, TypeReference> map) { final TypeReference r = MetadataHelper.asSuper(t.getUnderlyingType(), argumentType); final TypeReference s = MetadataHelper.asSubType(argumentType, r != null ? r : t.getUnderlyingType()); if (s != null && s instanceof IGenericInstance) { final List<TypeReference> tArgs = ((IGenericInstance) t).getTypeArguments(); final List<TypeReference> sArgs = ((IGenericInstance) s).getTypeArguments(); if (tArgs.size() == sArgs.size()) { for (int i = 0, n = tArgs.size(); i < n; i++) { argumentType = sArgs.get(i); visit(tArgs.get(i), map); } } } return null; }
@Override public Void visitParameterizedType(final TypeReference t, final Map<TypeReference, TypeReference> map) { final TypeReference r = MetadataHelper.asSuper(t.getUnderlyingType(), argumentType); final TypeReference s = MetadataHelper.asSubType(argumentType, r != null ? r : t.getUnderlyingType()); if (s != null && s instanceof IGenericInstance) { final List<TypeReference> tArgs = ((IGenericInstance) t).getTypeArguments(); final List<TypeReference> sArgs = ((IGenericInstance) s).getTypeArguments(); if (tArgs.size() == sArgs.size()) { for (int i = 0, n = tArgs.size(); i < n; i++) { argumentType = sArgs.get(i); visit(tArgs.get(i), map); } } } return null; }
@Override public TypeReference visitGenericParameter(final GenericParameter t, final TypeReference s) { if (isSameType(t, s)) { return t; } return asSuper(s, t.hasExtendsBound() ? t.getExtendsBound() : BuiltinTypes.Object); }
@Override public TypeReference visitGenericParameter(final GenericParameter t, final TypeReference s) { if (isSameType(t, s)) { return t; } return asSuper(s, t.hasExtendsBound() ? t.getExtendsBound() : BuiltinTypes.Object); }
public static TypeReference getDeclaredType(final TypeReference type) { if (type == null) { return null; } final TypeDefinition resolvedType = type.resolve(); if (resolvedType == null) { return type; } if (resolvedType.isAnonymous()) { final List<TypeReference> interfaces = resolvedType.getExplicitInterfaces(); final TypeReference baseType = interfaces.isEmpty() ? resolvedType.getBaseType() : interfaces.get(0); if (baseType != null) { final TypeReference asSuperType = asSuper(baseType, type); if (asSuperType != null) { return asSuperType; } return baseType.isGenericType() ? new RawType(baseType) : baseType; } } return type; }
public static TypeReference getDeclaredType(final TypeReference type) { if (type == null) { return null; } final TypeDefinition resolvedType = type.resolve(); if (resolvedType == null) { return type; } if (resolvedType.isAnonymous()) { final List<TypeReference> interfaces = resolvedType.getExplicitInterfaces(); final TypeReference baseType = interfaces.isEmpty() ? resolvedType.getBaseType() : interfaces.get(0); if (baseType != null) { final TypeReference asSuperType = asSuper(baseType, type); if (asSuperType != null) { return asSuperType; } return baseType.isGenericType() ? new RawType(baseType) : baseType; } } return type; }
public static TypeReference getDeclaredType(final TypeReference type) { if (type == null) { return null; } final TypeDefinition resolvedType = type.resolve(); if (resolvedType == null) { return type; } if (resolvedType.isAnonymous()) { final List<TypeReference> interfaces = resolvedType.getExplicitInterfaces(); final TypeReference baseType = interfaces.isEmpty() ? resolvedType.getBaseType() : interfaces.get(0); if (baseType != null) { final TypeReference asSuperType = asSuper(baseType, type); if (asSuperType != null) { return asSuperType; } return baseType.isGenericType() ? new RawType(baseType) : baseType; } } return type; }
private static TypeReference adjustDeclaringType(final ResolveResult valueResult, final TypeReference declaringType) { if (valueResult.getType().isGenericType() && (declaringType.isGenericType() || MetadataHelper.isRawType(declaringType))) { final TypeReference asSuper = MetadataHelper.asSuper(declaringType, valueResult.getType()); if (asSuper != null) { return asSuper; } } return declaringType; }
@Override public Boolean visitClassType(final TypeReference t, final TypeReference s) { final TypeReference superType = asSuper(s, t); return superType != null && StringUtilities.equals(superType.getInternalName(), s.getInternalName()) && // You're not allowed to write // Vector<Object> vec = new Vector<String>(); // But with wildcards you can write // Vector<? extends Object> vec = new Vector<String>(); // which means that subtype checking must be done // here instead of same-type checking (via containsType). (!(s instanceof IGenericInstance) || containsTypeRecursive(s, superType)) && isSubTypeNoCapture(superType.getDeclaringType(), s.getDeclaringType()); }
@Override public TypeReference visitClassType(final TypeReference t, final TypeReference s) { if (StringUtilities.equals(t.getInternalName(), s.getInternalName())) { return t; } final TypeReference st = getSuperType(t); if (st != null && (st.getSimpleType() == JvmType.Object || st.getSimpleType() == JvmType.TypeVariable)) { final TypeReference x = asSuper(s, st); if (x != null) { return x; } } final TypeDefinition ds = s.resolve(); if (ds != null && ds.isInterface()) { for (final TypeReference i : getInterfaces(t)) { final TypeReference x = asSuper(s, i); if (x != null) { return x; } } } return null; }
@Override public TypeReference visitClassType(final TypeReference t, final TypeReference s) { if (StringUtilities.equals(t.getInternalName(), s.getInternalName())) { return t; } final TypeReference st = getSuperType(t); if (st != null && (st.getSimpleType() == JvmType.Object || st.getSimpleType() == JvmType.TypeVariable)) { final TypeReference x = asSuper(s, st); if (x != null) { return x; } } final TypeDefinition ds = s.resolve(); if (ds != null && ds.isInterface()) { for (final TypeReference i : getInterfaces(t)) { final TypeReference x = asSuper(s, i); if (x != null) { return x; } } } return null; }
@Override public TypeReference visitClassType(final TypeReference t, final TypeReference s) { if (StringUtilities.equals(t.getInternalName(), s.getInternalName())) { return t; } final TypeReference st = getSuperType(t); if (st != null && (st.getSimpleType() == JvmType.Object || st.getSimpleType() == JvmType.TypeVariable)) { final TypeReference x = asSuper(s, st); if (x != null) { return x; } } final TypeDefinition ds = s.resolve(); if (ds != null && ds.isInterface()) { for (final TypeReference i : getInterfaces(t)) { final TypeReference x = asSuper(s, i); if (x != null) { return x; } } } return null; }
@Override public Boolean visitClassType(final TypeReference t, final TypeReference s) { final TypeReference superType = asSuper(s, t); return superType != null && StringUtilities.equals(superType.getInternalName(), s.getInternalName()) && // You're not allowed to write // Vector<Object> vec = new Vector<String>(); // But with wildcards you can write // Vector<? extends Object> vec = new Vector<String>(); // which means that subtype checking must be done // here instead of same-type checking (via containsType). (!(s instanceof IGenericInstance) || containsTypeRecursive(s, superType)) && isSubTypeNoCapture(superType.getDeclaringType(), s.getDeclaringType()); }
@Override public Boolean visitClassType(final TypeReference t, final TypeReference s) { final TypeReference superType = asSuper(s, t); return superType != null && StringUtilities.equals(superType.getInternalName(), s.getInternalName()) && // You're not allowed to write // Vector<Object> vec = new Vector<String>(); // But with wildcards you can write // Vector<? extends Object> vec = new Vector<String>(); // which means that subtype checking must be done // here instead of same-type checking (via containsType). (!(s instanceof IGenericInstance) || containsTypeRecursive(s, superType)) && isSubTypeNoCapture(superType.getDeclaringType(), s.getDeclaringType()); }
private static boolean isSubtypeUncheckedInternal(final TypeReference t, final TypeReference s) { if (t == s) { return true; } if (t == null || s == null) { return false; } if (t.isArray() && s.isArray()) { if (t.getElementType().isPrimitive()) { return isSameType(getElementType(t), getElementType(s)); } else { return isSubTypeUnchecked(getElementType(t), getElementType(s)); } } else if (isSubType(t, s)) { return true; } else if (t.isGenericParameter() && t.hasExtendsBound()) { return isSubTypeUnchecked(getUpperBound(t), s); } else if (!isRawType(s)) { final TypeReference t2 = asSuper(s, t); if (t2 != null && isRawType(t2)) { return true; } } return false; }