@Override /* @Nullable */ protected LightweightTypeReference getUnmappedSubstitute(ParameterizedTypeReference reference, JvmTypeParameter type, ConstraintVisitingInfo visiting) { if (!ignoreDeclaredTypeParameters) { if (isDeclaredTypeParameter(type)) { return reference; } } ConstraintAwareTypeArgumentCollector collector = new ConstraintAwareTypeArgumentCollector(getOwner()); LightweightTraversalData data = new LightweightTraversalData(); data.getTypeParameterMapping().putAll(getTypeParameterMapping()); reference.accept(collector, data); LightweightMergedBoundTypeArgument boundTypeArgument = data.getTypeParameterMapping().get(type); if (boundTypeArgument != null && boundTypeArgument.getTypeReference() != reference) { return boundTypeArgument.getTypeReference().accept(this, visiting); } if (boundTypeArgument != null) return boundTypeArgument.getTypeReference(); return null; }
public LightweightTypeReference toLightweightReference(JvmType type) { if (type.eClass() == TypesPackage.Literals.JVM_ARRAY_TYPE) { JvmComponentType componentType = ((JvmArrayType) type).getComponentType(); LightweightTypeReference componentTypeReference = toLightweightReference(componentType); return owner.newArrayTypeReference(componentTypeReference); } ParameterizedTypeReference result = owner.newParameterizedTypeReference(type); if (type.eClass() == TypesPackage.Literals.JVM_GENERIC_TYPE) { result.accept(new TypeReferenceVisitor() { @Override protected void doVisitInnerTypeReference(InnerTypeReference reference) { reference.getOuter().accept(this); super.doVisitInnerTypeReference(reference); } @Override protected void doVisitParameterizedTypeReference(ParameterizedTypeReference reference) { JvmType rawType = reference.getType(); if (rawType.eClass() == TypesPackage.Literals.JVM_GENERIC_TYPE) { List<JvmTypeParameter> typeParameters = ((JvmTypeParameterDeclarator) rawType).getTypeParameters(); for(int i = 0, size = typeParameters.size(); i < size; i++) { JvmTypeParameter typeParameter = typeParameters.get(i); reference.addTypeArgument(owner.newParameterizedTypeReference(typeParameter)); } } } }); } return result; }