From 779369cbe448598306e1fb6674f230d46ecc5192 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 27 Jun 2013 18:52:24 +0400 Subject: [PATCH] do not include unknown annotations in override (IDEA-109422) --- .../generation/GenerateMembersUtil.java | 28 ++++++++++++++++++- .../afterSkipUnknownAnnotations.java | 9 ++++++ .../beforeSkipUnknownAnnotations.java | 6 ++++ .../codeInsight/OverrideImplementTest.java | 1 + 4 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/overrideImplement/afterSkipUnknownAnnotations.java create mode 100644 java/java-tests/testData/codeInsight/overrideImplement/beforeSkipUnknownAnnotations.java diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java index 6710f70ec7ae..a58dfe3dae2a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java @@ -23,6 +23,7 @@ import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.RangeMarker; import com.intellij.openapi.editor.ScrollType; +import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.text.StringUtil; @@ -31,6 +32,7 @@ import com.intellij.psi.codeStyle.*; import com.intellij.psi.impl.light.LightTypeElement; import com.intellij.psi.impl.source.tree.PsiWhiteSpaceImpl; import com.intellij.psi.javadoc.PsiDocComment; +import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; @@ -512,7 +514,7 @@ public class GenerateMembersUtil { PsiModifierList targetModifierList = targetParam.getModifierList(); if (sourceModifierList != null && targetModifierList != null) { if (sourceParam.getLanguage() == targetParam.getLanguage()) { - targetModifierList.replace(sourceModifierList); + targetModifierList = (PsiModifierList)targetModifierList.replace(sourceModifierList); } else { JVMElementFactory factory = JVMElementFactories.requireFactory(targetParam.getLanguage(), targetParam.getProject()); @@ -523,6 +525,30 @@ public class GenerateMembersUtil { targetModifierList.setModifierProperty(m, sourceParam.hasModifierProperty(m)); } } + processAnnotations(sourceModifierList.getProject(), targetModifierList, targetModifierList.getResolveScope()); + } + } + + private static void processAnnotations(Project project, PsiModifierList modifierList, GlobalSearchScope moduleScope) { + final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); + final Set toRemove = new HashSet(); + for (PsiAnnotation annotation : modifierList.getAnnotations()) { + final String qualifiedName = annotation.getQualifiedName(); + if (qualifiedName != null) { + for (OverrideImplementsAnnotationsHandler handler : Extensions.getExtensions(OverrideImplementsAnnotationsHandler.EP_NAME)) { + final String[] annotations2Remove = handler.annotationsToRemove(project, qualifiedName); + Collections.addAll(toRemove, annotations2Remove); + if (moduleScope != null && psiFacade.findClass(qualifiedName, moduleScope) == null) { + toRemove.add(qualifiedName); + } + } + } + } + for (String fqn : toRemove) { + final PsiAnnotation psiAnnotation = modifierList.findAnnotation(fqn); + if (psiAnnotation != null) { + psiAnnotation.delete(); + } } } } diff --git a/java/java-tests/testData/codeInsight/overrideImplement/afterSkipUnknownAnnotations.java b/java/java-tests/testData/codeInsight/overrideImplement/afterSkipUnknownAnnotations.java new file mode 100644 index 000000000000..004a0c083223 --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/afterSkipUnknownAnnotations.java @@ -0,0 +1,9 @@ +interface A { + void f(@Unknown1 @Unknown2 String s, @Unknown3 s3); +} +class B implements A { + @Override + public void f(String s) { + + } +} diff --git a/java/java-tests/testData/codeInsight/overrideImplement/beforeSkipUnknownAnnotations.java b/java/java-tests/testData/codeInsight/overrideImplement/beforeSkipUnknownAnnotations.java new file mode 100644 index 000000000000..870a74e669ee --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/beforeSkipUnknownAnnotations.java @@ -0,0 +1,6 @@ +interface A { + void f(@Unknown1 @Unknown2 String s, @Unknown3 s3); +} +class B implements A { + +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/OverrideImplementTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/OverrideImplementTest.java index a41edc32caee..670b101edbd2 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/OverrideImplementTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/OverrideImplementTest.java @@ -70,6 +70,7 @@ public class OverrideImplementTest extends LightCodeInsightTestCase { public void testImplementExtensionMethods() { doTest8(false, true); } public void testOverrideExtensionMethods() { doTest8(false, false); } public void testDoNotImplementExtensionMethods() { doTest8(false, true); } + public void testSkipUnknownAnnotations() { doTest8(false, true); } public void testOverrideInInterface() { doTest8(false, false); }