override/implement: skip parameter annotations if necessary (IDEA-76470)
authorAnna Kozlova <anna.kozlova@jetbrains.com>
Tue, 31 Jan 2012 17:20:52 +0000 (21:20 +0400)
committerAnna Kozlova <anna.kozlova@jetbrains.com>
Tue, 31 Jan 2012 17:21:48 +0000 (21:21 +0400)
java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java

index 15725edd723d1770020bca27dcdf864b82ae4813..ec4b6f30f89eacbdc1a4297f845d6ee1f198ac99 100644 (file)
@@ -21,6 +21,7 @@ import com.intellij.lang.StdLanguages;
 import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.editor.Editor;
 import com.intellij.openapi.editor.ScrollType;
+import com.intellij.openapi.extensions.Extensions;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.Pair;
 import com.intellij.openapi.util.text.StringUtil;
@@ -40,9 +41,7 @@ import org.jetbrains.annotations.NonNls;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 public class GenerateMembersUtil {
   private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.generation.GenerateMembersUtil");
@@ -279,7 +278,9 @@ public class GenerateMembersUtil {
 
         PsiParameter newParameter = factory.createParameter(paramName, substituted);
         if (parameter.getLanguage() == StdLanguages.JAVA) {
-          newParameter.getModifierList().replace(parameter.getModifierList());
+          PsiModifierList modifierList = newParameter.getModifierList();
+          modifierList = (PsiModifierList)modifierList.replace(parameter.getModifierList());
+          processAnnotations(project, modifierList);
         }
         newMethod.getParameterList().add(newParameter);
       }
@@ -312,6 +313,23 @@ public class GenerateMembersUtil {
     }
   }
 
+  private static void processAnnotations(Project project, PsiModifierList modifierList) {
+    final Set<String> toRemove = new HashSet<String>();
+    for (PsiAnnotation annotation : modifierList.getAnnotations()) {
+      final String qualifiedName = annotation.getQualifiedName();
+      for (OverrideImplementsAnnotationsHandler handler : Extensions.getExtensions(OverrideImplementsAnnotationsHandler.EP_NAME)) {
+        final String[] annotations2Remove = handler.annotationsToRemove(project, qualifiedName);
+        Collections.addAll(toRemove, annotations2Remove);
+      }
+    }
+    for (String fqn : toRemove) {
+      final PsiAnnotation psiAnnotation = modifierList.findAnnotation(fqn);
+      if (psiAnnotation != null) {
+        psiAnnotation.delete();
+      }
+    }
+  }
+
   private static PsiType substituteType(final PsiSubstitutor substitutor, final PsiType type) {
     final PsiType psiType = substitutor.substitute(type);
     if (psiType != null) return psiType;