public static List<TypeReference> eraseRecursive(final List<TypeReference> types) { ArrayList<TypeReference> result = null; for (int i = 0, n = types.size(); i < n; i++) { final TypeReference type = types.get(i); final TypeReference erased = eraseRecursive(type); if (result != null) { result.set(i, erased); } else if (type != erased) { result = new ArrayList<>(types); result.set(i, erased); } } return result != null ? result : types; }
public static List<TypeReference> eraseRecursive(final List<TypeReference> types) { ArrayList<TypeReference> result = null; for (int i = 0, n = types.size(); i < n; i++) { final TypeReference type = types.get(i); final TypeReference erased = eraseRecursive(type); if (result != null) { result.set(i, erased); } else if (type != erased) { result = new ArrayList<>(types); result.set(i, erased); } } return result != null ? result : types; }
public static List<TypeReference> eraseRecursive(final List<TypeReference> types) { ArrayList<TypeReference> result = null; for (int i = 0, n = types.size(); i < n; i++) { final TypeReference type = types.get(i); final TypeReference erased = eraseRecursive(type); if (result != null) { result.set(i, erased); } else if (type != erased) { result = new ArrayList<>(types); result.set(i, erased); } } return result != null ? result : types; }
@Override public List<TypeReference> visitClassType(final TypeReference t, final Void ignored) { final TypeDefinition r = t.resolve(); if (r == null) { return Collections.emptyList(); } final List<TypeReference> interfaces = r.getExplicitInterfaces(); if (r.isGenericDefinition()) { if (t.isGenericDefinition()) { return interfaces; } if (isRawType(t)) { return eraseRecursive(interfaces); } final List<? extends TypeReference> formal = getTypeArguments(r); final List<? extends TypeReference> actual = getTypeArguments(t); final ArrayList<TypeReference> result = new ArrayList<>(); final Map<TypeReference, TypeReference> mappings = new HashMap<>(); for (int i = 0, n = formal.size(); i < n; i++) { mappings.put(formal.get(i), actual.get(i)); } for (int i = 0, n = interfaces.size(); i < n; i++) { result.add(substituteGenericArguments(interfaces.get(i), mappings)); } return result; } return interfaces; }
@Override public List<TypeReference> visitClassType(final TypeReference t, final Void ignored) { final TypeDefinition r = t.resolve(); if (r == null) { return Collections.emptyList(); } final List<TypeReference> interfaces = r.getExplicitInterfaces(); if (r.isGenericDefinition()) { if (t.isGenericDefinition()) { return interfaces; } if (isRawType(t)) { return eraseRecursive(interfaces); } final List<? extends TypeReference> formal = getTypeArguments(r); final List<? extends TypeReference> actual = getTypeArguments(t); final ArrayList<TypeReference> result = new ArrayList<>(); final Map<TypeReference, TypeReference> mappings = new HashMap<>(); for (int i = 0, n = formal.size(); i < n; i++) { mappings.put(formal.get(i), actual.get(i)); } for (int i = 0, n = interfaces.size(); i < n; i++) { result.add(substituteGenericArguments(interfaces.get(i), mappings)); } return result; } return interfaces; }
@Override public List<TypeReference> visitClassType(final TypeReference t, final Void ignored) { final TypeDefinition r = t.resolve(); if (r == null) { return Collections.emptyList(); } final List<TypeReference> interfaces = r.getExplicitInterfaces(); if (r.isGenericDefinition()) { if (t.isGenericDefinition()) { return interfaces; } if (isRawType(t)) { return eraseRecursive(interfaces); } final List<? extends TypeReference> formal = getTypeArguments(r); final List<? extends TypeReference> actual = getTypeArguments(t); final ArrayList<TypeReference> result = new ArrayList<>(); final Map<TypeReference, TypeReference> mappings = new HashMap<>(); for (int i = 0, n = formal.size(); i < n; i++) { mappings.put(formal.get(i), actual.get(i)); } for (int i = 0, n = interfaces.size(); i < n; i++) { result.add(substituteGenericArguments(interfaces.get(i), mappings)); } return result; } return interfaces; }
static FieldDefinition getField(final List<FieldDefinition> candidates, final FieldReference reference) { for (int i = 0, n = candidates.size(); i < n; i++) { final FieldDefinition candidate = candidates.get(i); if (StringComparator.Ordinal.equals(candidate.getName(), reference.getName())) { final TypeReference referenceType = reference.getFieldType(); final TypeReference candidateType = candidate.getFieldType(); if (areEquivalent(candidateType, referenceType)) { return candidate; } final TypeReference rawCandidateType = MetadataHelper.eraseRecursive(candidateType); final TypeReference rawReferenceType = MetadataHelper.eraseRecursive(referenceType); if ((rawCandidateType != candidateType || rawReferenceType != referenceType) && areEquivalent(rawCandidateType, rawReferenceType)) { return candidate; } } } return null; }
public RawMethod(final MethodReference baseMethod) { VerifyArgument.notNull(baseMethod, "baseMethod"); final TypeReference declaringType = baseMethod.getDeclaringType(); _baseMethod = baseMethod; _declaringType = MetadataHelper.eraseRecursive(declaringType); _returnType = MetadataHelper.eraseRecursive(baseMethod.getReturnType()); _parameters = new ParameterDefinitionCollection(this); for (final ParameterDefinition parameter : baseMethod.getParameters()) { if (parameter.hasName()) { _parameters.add( new ParameterDefinition( parameter.getSlot(), parameter.getName(), MetadataHelper.eraseRecursive(parameter.getParameterType()) ) ); } else { _parameters.add( new ParameterDefinition( parameter.getSlot(), MetadataHelper.eraseRecursive(parameter.getParameterType()) ) ); } } _parameters.freeze(); }
public RawMethod(final MethodReference baseMethod) { VerifyArgument.notNull(baseMethod, "baseMethod"); final TypeReference declaringType = baseMethod.getDeclaringType(); _baseMethod = baseMethod; _declaringType = MetadataHelper.eraseRecursive(declaringType); _returnType = MetadataHelper.eraseRecursive(baseMethod.getReturnType()); _parameters = new ParameterDefinitionCollection(this); for (final ParameterDefinition parameter : baseMethod.getParameters()) { if (parameter.hasName()) { _parameters.add( new ParameterDefinition( parameter.getSlot(), parameter.getName(), MetadataHelper.eraseRecursive(parameter.getParameterType()) ) ); } else { _parameters.add( new ParameterDefinition( parameter.getSlot(), MetadataHelper.eraseRecursive(parameter.getParameterType()) ) ); } } _parameters.freeze(); }
public RawMethod(final MethodReference baseMethod) { VerifyArgument.notNull(baseMethod, "baseMethod"); final TypeReference declaringType = baseMethod.getDeclaringType(); _baseMethod = baseMethod; _declaringType = MetadataHelper.eraseRecursive(declaringType); _returnType = MetadataHelper.eraseRecursive(baseMethod.getReturnType()); _parameters = new ParameterDefinitionCollection(this); for (final ParameterDefinition parameter : baseMethod.getParameters()) { if (parameter.hasName()) { _parameters.add( new ParameterDefinition( parameter.getSlot(), parameter.getName(), MetadataHelper.eraseRecursive(parameter.getParameterType()) ) ); } else { _parameters.add( new ParameterDefinition( parameter.getSlot(), MetadataHelper.eraseRecursive(parameter.getParameterType()) ) ); } } _parameters.freeze(); }
@Override public TypeReference visitRawType(final RawType t, final Void ignored) { TypeReference genericDefinition = t.getUnderlyingType(); if (!genericDefinition.isGenericDefinition()) { final TypeDefinition resolved = genericDefinition.resolve(); if (resolved == null || !resolved.isGenericDefinition()) { return BuiltinTypes.Object; } genericDefinition = resolved; } final TypeReference baseType = getBaseType(genericDefinition); return baseType != null && baseType.isGenericType() ? eraseRecursive(baseType) : baseType; }
@Override public TypeReference visitRawType(final RawType t, final Void ignored) { TypeReference genericDefinition = t.getUnderlyingType(); if (!genericDefinition.isGenericDefinition()) { final TypeDefinition resolved = genericDefinition.resolve(); if (resolved == null || !resolved.isGenericDefinition()) { return BuiltinTypes.Object; } genericDefinition = resolved; } final TypeReference baseType = getBaseType(genericDefinition); return baseType != null && baseType.isGenericType() ? eraseRecursive(baseType) : baseType; }
@Override public TypeReference visitRawType(final RawType t, final Void ignored) { TypeReference genericDefinition = t.getUnderlyingType(); if (!genericDefinition.isGenericDefinition()) { final TypeDefinition resolved = genericDefinition.resolve(); if (resolved == null || !resolved.isGenericDefinition()) { return BuiltinTypes.Object; } genericDefinition = resolved; } final TypeReference baseType = getBaseType(genericDefinition); return baseType != null && baseType.isGenericType() ? eraseRecursive(baseType) : baseType; }
return eraseRecursive(result);
mappings.put(gp, MetadataHelper.eraseRecursive(gp));
@Override public TypeReference visitClassType(final TypeReference t, final Void ignored) { final TypeDefinition resolved = t.resolve(); if (resolved == null) { return BuiltinTypes.Object; } TypeReference superType; if (resolved.isInterface()) { superType = resolved.getBaseType(); if (superType == null) { superType = firstOrDefault(resolved.getExplicitInterfaces()); } } else { superType = resolved.getBaseType(); } if (superType == null) { return null; } if (resolved.isGenericDefinition()) { if (!t.isGenericType()) { return eraseRecursive(superType); } if (t.isGenericDefinition()) { return superType; } return substituteGenericArguments(superType, classBound(t)); } return superType; }
@Override public TypeReference visitClassType(final TypeReference t, final Void ignored) { final TypeDefinition resolved = t.resolve(); if (resolved == null) { return BuiltinTypes.Object; } TypeReference superType; if (resolved.isInterface()) { superType = resolved.getBaseType(); if (superType == null) { superType = firstOrDefault(resolved.getExplicitInterfaces()); } } else { superType = resolved.getBaseType(); } if (superType == null) { return null; } if (resolved.isGenericDefinition()) { if (!t.isGenericType()) { return eraseRecursive(superType); } if (t.isGenericDefinition()) { return superType; } return substituteGenericArguments(superType, classBound(t)); } return superType; }
@Override public TypeReference visitClassType(final TypeReference t, final Void ignored) { final TypeDefinition resolved = t.resolve(); if (resolved == null) { return BuiltinTypes.Object; } TypeReference superType; if (resolved.isInterface()) { superType = resolved.getBaseType(); if (superType == null) { superType = firstOrDefault(resolved.getExplicitInterfaces()); } } else { superType = resolved.getBaseType(); } if (superType == null) { return null; } if (resolved.isGenericDefinition()) { if (!t.isGenericType()) { return eraseRecursive(superType); } if (t.isGenericDefinition()) { return superType; } return substituteGenericArguments(superType, classBound(t)); } return superType; }