if (originalBound instanceof PsiArrayType && substitutedBoundType instanceof PsiArrayType && !originalBound.isAssignableFrom(substitutedBoundType) && !substitutedBoundType.isAssignableFrom(originalBound)) { continue; !TypeConversionUtil.erasure(substitutedBoundType).isAssignableFrom(TypeConversionUtil.erasure(originalBound)) && !TypeConversionUtil.erasure(substitutedBoundType).isAssignableFrom(originalBound)) { //erasure is essential to avoid infinite recursion
private static boolean acceptsMethod(PsiElementFactory elementFactory, PsiMethod method, int paramCount, String... paramTypes) { PsiParameterList parameterList = method.getParameterList(); if (paramCount >= 0 && paramCount != parameterList.getParametersCount()) return false; if (paramTypes.length == 0) return true; if (parameterList.getParametersCount() < paramTypes.length) return false; PsiParameter[] psiParameters = parameterList.getParameters(); for (int i = 0; i < paramTypes.length; i++) { String paramType = paramTypes[i]; PsiParameter parameter = psiParameters[i]; PsiType psiType = parameter.getType(); if (acceptsName(paramType, psiType.getCanonicalText())) continue; try { if (psiType.isAssignableFrom(elementFactory.createTypeFromText(paramType, parameter))) continue; } catch (IncorrectOperationException ignored) { } return false; } return true; }
private void processLambdaReturnExpression(PsiCall expression, int i, PsiType interfaceType, PsiTypeCastExpression returnExpression, int returnExprIdx, Function<PsiExpression, PsiTypeCastExpression> computeCastExpression) { final PsiCall newCall = (PsiCall)expression.copy(); final PsiExpressionList newArgsList = newCall.getArgumentList(); LOG.assertTrue(newArgsList != null); final PsiExpression[] newArgs = newArgsList.getExpressions(); final PsiLambdaExpression lambdaExpression = (PsiLambdaExpression)deparenthesizeExpression(newArgs[i]); LOG.assertTrue(lambdaExpression != null, newCall); final PsiExpression newReturnExpression = deparenthesizeExpression(LambdaUtil.getReturnExpressions(lambdaExpression).get(returnExprIdx)); PsiTypeCastExpression castExpression = computeCastExpression.fun(newReturnExpression); PsiExpression castOperand = castExpression.getOperand(); if (castOperand == null) return; castOperand = (PsiExpression)castExpression.replace(castOperand); final PsiType functionalInterfaceType = lambdaExpression.getFunctionalInterfaceType(); if (interfaceType.equals(functionalInterfaceType)) { final PsiType interfaceReturnType = LambdaUtil.getFunctionalInterfaceReturnType(interfaceType); final PsiType castExprType = castOperand.getType(); if (interfaceReturnType != null && castExprType != null && interfaceReturnType.isAssignableFrom(castExprType)) { addToResults(returnExpression); } } }
if (expressionType != null && !functionalInterfaceReturnType.isAssignableFrom(expressionType)) { return "Bad return type in lambda expression: " + expressionType.getPresentableText() + " cannot be converted to " + functionalInterfaceReturnType.getPresentableText();
if (returnType.isAssignableFrom(PsiType.VOID)) { return;