do not include unknown annotations in override (IDEA-109422)

This commit is contained in:
Anna Kozlova
2013-06-27 20:03:06 +04:00
parent 15a9ceb3f2
commit 779369cbe4
4 changed files with 43 additions and 1 deletions
@@ -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<String> toRemove = new HashSet<String>();
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();
}
}
}
}
@@ -0,0 +1,9 @@
interface A {
void f(@Unknown1 @Unknown2 String s, @Unknown3 s3);
}
class B implements A {
@Override
public void f(String s) {
}
}
@@ -0,0 +1,6 @@
interface A {
void f(@Unknown1 @Unknown2 String s, @Unknown3 s3);
}
class B implements A {
<caret>
}
@@ -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); }