From d20d47c8f5482cec250d2e3ec643aba54d67fe46 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 30 Mar 2015 17:22:33 +0200 Subject: [PATCH] IDEA-138354 ("Misordered modifiers" inspection vs @Target(ElementType.TYPE_USE)) --- .../style/MissortedModifiersInspection.java | 28 ++++++++++++++----- .../MissortedModifiers.java | 1 + 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/MissortedModifiersInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/MissortedModifiersInspection.java index e4770a2788a2..5e80db92c799 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/MissortedModifiersInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/MissortedModifiersInspection.java @@ -20,8 +20,8 @@ import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel; import com.intellij.openapi.project.Project; import com.intellij.psi.*; +import com.intellij.psi.impl.PsiImplUtil; import com.intellij.psi.tree.IElementType; -import com.intellij.util.IncorrectOperationException; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; @@ -86,12 +86,11 @@ public class MissortedModifiersInspection extends BaseInspection implements Clea } @Override - public void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - + public void doFix(Project project, ProblemDescriptor descriptor) { final PsiModifierList modifierList = (PsiModifierList)descriptor.getPsiElement(); final List modifiers = new ArrayList(); + final List typeAnnotations = new ArrayList(); final PsiElement[] children = modifierList.getChildren(); for (final PsiElement child : children) { if (child instanceof PsiComment) { @@ -109,14 +108,21 @@ public class MissortedModifiersInspection extends BaseInspection implements Clea modifiers.add(child.getText()); } else if (child instanceof PsiAnnotation) { - modifiers.add(0, child.getText()); + if (PsiImplUtil.isTypeAnnotation(child)) { + typeAnnotations.add(child.getText()); + } + else { + modifiers.add(0, child.getText()); + } } } Collections.sort(modifiers, new ModifierComparator()); @NonNls final StringBuilder buffer = new StringBuilder(); for (String modifier : modifiers) { - buffer.append(modifier); - buffer.append(' '); + buffer.append(modifier).append(' '); + } + for (String annotation : typeAnnotations) { + buffer.append(annotation).append(' '); } final PsiManager manager = modifierList.getManager(); final PsiElementFactory factory = JavaPsiFacade.getInstance(manager.getProject()).getElementFactory(); @@ -189,8 +195,10 @@ public class MissortedModifiersInspection extends BaseInspection implements Clea } final PsiElement[] children = modifierList.getChildren(); String currentModifier = null; + boolean typeAnnotationSeen = false; for (final PsiElement child : children) { if (child instanceof PsiJavaToken) { + if (m_requireAnnotationsFirst && typeAnnotationSeen) return true; final String text = child.getText(); if (modifierComparator.compare(text, currentModifier) < 0) { return true; @@ -198,6 +206,12 @@ public class MissortedModifiersInspection extends BaseInspection implements Clea currentModifier = text; } if (child instanceof PsiAnnotation) { + if (PsiImplUtil.isTypeAnnotation(child)) { + // type annotations come next to type + // see e.g. http://www.oracle.com/technetwork/articles/java/ma14-architect-annotations-2177655.html + typeAnnotationSeen = true; + continue; + } if (m_requireAnnotationsFirst && currentModifier != null) { //things aren't in order, since annotations come first return true; diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/style/missorted_modifiers/MissortedModifiers.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/style/missorted_modifiers/MissortedModifiers.java index d6c0da1ba0c8..69ded8322614 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/style/missorted_modifiers/MissortedModifiers.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/style/missorted_modifiers/MissortedModifiers.java @@ -22,6 +22,7 @@ class MissortedModifiers { } public @Deprecated void foo3(){}; + private @ReadOnly int [] nums; private transient static Hashtable mAttributeMeta;