public JvmParameterizedTypeReference createTypeRef(JvmType type, JvmTypeReference... typeArgs) { List<JvmTypeReference> typeReferences = Collections.emptyList(); if (typeArgs != null && typeArgs.length > 0) { typeReferences = newArrayListWithCapacity(typeArgs.length); for (int i = 0; i < typeArgs.length; i++) { JvmTypeReference jvmTypeReference = typeArgs[i]; typeReferences.add(EcoreUtil2.clone(jvmTypeReference)); } } if (type instanceof JvmGenericType) { List<JvmTypeParameter> list = ((JvmGenericType) type).getTypeParameters(); if (!typeReferences.isEmpty() && list.size() != typeReferences.size()) { throw new IllegalArgumentException( "The type " + type.getIdentifier() + " expects " + list.size() + " type arguments, but was " + typeReferences.size() + ". Either pass zero arguments (raw type) or the correct number."); } // Raw type -> create type references to type param if (typeReferences.isEmpty() && !list.isEmpty()) { typeReferences = newArrayListWithCapacity(list.size()); for (JvmTypeParameter typeParameter : list) { typeReferences.add(createTypeRef(typeParameter)); } } } JvmParameterizedTypeReference reference = factory.createJvmParameterizedTypeReference(); reference.setType(type); if (!typeReferences.isEmpty()) reference.getArguments().addAll(typeReferences); return reference; }
public void serialize( final JvmTypeReference type, EObject context, IAppendable appendable, boolean withoutConstraints, boolean paramsToWildcard, boolean paramsToObject, boolean allowPrimitives) { IAppendable tracedAppendable = appendable; boolean tracing = false; if (appendable instanceof ITreeAppendable && type.eResource() == context.eResource()) { tracedAppendable = ((ITreeAppendable) appendable).trace(type); tracing = true; } if (type instanceof JvmWildcardTypeReference) { JvmWildcardTypeReference wildcard = (JvmWildcardTypeReference) type; if (!withoutConstraints) { tracedAppendable.append("?"); } if (!wildcard.getConstraints().isEmpty()) { for (JvmTypeConstraint constraint : wildcard.getConstraints()) { if (constraint instanceof JvmLowerBound) { if (!withoutConstraints) tracedAppendable.append(" super "); serialize( constraint.getTypeReference(), context, tracedAppendable, withoutConstraints, paramsToWildcard, paramsToObject, false); return; } } boolean first = true; for (JvmTypeConstraint constraint : wildcard.getConstraints()) { if (constraint instanceof JvmUpperBound) { if (first) { if (!withoutConstraints) tracedAppendable.append(" extends "); first = false; } else { if (withoutConstraints) throw new IllegalStateException( "cannot have two upperbounds if type should be printed without constraints"); tracedAppendable.append(" & "); } serialize( constraint.getTypeReference(), context, tracedAppendable, withoutConstraints, paramsToWildcard, paramsToObject, false); } } } else if (withoutConstraints) { tracedAppendable.append("Object"); } } else if (type instanceof JvmGenericArrayTypeReference) { serialize( ((JvmGenericArrayTypeReference) type).getComponentType(), context, tracedAppendable, withoutConstraints, paramsToWildcard, paramsToObject, true); tracedAppendable.append("[]"); } else if (type instanceof JvmParameterizedTypeReference) { JvmParameterizedTypeReference parameterized = (JvmParameterizedTypeReference) type; if ((paramsToWildcard || paramsToObject) && parameterized.getType() instanceof JvmTypeParameter) { JvmTypeParameter parameter = (JvmTypeParameter) parameterized.getType(); if (!isLocalTypeParameter(context, parameter)) { if (paramsToWildcard) tracedAppendable.append("?"); else tracedAppendable.append("Object"); return; } } JvmType jvmType = allowPrimitives ? type.getType() : primitives.asWrapperTypeIfPrimitive(type).getType(); if (tracing) { ITextRegion region = locationProvider.getFullTextRegion( type, TypesPackage.Literals.JVM_PARAMETERIZED_TYPE_REFERENCE__TYPE, 0); if (region instanceof ITextRegionWithLineInformation) { ((ITreeAppendable) tracedAppendable) .trace(new LocationData((ITextRegionWithLineInformation) region, null)) .append(jvmType); } else { tracedAppendable.append(jvmType); } } else { tracedAppendable.append(jvmType); } if (!parameterized.getArguments().isEmpty()) { tracedAppendable.append("<"); for (int i = 0; i < parameterized.getArguments().size(); i++) { if (i != 0) { tracedAppendable.append(","); } serialize( parameterized.getArguments().get(i), context, tracedAppendable, withoutConstraints, paramsToWildcard, paramsToObject, false); } tracedAppendable.append(">"); } } else if (type instanceof JvmAnyTypeReference) { tracedAppendable.append("Object"); } else if (type instanceof JvmMultiTypeReference) { serialize( resolveMultiType(type, context), context, tracedAppendable, withoutConstraints, paramsToWildcard, paramsToObject, allowPrimitives); } else if (type instanceof JvmDelegateTypeReference) { JvmTypeReference delegate = ((JvmDelegateTypeReference) type).getDelegate(); if (delegate != null) serialize( delegate, context, tracedAppendable, withoutConstraints, paramsToWildcard, paramsToObject, allowPrimitives); else tracedAppendable.append("Object"); } else if (type instanceof JvmSpecializedTypeReference) { serialize( ((JvmSpecializedTypeReference) type).getEquivalent(), context, tracedAppendable, withoutConstraints, paramsToWildcard, paramsToObject, allowPrimitives); } else if (type instanceof JvmUnknownTypeReference) { if (type.eIsSet(TypesPackage.Literals.JVM_UNKNOWN_TYPE_REFERENCE__QUALIFIED_NAME)) { tracedAppendable.append(type.getQualifiedName()); } else { tracedAppendable.append("Object"); } } else { throw new IllegalArgumentException(String.valueOf(type)); } }