annotations: check that modifier list corresponds to class modifier list when ignore list during process declarations (IDEA-160106)

This commit is contained in:
Anna Kozlova
2016-09-16 08:31:11 +03:00
parent 0d37cf70eb
commit a493ff0f1d
4 changed files with 18 additions and 2 deletions

View File

@@ -61,6 +61,9 @@ public class AnnotationTargetUtil {
}
if (owner instanceof PsiModifierList) {
if (((PsiModifierList)owner).getNextSibling() instanceof PsiErrorElement) {
return TargetType.EMPTY_ARRAY;
}
PsiElement element = ((PsiModifierList)owner).getParent();
if (element instanceof PsiPackageStatement) {
return PACKAGE_TARGETS;

View File

@@ -467,8 +467,8 @@ public class PsiClassImplUtil {
@NotNull LanguageLevel languageLevel,
boolean isRaw,
@NotNull GlobalSearchScope resolveScope) {
if (last instanceof PsiTypeParameterList || last instanceof PsiModifierList) {
return true; //TypeParameterList and ModifierList do not see our declarations
if (last instanceof PsiTypeParameterList || last instanceof PsiModifierList && aClass.getModifierList() == last) {
return true;
}
if (visited != null && visited.contains(aClass)) return true;

View File

@@ -0,0 +1,12 @@
class Dummy {
public @interface Debug {
String value() default "[no comment]";
}
private static final class Constants {
private static final String INPUT = "Input";
}
<error descr="Annotations are not allowed here">@Dummy.Debug(Constants.INPUT)</error><EOLError descr="Identifier or type expected"></EOLError>
}

View File

@@ -49,6 +49,7 @@ public class AnnotationsHighlightingTest extends LightDaemonAnalyzerTestCase {
public void testRepeatable() { doTest8(); }
public void testEnumValues() { doTest8(); }
public void testReceiverParameters() { doTest8(); }
public void testAnnotationOverIncompleteCode() { doTest(); }
private void doTest() {
setLanguageLevel(LanguageLevel.JDK_1_7);