don't duplicate type use annotations during copy of modifier lists (inspired by IDEA-166062)

This commit is contained in:
Anna.Kozlova
2017-02-16 17:12:00 +01:00
parent 57c4f399d2
commit 71b7d9cbf3
11 changed files with 127 additions and 17 deletions

View File

@@ -163,10 +163,7 @@ public class GenerateDelegateHandler implements LanguageCodeInsightActionHandler
stmt = (PsiStatement)CodeStyleManager.getInstance(psiManager.getProject()).reformat(stmt);
method.getBody().add(stmt);
for (PsiAnnotation annotation : methodCandidate.getElement().getModifierList().getAnnotations()) {
if (SuppressWarnings.class.getName().equals(annotation.getQualifiedName())) continue;
method.getModifierList().add(annotation.copy());
}
GenerateMembersUtil.copyAnnotations(methodCandidate.getElement().getModifierList(), method.getModifierList(), SuppressWarnings.class.getName());
if (isMethodStatic || modifierList != null && modifierList.hasModifierProperty(PsiModifier.STATIC)) {
PsiUtil.setModifierProperty(method, PsiModifier.STATIC, true);

View File

@@ -36,6 +36,7 @@ import com.intellij.psi.javadoc.PsiDocComment;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.*;
import com.intellij.refactoring.util.RefactoringUtil;
import com.intellij.util.ArrayUtil;
import com.intellij.util.Function;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.VisibilityUtil;
@@ -595,6 +596,16 @@ public class GenerateMembersUtil {
}
}
public static void copyAnnotations(@NotNull PsiModifierList source, @NotNull PsiModifierList target, String... skipAnnotations) {
for (PsiAnnotation annotation : source.getAnnotations()) {
String qualifiedName = annotation.getQualifiedName();
if (qualifiedName == null || ArrayUtil.contains(qualifiedName, skipAnnotations) || target.findAnnotation(qualifiedName) != null) {
continue;
}
target.add(annotation);
}
}
//java bean getters/setters
public static PsiMethod generateSimpleGetterPrototype(@NotNull PsiField field) {
return generatePrototype(field, PropertyUtil.generateGetterPrototype(field));

View File

@@ -1387,12 +1387,9 @@ public class ExtractMethodProcessor implements MatchProvider {
if (variable instanceof PsiParameter) {
final PsiModifierList modifierList = variable.getModifierList();
if (modifierList != null) {
for (PsiAnnotation annotation : modifierList.getAnnotations()) {
if (SuppressWarnings.class.getName().equals(annotation.getQualifiedName())) continue;
final PsiModifierList parmModifierList = parm.getModifierList();
LOG.assertTrue(parmModifierList != null, parm);
parmModifierList.add(annotation);
}
PsiModifierList parmModifierList = parm.getModifierList();
LOG.assertTrue(parmModifierList != null);
GenerateMembersUtil.copyAnnotations(modifierList, parmModifierList, SuppressWarnings.class.getName());
}
}
}

View File

@@ -19,6 +19,7 @@ import com.intellij.codeInsight.ChangeContextUtil;
import com.intellij.codeInsight.CodeInsightUtil;
import com.intellij.codeInsight.TestFrameworks;
import com.intellij.codeInsight.daemon.impl.quickfix.AnonymousTargetClassPreselectionUtil;
import com.intellij.codeInsight.generation.GenerateMembersUtil;
import com.intellij.codeInsight.navigation.NavigationUtil;
import com.intellij.ide.util.PsiClassListCellRenderer;
import com.intellij.openapi.application.ApplicationManager;
@@ -158,9 +159,11 @@ public abstract class LocalToFieldHandler {
field.getInitializer().replace(initializer);
}
for (PsiAnnotation annotation : local.getModifierList().getAnnotations()) {
field.getModifierList().add(annotation.copy());
}
PsiModifierList sourceModifierList = local.getModifierList();
LOG.assertTrue(sourceModifierList != null);
PsiModifierList fieldModifierList = field.getModifierList();
LOG.assertTrue(fieldModifierList != null);
GenerateMembersUtil.copyAnnotations(sourceModifierList, fieldModifierList);
return field;
}
catch (IncorrectOperationException e) {

View File

@@ -0,0 +1,28 @@
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Retention(RetentionPolicy.CLASS)
@Target({ElementType.PARAMETER, ElementType.TYPE_USE})
@interface Anno {
String value() default "";
}
class A {
@Anno
String methodA() {};
}
class B {
private A a;
@Anno
public String methodA() {
return a.methodA();
}
}

View File

@@ -0,0 +1,26 @@
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Retention(RetentionPolicy.CLASS)
@Target({ElementType.PARAMETER, ElementType.TYPE_USE})
@interface Anno {
String value() default "";
}
class A {
@Anno
String methodA() {};
}
class B {
private A a;
<caret>
}

View File

@@ -0,0 +1,19 @@
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Retention(RetentionPolicy.CLASS)
@Target({ElementType.PARAMETER, ElementType.TYPE_USE})
@interface Anno {
String value() default "";
}
class Test {
void foo(@Anno String s) {
<selection>if (s == null) {}</selection>
}
}

View File

@@ -0,0 +1,23 @@
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Retention(RetentionPolicy.CLASS)
@Target({ElementType.PARAMETER, ElementType.TYPE_USE})
@interface Anno {
String value() default "";
}
class Test {
void foo(@Anno String s) {
newMethod(s);
}
private void newMethod(@Anno String s) {
if (s == null) {}
}
}

View File

@@ -96,6 +96,10 @@ public class DelegateMethodsTest extends LightCodeInsightTestCase {
doTest();
}
public void testTypeUseAnnotationsInReturnType() throws Exception {
doTest();
}
private void doTest() throws Exception {
doTest(getTestName(false));
}

View File

@@ -894,6 +894,10 @@ public class ExtractMethodTest extends LightCodeInsightTestCase {
doTest();
}
public void testTypeUseAnnotationsOnParameter() throws Exception {
doTest();
}
public void testSameAnnotations() throws Exception {
doTest();
}

View File

@@ -15,6 +15,7 @@
*/
package com.siyeh.ig.dataflow;
import com.intellij.codeInsight.generation.GenerateMembersUtil;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
@@ -180,10 +181,7 @@ public class TooBroadScopeInspection extends TooBroadScopeInspectionBase {
if (newModifierList != null && modifierList != null) {
// remove final when PsiDeclarationFactory adds one by mistake
newModifierList.setModifierProperty(PsiModifier.FINAL, variable.hasModifierProperty(PsiModifier.FINAL));
final PsiAnnotation[] annotations = modifierList.getAnnotations();
for (PsiAnnotation annotation : annotations) {
newModifierList.add(annotation);
}
GenerateMembersUtil.copyAnnotations(modifierList, newModifierList);
}
return newDeclaration;
}