@Override public boolean isMultiType() { if (resolvedTo != null) return resolvedTo.isMultiType(); return super.isMultiType(); }
private boolean mustCheckForMandatoryTypeCast(IResolvedTypes resolvedTypes, XExpression expression) { if (resolvedTypes.isRefinedType(expression)) { return true; } LightweightTypeReference actualType = resolvedTypes.getActualType(expression); if (actualType != null && actualType.isMultiType()) { return true; } return false; }
public LightweightTypeReference getExpectedReceiverType(JvmIdentifiableElement linkedFeature, LightweightTypeReference receiverType) { if (receiverType.isMultiType() && linkedFeature instanceof JvmMember) { LightweightTypeReference declaratorReference = receiverType.getOwner().newParameterizedTypeReference(((JvmMember) linkedFeature).getDeclaringType()); if (!declaratorReference.isAssignableFrom(receiverType.toJavaType())) { for(LightweightTypeReference multiTypeComponent: receiverType.getMultiTypeComponents()) { if (declaratorReference.isAssignableFrom(multiTypeComponent)) { return multiTypeComponent; } } } else { return declaratorReference; } } else if (receiverType.isSynonym() && linkedFeature instanceof JvmMember) { List<LightweightTypeReference> components = receiverType.getMultiTypeComponents(); return components.get(components.size() - 1); } return receiverType; }
if (featureDeclarator.isMultiType()) { List<LightweightTypeReference> components = featureDeclarator.getMultiTypeComponents(); IScope result = wrapper.get();
private boolean mustInsertTypeCast(XExpression expression, LightweightTypeReference actualType) { IResolvedTypes resolvedTypes = getResolvedTypes(expression); if (mustCheckForMandatoryTypeCast(resolvedTypes, expression)) { if (expression instanceof XAbstractFeatureCall) { LightweightTypeReference featureType = resolvedTypes.getActualType(((XAbstractFeatureCall) expression).getFeature()); if (featureType != null && !featureType.isMultiType() && actualType.isAssignableFrom(featureType)) { return false; } if (featureType != null && featureType.isMultiType()) { JvmTypeReference compliantTypeReference = featureType.toJavaCompliantTypeReference(); if (actualType.isAssignableFrom(featureType.getOwner().toLightweightTypeReference(compliantTypeReference))) { return false; } } } if (expression.eContainer() instanceof XCastedExpression) { XCastedExpression castedExpression = (XCastedExpression) expression.eContainer(); LightweightTypeReference castedExpressionType = getResolvedTypes(castedExpression).getActualType(castedExpression); if (castedExpressionType != null) { return actualType.getType() != castedExpressionType.getType(); } } return true; } return false; }
@Override /* @Nullable */ protected JvmTypeReference doGetTypeReference(XComputedTypeReferenceImplCustom context) { try { CreateExtensionInfo createExtensionInfo = createFunction.getCreateExtensionInfo(); XExpression expression = createExtensionInfo.getCreateExpression(); LightweightTypeReference actualType = resolvedTypes.getReturnType(expression); if (actualType == null) { JvmOperation operation = typeResolver.associations.getDirectlyInferredOperation(createFunction); if (operation != null) { IFeatureScopeSession session = operation.isStatic() ? featureScopeSession : featureScopeSession.toInstanceContext(); typeResolver.computeTypes(resolvedTypesByContext, resolvedTypes, session, operation); actualType = resolvedTypes.getReturnType(expression); } } if (actualType == null) return null; // actualType may not be java compliant but still carry more information than the // java compliant reference JvmTypeReference result = typeResolver.toJavaCompliantTypeReference(actualType, featureScopeSession); if (actualType.isMultiType() || result.getType() != actualType.getType()) { resolvedTypes.setType(param, resolvedTypes.getReferenceOwner().toLightweightTypeReference(result)); resolvedTypes.reassignType(param, actualType); } return result; } finally { context.unsetTypeProviderWithoutNotification(); } } }
} else if (right.isMultiType()) { convertMultiType(left, (CompoundTypeReference) right, context, appendable, expression); } else if (right.isArray() && !left.isArray() && left.isSubtypeOf(Iterable.class)) {