diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java index a7ced9c27b0f..f09ac997b216 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java @@ -10,8 +10,12 @@ import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.codeInsight.intention.QuickFixFactory; import com.intellij.codeInsight.intention.impl.BaseIntentionAction; import com.intellij.codeInspection.LocalQuickFixAndIntentionActionOnPsiElement; +import com.intellij.codeInspection.util.IntentionFamilyName; +import com.intellij.codeInspection.util.IntentionName; import com.intellij.java.analysis.JavaAnalysisBundle; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; import com.intellij.patterns.ElementPattern; import com.intellij.pom.java.LanguageLevel; @@ -25,6 +29,7 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; import com.intellij.util.ObjectUtils; +import com.siyeh.ig.psiutils.CommentTracker; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -395,34 +400,45 @@ public class AnnotationsHighlightUtil { return null; } + @Nullable private static HighlightInfo annotationError(@NotNull PsiAnnotation annotation, @NotNull String message) { - HighlightInfo info = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(annotation).descriptionAndTooltip(message).create(); LocalQuickFixAndIntentionActionOnPsiElement fix = QuickFixFactory.getInstance().createDeleteFix(annotation, JavaAnalysisBundle.message("intention.text.remove.annotation")); + return annotationError(annotation, message, fix); + } + + @Nullable + private static HighlightInfo annotationError(@NotNull final PsiAnnotation annotation, + @NotNull final String message, + @NotNull final IntentionAction fix) { + final HighlightInfo info = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR) + .range(annotation) + .descriptionAndTooltip(message) + .create(); QuickFixAction.registerQuickFixAction(info, fix); return info; } + @Nullable private static HighlightInfo checkReferenceTarget(@NotNull PsiAnnotation annotation, @Nullable PsiJavaCodeReferenceElement ref) { if (ref == null) return null; - PsiElement refTarget = ref.resolve(); + final PsiElement refTarget = ref.resolve(); if (refTarget == null) return null; - String message = null; if (!(refTarget instanceof PsiClass)) { - message = JavaErrorBundle.message("annotation.not.allowed.ref"); - } - else { - PsiElement parent = ref.getParent(); - if (parent instanceof PsiJavaCodeReferenceElement) { - PsiElement qualified = ((PsiJavaCodeReferenceElement)parent).resolve(); - if (qualified instanceof PsiMember && ((PsiMember)qualified).hasModifierProperty(PsiModifier.STATIC)) { - message = JavaErrorBundle.message("annotation.not.allowed.static"); - } - } + return annotationError(annotation, JavaErrorBundle.message("annotation.not.allowed.ref")); } - return message != null ? annotationError(annotation, message) : null; + final PsiElement parent = ref.getParent(); + if (parent instanceof PsiJavaCodeReferenceElement) { + final PsiElement qualified = ((PsiJavaCodeReferenceElement)parent).resolve(); + if (qualified instanceof PsiMember && ((PsiMember)qualified).hasModifierProperty(PsiModifier.STATIC)) { + return annotationError(annotation, + JavaErrorBundle.message("annotation.not.allowed.static"), + new MoveAnnotationOnStaticMemberQualifyingTypeFix(annotation)); + } + } + return null; } @Contract("null->null; !null->!null") @@ -755,4 +771,69 @@ public class AnnotationsHighlightUtil { return classType.equalsToText(CommonClassNames.JAVA_LANG_CLASS) || classType.equalsToText(CommonClassNames.JAVA_LANG_STRING); } } + + private static final class MoveAnnotationOnStaticMemberQualifyingTypeFix extends LocalQuickFixAndIntentionActionOnPsiElement { + private MoveAnnotationOnStaticMemberQualifyingTypeFix(@NotNull final PsiAnnotation annotation) { + super(annotation); + } + + @Override + public @IntentionFamilyName @NotNull String getFamilyName() { + return JavaErrorBundle.message("annotation.on.static.member.qualifying.type.family.name"); + } + + @Override + public @IntentionName @NotNull String getText() { + return JavaErrorBundle.message("annotation.on.static.member.qualifying.type.family.name"); + } + + @Override + public void invoke(@NotNull final Project project, + @NotNull final PsiFile file, + @Nullable final Editor editor, + @NotNull final PsiElement startElement, + @NotNull final PsiElement endElement) { + final PsiTypeElement psiTypeElement = getTypeElement(startElement); + if (psiTypeElement == null) return; + + final PsiJavaCodeReferenceElement innermostParent = psiTypeElement.getInnermostComponentReferenceElement(); + if (innermostParent == null) return; + + final PsiElement rightmostDot = getRightmostDot(innermostParent.getLastChild()); + if (rightmostDot == null) return; + + innermostParent.addAfter(startElement, rightmostDot); + + final CommentTracker ct = new CommentTracker(); + ct.markUnchanged(startElement); + ct.deleteAndRestoreComments(startElement); + } + + @Nullable("The type does not have DOT tokens") + @Contract(value = "null -> null", pure = true) + private static PsiElement getRightmostDot(@Nullable final PsiElement element) { + if (element == null) return null; + if (element.getNode().getElementType().equals(JavaTokenType.DOT)) return element; + + return getRightmostDot(element.getPrevSibling()); + } + + /** + * Returns the type element either from a type parameter or a variable declaration + * + * @param startElement element to find the type for + * @return the type element either from a type parameter or a variable declaration + */ + @Nullable("No type element found") + @Contract(pure = true) + private static PsiTypeElement getTypeElement(@NotNull final PsiElement startElement) { + final PsiTypeElement psiTypeElement = PsiTreeUtil.getParentOfType(startElement, PsiTypeElement.class); + if (psiTypeElement != null) return psiTypeElement; + + final PsiVariable variable = PsiTreeUtil.getParentOfType(startElement, PsiVariable.class); + if (variable == null) return null; + + return variable.getTypeElement(); + } + } } diff --git a/java/java-psi-impl/src/messages/JavaErrorBundle.properties b/java/java-psi-impl/src/messages/JavaErrorBundle.properties index 5a6da572cf2c..ca0504f27b1d 100644 --- a/java/java-psi-impl/src/messages/JavaErrorBundle.properties +++ b/java/java-psi-impl/src/messages/JavaErrorBundle.properties @@ -463,3 +463,4 @@ repeated.interface=Repeated interface class.cannot.be.inherited.with.different.arguments={0} cannot be inherited with different arguments: {1} bad.type.in.switch.expression=Bad type in switch expression: {0} cannot be converted to {1} switch.expression.cannot.be.void=Target type for switch expression cannot be void +annotation.on.static.member.qualifying.type.family.name=Move type annotation diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterAnnotatedField.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterAnnotatedField.java new file mode 100644 index 000000000000..13e0ec6bb62b --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterAnnotatedField.java @@ -0,0 +1,12 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface Meta { } + +class Main { + public static class Data { } + static final /*1 */ /*2*/ /*5 *//*6 */ transient Main.@/* 3 */ /* 4*/ Meta Data var = null; +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterAnnotatedLocalVariable.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterAnnotatedLocalVariable.java new file mode 100644 index 000000000000..02f429b3d1e7 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterAnnotatedLocalVariable.java @@ -0,0 +1,14 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface Meta { } + +class Main { + public static class Data { } + static { + final /*1 */ /*2*/ /*5 *//*6 */ synchronized transient Main.@/* 3 */ /* 4*/ Meta Data var = null; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterAnnotatedMethodParameter.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterAnnotatedMethodParameter.java new file mode 100644 index 000000000000..7756a032d705 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterAnnotatedMethodParameter.java @@ -0,0 +1,12 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface Meta { } + +class Main { + public static class Data { } + void func(final /*1 */ /*2*/ /*5 *//*6 */ synchronized transient Main.@/* 3 */ /* 4*/ Meta Data var) { } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterAnnotatedTypeParameter.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterAnnotatedTypeParameter.java new file mode 100644 index 000000000000..ea2eea1c4283 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterAnnotatedTypeParameter.java @@ -0,0 +1,12 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface Meta { } +class Generic {} + +class Main extends Generic { + public static class Data { } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterMultipleAnnotatedFieldMoveFirst.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterMultipleAnnotatedFieldMoveFirst.java new file mode 100644 index 000000000000..98f9ecd51053 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterMultipleAnnotatedFieldMoveFirst.java @@ -0,0 +1,14 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } + +class Main { + public static class Data { } + static final /*1 */ /*2*//*one*/ @/*two*/Second /*5 *//*6 */ transient Main.@/* 3 */ /* 4*/ First Data var = null; +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterMultipleAnnotatedFieldMoveSecond.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterMultipleAnnotatedFieldMoveSecond.java new file mode 100644 index 000000000000..c10a9635f4b6 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterMultipleAnnotatedFieldMoveSecond.java @@ -0,0 +1,14 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } + +class Main { + public static class Data { } + static final /*1 */ /*2*/@/* 3 */ /* 4*/ First/*one*/ /*5 *//*6 */ transient Main.@/*two*/Second Data var = null; +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterMultipleAnnotatedLocalVariableMoveFirst.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterMultipleAnnotatedLocalVariableMoveFirst.java new file mode 100644 index 000000000000..54dd61cc6349 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterMultipleAnnotatedLocalVariableMoveFirst.java @@ -0,0 +1,16 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } + +class Main { + public static class Data { } + static { + final /*1 */ /*2*//*one*/ @/*two*/Second /*5 *//*6 */ synchronized transient Main.@/* 3 */ /* 4*/ First Data var = null; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterMultipleAnnotatedLocalVariableMoveSecond.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterMultipleAnnotatedLocalVariableMoveSecond.java new file mode 100644 index 000000000000..98b2fc251aa0 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterMultipleAnnotatedLocalVariableMoveSecond.java @@ -0,0 +1,16 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } + +class Main { + public static class Data { } + static { + final /*1 */ /*2*/@/* 3 */ /* 4*/ First/*one*/ /*5 *//*6 */ synchronized transient Main.@/*two*/Second Data var = null; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterMultipleAnnotatedMethodParameterMoveFirst.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterMultipleAnnotatedMethodParameterMoveFirst.java new file mode 100644 index 000000000000..cd5c98d537ce --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterMultipleAnnotatedMethodParameterMoveFirst.java @@ -0,0 +1,14 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } + +class Main { + public static class Data { } + void func(final /*1 */ /*2*//*one*/ @/*two*/Second /*5 *//*6 */ synchronized transient Main.@/* 3 */ /* 4*/ First Data var) { } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterMultipleAnnotatedMethodParameterMoveSecond.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterMultipleAnnotatedMethodParameterMoveSecond.java new file mode 100644 index 000000000000..6534692837eb --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterMultipleAnnotatedMethodParameterMoveSecond.java @@ -0,0 +1,14 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } + +class Main { + public static class Data { } + void func(final /*1 */ /*2*/@/* 3 */ /* 4*/ First/*one*/ /*5 *//*6 */ synchronized transient Main.@/*two*/Second Data var) { } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterMultipleAnnotatedTypeParameterMoveFirst.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterMultipleAnnotatedTypeParameterMoveFirst.java new file mode 100644 index 000000000000..cc1cccc396d9 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterMultipleAnnotatedTypeParameterMoveFirst.java @@ -0,0 +1,14 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } +class Generic {} + +class Main extends Generic { + public static class Data { } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterMultipleAnnotatedTypeParameterMoveSecond.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterMultipleAnnotatedTypeParameterMoveSecond.java new file mode 100644 index 000000000000..5b7ec7887037 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterMultipleAnnotatedTypeParameterMoveSecond.java @@ -0,0 +1,14 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } +class Generic {} + +class Main extends Generic { + public static class Data { } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedAnnotatedField.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedAnnotatedField.java new file mode 100644 index 000000000000..0853b83adf4b --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedAnnotatedField.java @@ -0,0 +1,14 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface Meta { } + +class Main { + public static class Data { + public static class Nested { } + } + static final /*1 */ /*2*/ /*5 *//*6 */ transient Main.Data.@/* 3 */ /* 4*/ Meta Nested var = null; +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedAnnotatedLocalVariable.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedAnnotatedLocalVariable.java new file mode 100644 index 000000000000..4c5e1459c7b3 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedAnnotatedLocalVariable.java @@ -0,0 +1,16 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface Meta { } + +class Main { + public static class Data { + public static class Nested { } + } + static { + final /*1 */ /*2*/ /*5 *//*6 */ synchronized transient Main.Data.@/* 3 */ /* 4*/ Meta Nested var = null; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedAnnotatedMethodParameter.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedAnnotatedMethodParameter.java new file mode 100644 index 000000000000..a06b015af25e --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedAnnotatedMethodParameter.java @@ -0,0 +1,14 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface Meta { } + +class Main { + public static class Data { + public static class Nested { } + } + void func(final /*1 */ /*2*/ /*5 *//*6 */ synchronized transient Main.Data.@/* 3 */ /* 4*/ Meta Nested var) { } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedAnnotatedTypeParameter.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedAnnotatedTypeParameter.java new file mode 100644 index 000000000000..b2ad91c09681 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedAnnotatedTypeParameter.java @@ -0,0 +1,14 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface Meta { } +class Generic {} + +class Main extends Generic { + public static class Data { + public static class Nested { } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedMultipleAnnotatedFieldMoveFirst.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedMultipleAnnotatedFieldMoveFirst.java new file mode 100644 index 000000000000..18bb7e2a47c7 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedMultipleAnnotatedFieldMoveFirst.java @@ -0,0 +1,16 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } + +class Main { + public static class Data { + public static class Nested { } + } + static final /*1 */ /*2*//*one*/ @/*two*/Second /*5 *//*6 */ transient Main.Data.@/* 3 */ /* 4*/ First Nested var = null; +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedMultipleAnnotatedFieldMoveSecond.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedMultipleAnnotatedFieldMoveSecond.java new file mode 100644 index 000000000000..12c473fd672b --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedMultipleAnnotatedFieldMoveSecond.java @@ -0,0 +1,16 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } + +class Main { + public static class Data { + public static class Nested { } + } + static final /*1 */ /*2*/@/* 3 */ /* 4*/ First/*one*/ /*5 *//*6 */ transient Main.Data.@/*two*/Second Nested var = null; +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedMultipleAnnotatedLocalVariableMoveFirst.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedMultipleAnnotatedLocalVariableMoveFirst.java new file mode 100644 index 000000000000..6fe50724f97d --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedMultipleAnnotatedLocalVariableMoveFirst.java @@ -0,0 +1,18 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } + +class Main { + public static class Data { + public static class Nested { } + } + static { + final /*1 */ /*2*//*one*/ @/*two*/Second /*5 *//*6 */ synchronized transient Main.Data.@/* 3 */ /* 4*/ First Nested var = null; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedMultipleAnnotatedLocalVariableMoveSecond.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedMultipleAnnotatedLocalVariableMoveSecond.java new file mode 100644 index 000000000000..e4149235d21f --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedMultipleAnnotatedLocalVariableMoveSecond.java @@ -0,0 +1,18 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } + +class Main { + public static class Data { + public static class Nested { } + } + static { + final /*1 */ /*2*/@/* 3 */ /* 4*/ First/*one*/ /*5 *//*6 */ synchronized transient Main.Data.@/*two*/Second Nested var = null; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedMultipleAnnotatedMethodParameterMoveFirst.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedMultipleAnnotatedMethodParameterMoveFirst.java new file mode 100644 index 000000000000..bd2a44914364 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedMultipleAnnotatedMethodParameterMoveFirst.java @@ -0,0 +1,16 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } + +class Main { + public static class Data { + public static class Nested { } + } + void func(final /*1 */ /*2*//*one*/ @/*two*/Second /*5 *//*6 */ synchronized transient Main.Data.@/* 3 */ /* 4*/ First Nested var) { } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedMultipleAnnotatedMethodParameterMoveSecond.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedMultipleAnnotatedMethodParameterMoveSecond.java new file mode 100644 index 000000000000..69555ce785dd --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedMultipleAnnotatedMethodParameterMoveSecond.java @@ -0,0 +1,16 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } + +class Main { + public static class Data { + public static class Nested { } + } + void func(final /*1 */ /*2*/@/* 3 */ /* 4*/ First/*one*/ /*5 *//*6 */ synchronized transient Main.Data.@/*two*/Second Nested var) { } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedMultipleAnnotatedTypeParameterMoveFirst.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedMultipleAnnotatedTypeParameterMoveFirst.java new file mode 100644 index 000000000000..b3b3b0ccdd16 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedMultipleAnnotatedTypeParameterMoveFirst.java @@ -0,0 +1,16 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } +class Generic {} + +class Main extends Generic { + public static class Data { + public static class Nested { } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedMultipleAnnotatedTypeParameterMoveSecond.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedMultipleAnnotatedTypeParameterMoveSecond.java new file mode 100644 index 000000000000..6483ddc1c520 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedMultipleAnnotatedTypeParameterMoveSecond.java @@ -0,0 +1,16 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } +class Generic {} + +class Main extends Generic { + public static class Data { + public static class Nested { } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedNestedAnnotatedTypeParameter.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedNestedAnnotatedTypeParameter.java new file mode 100644 index 000000000000..56d8e3642ba6 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/afterNestedNestedAnnotatedTypeParameter.java @@ -0,0 +1,16 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface Meta { } +class Generic {} + +class Main extends Generic { + public static class Data { + public static class Nested { + public static class Inner { } + } + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeAnnotatedField.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeAnnotatedField.java new file mode 100644 index 000000000000..3cb54ee833d1 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeAnnotatedField.java @@ -0,0 +1,12 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface Meta { } + +class Main { + public static class Data { } + static final /*1 */ /*2*/@/* 3 */ /* 4*/ Meta /*5 *//*6 */ transient Main.Data var = null; +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeAnnotatedLocalVariable.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeAnnotatedLocalVariable.java new file mode 100644 index 000000000000..efb7cf0f9f81 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeAnnotatedLocalVariable.java @@ -0,0 +1,14 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface Meta { } + +class Main { + public static class Data { } + static { + final /*1 */ /*2*/@/* 3 */ /* 4*/ Meta /*5 *//*6 */ synchronized transient Main.Data var = null; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeAnnotatedMethodParameter.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeAnnotatedMethodParameter.java new file mode 100644 index 000000000000..ec42869e43ea --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeAnnotatedMethodParameter.java @@ -0,0 +1,12 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface Meta { } + +class Main { + public static class Data { } + void func(final /*1 */ /*2*/@/* 3 */ /* 4*/ Meta /*5 *//*6 */ synchronized transient Main.Data var) { } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeAnnotatedTypeParameter.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeAnnotatedTypeParameter.java new file mode 100644 index 000000000000..ad1f50d13a5c --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeAnnotatedTypeParameter.java @@ -0,0 +1,12 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface Meta { } +class Generic {} + +class Main extends Generic/* 3 */ /* 4*/ Meta /*5 *//*6 */ Main.Data> { + public static class Data { } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeMultipleAnnotatedFieldMoveFirst.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeMultipleAnnotatedFieldMoveFirst.java new file mode 100644 index 000000000000..1a760398b18e --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeMultipleAnnotatedFieldMoveFirst.java @@ -0,0 +1,14 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } + +class Main { + public static class Data { } + static final /*1 */ /*2*/@/* 3 */ /* 4*/ First/*one*/ @/*two*/Second /*5 *//*6 */ transient Main.Data var = null; +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeMultipleAnnotatedFieldMoveSecond.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeMultipleAnnotatedFieldMoveSecond.java new file mode 100644 index 000000000000..7a084d65624f --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeMultipleAnnotatedFieldMoveSecond.java @@ -0,0 +1,14 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } + +class Main { + public static class Data { } + static final /*1 */ /*2*/@/* 3 */ /* 4*/ First/*one*/ @/*two*/Second /*5 *//*6 */ transient Main.Data var = null; +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeMultipleAnnotatedLocalVariableMoveFirst.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeMultipleAnnotatedLocalVariableMoveFirst.java new file mode 100644 index 000000000000..c77cf5b4201f --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeMultipleAnnotatedLocalVariableMoveFirst.java @@ -0,0 +1,16 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } + +class Main { + public static class Data { } + static { + final /*1 */ /*2*/@/* 3 */ /* 4*/ First/*one*/ @/*two*/Second /*5 *//*6 */ synchronized transient Main.Data var = null; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeMultipleAnnotatedLocalVariableMoveSecond.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeMultipleAnnotatedLocalVariableMoveSecond.java new file mode 100644 index 000000000000..35502094bcc7 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeMultipleAnnotatedLocalVariableMoveSecond.java @@ -0,0 +1,16 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } + +class Main { + public static class Data { } + static { + final /*1 */ /*2*/@/* 3 */ /* 4*/ First/*one*/ @/*two*/Second /*5 *//*6 */ synchronized transient Main.Data var = null; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeMultipleAnnotatedMethodParameterMoveFirst.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeMultipleAnnotatedMethodParameterMoveFirst.java new file mode 100644 index 000000000000..c6ccb739761f --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeMultipleAnnotatedMethodParameterMoveFirst.java @@ -0,0 +1,14 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } + +class Main { + public static class Data { } + void func(final /*1 */ /*2*/@/* 3 */ /* 4*/ First/*one*/ @/*two*/Second /*5 *//*6 */ synchronized transient Main.Data var) { } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeMultipleAnnotatedMethodParameterMoveSecond.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeMultipleAnnotatedMethodParameterMoveSecond.java new file mode 100644 index 000000000000..0674249c968d --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeMultipleAnnotatedMethodParameterMoveSecond.java @@ -0,0 +1,14 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } + +class Main { + public static class Data { } + void func(final /*1 */ /*2*/@/* 3 */ /* 4*/ First/*one*/ @/*two*/Second /*5 *//*6 */ synchronized transient Main.Data var) { } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeMultipleAnnotatedTypeParameterMoveFirst.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeMultipleAnnotatedTypeParameterMoveFirst.java new file mode 100644 index 000000000000..62b22adf8b10 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeMultipleAnnotatedTypeParameterMoveFirst.java @@ -0,0 +1,14 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } +class Generic {} + +class Main extends Generic/* 3 */ /* 4*/ First/*one*/ @/*two*/Second /*5 *//*6 */ Main.Data> { + public static class Data { } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeMultipleAnnotatedTypeParameterMoveSecond.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeMultipleAnnotatedTypeParameterMoveSecond.java new file mode 100644 index 000000000000..bdf88665fdde --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeMultipleAnnotatedTypeParameterMoveSecond.java @@ -0,0 +1,14 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } +class Generic {} + +class Main extends GenericSecond /*5 *//*6 */ Main.Data> { + public static class Data { } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedAnnotatedField.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedAnnotatedField.java new file mode 100644 index 000000000000..4f91261fb932 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedAnnotatedField.java @@ -0,0 +1,14 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface Meta { } + +class Main { + public static class Data { + public static class Nested { } + } + static final /*1 */ /*2*/@/* 3 */ /* 4*/ Meta /*5 *//*6 */ transient Main.Data.Nested var = null; +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedAnnotatedLocalVariable.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedAnnotatedLocalVariable.java new file mode 100644 index 000000000000..b502295d6a33 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedAnnotatedLocalVariable.java @@ -0,0 +1,16 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface Meta { } + +class Main { + public static class Data { + public static class Nested { } + } + static { + final /*1 */ /*2*/@/* 3 */ /* 4*/ Meta /*5 *//*6 */ synchronized transient Main.Data.Nested var = null; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedAnnotatedMethodParameter.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedAnnotatedMethodParameter.java new file mode 100644 index 000000000000..5a79c3cb0fef --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedAnnotatedMethodParameter.java @@ -0,0 +1,14 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface Meta { } + +class Main { + public static class Data { + public static class Nested { } + } + void func(final /*1 */ /*2*/@/* 3 */ /* 4*/ Meta /*5 *//*6 */ synchronized transient Main.Data.Nested var) { } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedAnnotatedTypeParameter.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedAnnotatedTypeParameter.java new file mode 100644 index 000000000000..50f63e73a9d8 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedAnnotatedTypeParameter.java @@ -0,0 +1,14 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface Meta { } +class Generic {} + +class Main extends Generic/* 3 */ /* 4*/ Meta /*5 *//*6 */ Main.Data.Nested> { + public static class Data { + public static class Nested { } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedMultipleAnnotatedFieldMoveFirst.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedMultipleAnnotatedFieldMoveFirst.java new file mode 100644 index 000000000000..0b98555f9646 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedMultipleAnnotatedFieldMoveFirst.java @@ -0,0 +1,16 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } + +class Main { + public static class Data { + public static class Nested { } + } + static final /*1 */ /*2*/@/* 3 */ /* 4*/ First/*one*/ @/*two*/Second /*5 *//*6 */ transient Main.Data.Nested var = null; +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedMultipleAnnotatedFieldMoveSecond.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedMultipleAnnotatedFieldMoveSecond.java new file mode 100644 index 000000000000..77fed1899f18 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedMultipleAnnotatedFieldMoveSecond.java @@ -0,0 +1,16 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } + +class Main { + public static class Data { + public static class Nested { } + } + static final /*1 */ /*2*/@/* 3 */ /* 4*/ First/*one*/ @/*two*/Second /*5 *//*6 */ transient Main.Data.Nested var = null; +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedMultipleAnnotatedLocalVariableMoveFirst.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedMultipleAnnotatedLocalVariableMoveFirst.java new file mode 100644 index 000000000000..be9a39c47b32 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedMultipleAnnotatedLocalVariableMoveFirst.java @@ -0,0 +1,18 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } + +class Main { + public static class Data { + public static class Nested { } + } + static { + final /*1 */ /*2*/@/* 3 */ /* 4*/ First/*one*/ @/*two*/Second /*5 *//*6 */ synchronized transient Main.Data.Nested var = null; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedMultipleAnnotatedLocalVariableMoveSecond.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedMultipleAnnotatedLocalVariableMoveSecond.java new file mode 100644 index 000000000000..f2fd1a90b2b2 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedMultipleAnnotatedLocalVariableMoveSecond.java @@ -0,0 +1,18 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } + +class Main { + public static class Data { + public static class Nested { } + } + static { + final /*1 */ /*2*/@/* 3 */ /* 4*/ First/*one*/ @/*two*/Second /*5 *//*6 */ synchronized transient Main.Data.Nested var = null; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedMultipleAnnotatedMethodParameterMoveFirst.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedMultipleAnnotatedMethodParameterMoveFirst.java new file mode 100644 index 000000000000..aab8dd471326 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedMultipleAnnotatedMethodParameterMoveFirst.java @@ -0,0 +1,16 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } + +class Main { + public static class Data { + public static class Nested { } + } + void func(final /*1 */ /*2*/@/* 3 */ /* 4*/ First/*one*/ @/*two*/Second /*5 *//*6 */ synchronized transient Main.Data.Nested var) { } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedMultipleAnnotatedMethodParameterMoveSecond.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedMultipleAnnotatedMethodParameterMoveSecond.java new file mode 100644 index 000000000000..08e2f6dd2153 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedMultipleAnnotatedMethodParameterMoveSecond.java @@ -0,0 +1,16 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } + +class Main { + public static class Data { + public static class Nested { } + } + void func(final /*1 */ /*2*/@/* 3 */ /* 4*/ First/*one*/ @/*two*/Second /*5 *//*6 */ synchronized transient Main.Data.Nested var) { } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedMultipleAnnotatedTypeParameterMoveFirst.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedMultipleAnnotatedTypeParameterMoveFirst.java new file mode 100644 index 000000000000..146a40df4a45 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedMultipleAnnotatedTypeParameterMoveFirst.java @@ -0,0 +1,16 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } +class Generic {} + +class Main extends Generic/* 3 */ /* 4*/ First/*one*/ @/*two*/Second /*5 *//*6 */ Main.Data.Nested> { + public static class Data { + public static class Nested { } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedMultipleAnnotatedTypeParameterMoveSecond.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedMultipleAnnotatedTypeParameterMoveSecond.java new file mode 100644 index 000000000000..c13a2fcdb90c --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedMultipleAnnotatedTypeParameterMoveSecond.java @@ -0,0 +1,16 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface First { } +@Target(ElementType.TYPE_USE) +@interface Second { } +class Generic {} + +class Main extends GenericSecond /*5 *//*6 */ Main.Data.Nested> { + public static class Data { + public static class Nested { } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedNestedAnnotatedTypeParameter.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedNestedAnnotatedTypeParameter.java new file mode 100644 index 000000000000..34fd3746ee23 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType/beforeNestedNestedAnnotatedTypeParameter.java @@ -0,0 +1,16 @@ +// "Move type annotation" "true" + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_USE) +@interface Meta { } +class Generic {} + +class Main extends Generic/* 3 */ /* 4*/ Meta /*5 *//*6 */ Main.Data.Nested.Inner> { + public static class Data { + public static class Nested { + public static class Inner { } + } + } +} diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/MoveAnnotationOnStaticMemberQualifyingTypeTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/MoveAnnotationOnStaticMemberQualifyingTypeTest.java new file mode 100644 index 000000000000..401de18ec3e7 --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/quickFix/MoveAnnotationOnStaticMemberQualifyingTypeTest.java @@ -0,0 +1,11 @@ +// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.java.codeInsight.daemon.quickFix; + +import com.intellij.codeInsight.daemon.quickFix.LightQuickFixParameterizedTestCase; + +public class MoveAnnotationOnStaticMemberQualifyingTypeTest extends LightQuickFixParameterizedTestCase { + @Override + protected String getBasePath() { + return "/codeInsight/daemonCodeAnalyzer/quickFix/annotatedStaticMemberQualifyingType"; + } +}