mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-08 15:09:39 +07:00
don't duplicate type use annotations during copy of modifier lists (inspired by IDEA-166062)
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
}
|
||||
@@ -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>
|
||||
}
|
||||
}
|
||||
@@ -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) {}
|
||||
}
|
||||
}
|
||||
@@ -96,6 +96,10 @@ public class DelegateMethodsTest extends LightCodeInsightTestCase {
|
||||
doTest();
|
||||
}
|
||||
|
||||
public void testTypeUseAnnotationsInReturnType() throws Exception {
|
||||
doTest();
|
||||
}
|
||||
|
||||
private void doTest() throws Exception {
|
||||
doTest(getTestName(false));
|
||||
}
|
||||
|
||||
@@ -894,6 +894,10 @@ public class ExtractMethodTest extends LightCodeInsightTestCase {
|
||||
doTest();
|
||||
}
|
||||
|
||||
public void testTypeUseAnnotationsOnParameter() throws Exception {
|
||||
doTest();
|
||||
}
|
||||
|
||||
public void testSameAnnotations() throws Exception {
|
||||
doTest();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user