[java] fixes receiver highlighting in local classes (IDEA-158752)

This commit is contained in:
Roman Shevchenko
2016-07-20 16:29:56 +02:00
parent d700be3620
commit f2626b9024
3 changed files with 16 additions and 5 deletions

View File

@@ -33,6 +33,7 @@ import com.intellij.psi.*;
import com.intellij.psi.impl.PsiImplUtil;
import com.intellij.psi.impl.source.PsiClassReferenceType;
import com.intellij.psi.impl.source.PsiImmediateClassType;
import com.intellij.psi.util.ClassUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.TypeConversionUtil;
@@ -157,7 +158,7 @@ public class AnnotationsHighlightUtil {
final PsiClass psiClass = PsiUtil.resolveClassInType(type);
if (psiClass != null && psiClass.isEnum() && !(expr instanceof PsiReferenceExpression && ((PsiReferenceExpression)expr).resolve() instanceof PsiEnumConstant)) {
String description = JavaErrorMessages.message("annotation.non.enum.constant.attribute.value");
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(value).descriptionAndTooltip(description).create();
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(value).descriptionAndTooltip(description).create();
}
if (type != null && TypeConversionUtil.areTypesAssignmentCompatible(expectedType, expr) ||
@@ -754,7 +755,7 @@ public class AnnotationsHighlightUtil {
private static boolean isStatic(PsiModifierListOwner owner) {
if (owner == null) return false;
if (owner instanceof PsiClass && ((PsiClass)owner).getContainingClass() == null) return true;
if (owner instanceof PsiClass && ClassUtil.isTopLevelClass((PsiClass)owner)) return true;
PsiModifierList modifierList = owner.getModifierList();
return modifierList != null && modifierList.hasModifierProperty(PsiModifier.STATIC);
}

View File

@@ -267,8 +267,12 @@ public class ClassUtil {
return false;
}
final PsiFile parentFile = aClass.getContainingFile();
// do not select JspClass
return parentFile != null && parentFile.getLanguage() == JavaLanguage.INSTANCE;
PsiElement parent = aClass.getParent();
if (parent instanceof PsiDeclarationStatement && parent.getParent() instanceof PsiCodeBlock) {
return false;
}
PsiFile parentFile = aClass.getContainingFile();
return parentFile != null && parentFile.getLanguage() == JavaLanguage.INSTANCE; // do not select JspClass
}
}

View File

@@ -29,6 +29,12 @@ class C {
void m4a(C C.this) { }
void m4b(C <error descr="The receiver name does not match the enclosing class type">C.X.this</error>) { }
void m5() {
class L {
L(C C.this) { }
}
}
static void sm1(@TA Object <error descr="The receiver cannot be used in a static context">this</error>) { }
C(C <error descr="The receiver cannot be used in a static context">this</error>) { }