private static PsiType getIteratedType(PsiElement parent, PsiType collection) { if (parent instanceof GrReferenceExpression) { final GrExpression qualifier = ((GrReferenceExpression) parent).getQualifier(); if (qualifier != null) { return ClosureParameterEnhancer.findTypeForIteration(qualifier, parent); } } final PsiType iterable = PsiUtil.extractIterableTypeParameter(collection, true); if (iterable != null && parent instanceof GrExpression) { return PsiImplUtil.normalizeWildcardTypeByPosition(iterable, (GrExpression) parent); } else { return iterable; } }
private void getVariantsFromQualifierForSpreadOperator(@NotNull GrExpression qualifier) { final PsiType spreadType = ClosureParameterEnhancer.findTypeForIteration(qualifier, myRefExpr); if (spreadType != null) { getVariantsFromQualifierType(spreadType, myRefExpr.getProject()); } }
public static boolean isAssignable( @Nullable PsiType lType, @Nullable PsiType rType, @NotNull PsiElement context) { if (lType == null || rType == null) { return false; } if (rType instanceof PsiIntersectionType) { for (PsiType child : ((PsiIntersectionType) rType).getConjuncts()) { if (isAssignable(lType, child, context)) { return true; } } return false; } if (lType instanceof PsiIntersectionType) { for (PsiType child : ((PsiIntersectionType) lType).getConjuncts()) { if (!isAssignable(child, rType, context)) { return false; } } return true; } if (rType == PsiType.NULL) { return !(lType instanceof PsiPrimitiveType); } if (isNumericType(lType) && isNumericType(rType)) { return true; } if (isClassType(lType, JAVA_LANG_STRING)) { return true; } final PsiManager manager = context.getManager(); final GlobalSearchScope scope = context.getResolveScope(); if (lType instanceof PsiArrayType) { PsiType lComponentType = ((PsiArrayType) lType).getComponentType(); PsiType rComponentType = ClosureParameterEnhancer.findTypeForIteration(rType, context); if (rComponentType != null && isAssignable(lComponentType, rComponentType, context)) { return true; } } if (unboxPrimitiveTypeWrapper(lType) == PsiType.CHAR && (isClassType(rType, JAVA_LANG_STRING) || isClassType(rType, GROOVY_LANG_GSTRING))) { return true; } if (isAssignableByMethodCallConversion(lType, rType, context)) return true; lType = boxPrimitiveType(lType, manager, scope); rType = boxPrimitiveType(rType, manager, scope); if (lType.isAssignableFrom(rType)) { return true; } if (context instanceof GroovyPsiElement) { for (GrTypeConverter converter : GrTypeConverter.EP_NAME.getExtensions()) { if (!converter.isAllowedInMethodCall()) { Boolean result = converter.isConvertible(lType, rType, (GroovyPsiElement) context); if (result != null) { return result; } } } } return false; }