take into account container class type parameters: return type

detection if return type mentions type parameters should include types specified on outer class
This commit is contained in:
Anna Kozlova
2017-06-22 15:54:30 +03:00
parent 1307ac8e78
commit cbe6eb48ed
3 changed files with 20 additions and 3 deletions
@@ -106,10 +106,15 @@ public class PsiPolyExpressionUtil {
@Nullable
@Override
public Boolean visitClassType(PsiClassType classType) {
for (PsiType type : classType.getParameters()) {
if (type.accept(this)) return true;
PsiClassType.ClassResolveResult result = classType.resolveGenerics();
final PsiClass psiClass = result.getElement();
if (psiClass != null) {
PsiSubstitutor substitutor = result.getSubstitutor();
for (PsiTypeParameter parameter : PsiUtil.typeParametersIterable(psiClass)) {
PsiType type = substitutor.substitute(parameter);
if (type != null && type.accept(this)) return true;
}
}
final PsiClass psiClass = classType.resolve();
return psiClass instanceof PsiTypeParameter && typeParameters.contains(psiClass);
}
@@ -0,0 +1,11 @@
class Outer<T> {
private class Inner{}
{
Outer<String>.Inner inner = foo(foo(null));
}
private static <K> Outer<K>.Inner foo(Outer<K>.Inner u){
return null;
}
}
@@ -171,6 +171,7 @@ public class GraphInferenceHighlightingTest extends LightDaemonAnalyzerTestCase
public void testPostponeUnresolvedVariables() { doTest(); }
public void testErasureOfReturnTypeIffUncheckedConversionWasNecessaryDuringApplicabilityCheckOnly() { doTest(); }
public void testTwoDifferentParameterizationCheckWithInterfaceTypeArguments() { doTest(); }
public void testNonGenericInnerClassOfGenericsOuterInReturnType() { doTest(); }
public void testUncheckedConversionDuringProperTypeExpressionConstraintResolution() { doTest(); }
//public void _testAssignabilityOfStandaloneExpressionsDuringApplicabilityCheck() { doTest(); }
public void testRecursiveTypeWithCapture() { doTest(); }