[java] correct receiver parameter type check (IDEA-175906)

This commit is contained in:
Roman Shevchenko
2017-07-17 15:10:44 +02:00
parent 9a855129dc
commit c87ce5bb69
2 changed files with 19 additions and 10 deletions
@@ -681,16 +681,19 @@ public class AnnotationsHighlightUtil {
enclosingClass = enclosingClass.getContainingClass();
}
if (enclosingClass != null && !enclosingClass.equals(PsiUtil.resolveClassInType(parameter.getType()))) {
PsiElement range = ObjectUtils.notNull(parameter.getTypeElement(), parameter);
String text = JavaErrorMessages.message("receiver.type.mismatch");
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(range).descriptionAndTooltip(text).create();
}
if (enclosingClass != null) {
PsiClassType type = PsiElementFactory.SERVICE.getInstance(parameter.getProject()).createType(enclosingClass, PsiSubstitutor.EMPTY);
if (!type.equals(parameter.getType())) {
PsiElement range = ObjectUtils.notNull(parameter.getTypeElement(), parameter);
String text = JavaErrorMessages.message("receiver.type.mismatch");
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(range).descriptionAndTooltip(text).create();
}
PsiThisExpression identifier = parameter.getIdentifier();
if (enclosingClass != null && !enclosingClass.equals(PsiUtil.resolveClassInType(identifier.getType()))) {
String text = JavaErrorMessages.message("receiver.name.mismatch");
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(identifier).descriptionAndTooltip(text).create();
PsiThisExpression identifier = parameter.getIdentifier();
if (!enclosingClass.equals(PsiUtil.resolveClassInType(identifier.getType()))) {
String text = JavaErrorMessages.message("receiver.name.mismatch");
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(identifier).descriptionAndTooltip(text).create();
}
}
return null;
@@ -49,4 +49,10 @@ class C {
B(C <error descr="The receiver name does not match the enclosing class type">B.this</error>, long p) { }
B(C <error descr="The receiver name does not match the enclosing class type">this</error>, float p) { }
}
}
static class CI<T> {
void m1(CI<T> this) { }
<T> void m2(<error descr="The receiver type does not match the enclosing class type">CI<T></error> this) { }
void m3(<error descr="The receiver type does not match the enclosing class type">CI<String></error> this) { }
}
}