### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.ui Index: core extension/org/eclipse/jdt/internal/corext/dom/CorrectModifiersOrderRewrite.java =================================================================== RCS file: core extension/org/eclipse/jdt/internal/corext/dom/CorrectModifiersOrderRewrite.java diff -N core extension/org/eclipse/jdt/internal/corext/dom/CorrectModifiersOrderRewrite.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ core extension/org/eclipse/jdt/internal/corext/dom/CorrectModifiersOrderRewrite.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,32 @@ +/******************************************************************************* + * Copyright (c) 2000, 2010 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.jdt.internal.corext.dom; + +import org.eclipse.text.edits.TextEditGroup; + +import org.eclipse.jdt.core.dom.AST; +import org.eclipse.jdt.core.dom.ASTNode; +import org.eclipse.jdt.core.dom.BodyDeclaration; +import org.eclipse.jdt.core.dom.rewrite.ASTRewrite; + +public class CorrectModifiersOrderRewrite { + + public static void rewriteModifiers(final BodyDeclaration withModifiersNode, final ASTRewrite rewrite, final TextEditGroup group) { + AST ast= withModifiersNode.getAST(); + + BodyDeclaration withOrderedModifiersReplacementNode= (BodyDeclaration)ASTNode.copySubtree(ast, withModifiersNode); + withOrderedModifiersReplacementNode.modifiers().clear(); + withOrderedModifiersReplacementNode.modifiers().addAll(ASTNodeFactory.newModifiers(ast, withModifiersNode.getModifiers())); + + rewrite.replace(withModifiersNode, withOrderedModifiersReplacementNode, group); + } + +} Index: core extension/org/eclipse/jdt/internal/corext/fix/CleanUpConstants.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/CleanUpConstants.java,v retrieving revision 1.28 diff -u -r1.28 CleanUpConstants.java --- core extension/org/eclipse/jdt/internal/corext/fix/CleanUpConstants.java 23 Sep 2009 17:11:21 -0000 1.28 +++ core extension/org/eclipse/jdt/internal/corext/fix/CleanUpConstants.java 16 Aug 2010 10:55:04 -0000 @@ -663,6 +663,79 @@ public static final String VARIABLE_DECLARATION_USE_TYPE_ARGUMENTS_FOR_RAW_TYPE_REFERENCES= "cleanup.use_arguments_for_raw_type_references"; //$NON-NLS-1$ /** + * Correct modifiers order for variable declarations. For detailed settings use:
+ * {@link #VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_CLASSES}
+ * {@link #VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_FIELDS}
+ * {@link #VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_METHODS}
+ *
+ * Possible values: {TRUE, FALSE}
+ * + *
+ * + * @see CleanUpOptions#TRUE + * @see CleanUpOptions#FALSE + * @since 3.7 + */ + public static final String VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER= "cleanup.correct_variable_modifiers_order"; //$NON-NLS-1$ + + /** + * Correct modifiers order for classes i.e.: + * + *
+	 *                   abstract public class A {} -> public abstract class A {}
+	 * 
+ * + * Only has an effect if {@link #VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER} is TRUE
+ *
+ * Possible values: {TRUE, FALSE}
+ * + *
+ * + * @see CleanUpOptions#TRUE + * @see CleanUpOptions#FALSE + * @since 3.7 + */ + public static final String VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_CLASSES= "cleanup.correct_class_modifiers_order"; //$NON-NLS-1$ + + /** + * Correct modifiers order for fields i.e.: + * + *
+	 *                   static public final int FIELD= 0; -> public static final int FIELD= 0;
+	 * 
+ * + * Only has an effect if {@link #VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER} is TRUE
+ *
+ * Possible values: {TRUE, FALSE}
+ * + *
+ * + * @see CleanUpOptions#TRUE + * @see CleanUpOptions#FALSE + * @since 3.7 + */ + public static final String VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_FIELDS= "cleanup.correct_field_modifiers_order"; //$NON-NLS-1$ + + /** + * Correct modifiers order for methods i.e.: + * + *
+	 *                   final synchronized protected void foo() {} -> synchronized protected final void foo() {}
+	 * 
+ * + * Only has an effect if {@link #VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER} is TRUE
+ *
+ * Possible values: {TRUE, FALSE}
+ * + *
+ * + * @see CleanUpOptions#TRUE + * @see CleanUpOptions#FALSE + * @since 3.7 + */ + public static final String VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_METHODS= "cleanup.correct_method_modifiers_order"; //$NON-NLS-1$ + + /** * Removes unused imports.
*
* Possible values: {TRUE, FALSE}
@@ -1135,6 +1208,12 @@ options.setOption(VARIABLE_DECLARATIONS_USE_FINAL_LOCAL_VARIABLES, CleanUpOptions.TRUE); options.setOption(VARIABLE_DECLARATIONS_USE_FINAL_PARAMETERS, CleanUpOptions.FALSE); options.setOption(VARIABLE_DECLARATIONS_USE_FINAL_PRIVATE_FIELDS, CleanUpOptions.TRUE); + + //Modifiers Order + options.setOption(VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER, CleanUpOptions.FALSE); + options.setOption(VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_CLASSES, CleanUpOptions.TRUE); + options.setOption(VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_FIELDS, CleanUpOptions.TRUE); + options.setOption(VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_METHODS, CleanUpOptions.TRUE); //Unused Code options.setOption(REMOVE_UNUSED_CODE_IMPORTS, CleanUpOptions.TRUE); @@ -1215,6 +1294,12 @@ options.setOption(VARIABLE_DECLARATIONS_USE_FINAL_LOCAL_VARIABLES, CleanUpOptions.FALSE); options.setOption(VARIABLE_DECLARATIONS_USE_FINAL_PARAMETERS, CleanUpOptions.FALSE); options.setOption(VARIABLE_DECLARATIONS_USE_FINAL_PRIVATE_FIELDS, CleanUpOptions.TRUE); + + //Modifiers Order + options.setOption(VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER, CleanUpOptions.TRUE); + options.setOption(VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_CLASSES, CleanUpOptions.FALSE); + options.setOption(VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_FIELDS, CleanUpOptions.FALSE); + options.setOption(VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_METHODS, CleanUpOptions.TRUE); //Unused Code options.setOption(REMOVE_UNUSED_CODE_IMPORTS, CleanUpOptions.FALSE); Index: core extension/org/eclipse/jdt/internal/corext/fix/CorrectModifiersOrderFix.java =================================================================== RCS file: core extension/org/eclipse/jdt/internal/corext/fix/CorrectModifiersOrderFix.java diff -N core extension/org/eclipse/jdt/internal/corext/fix/CorrectModifiersOrderFix.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ core extension/org/eclipse/jdt/internal/corext/fix/CorrectModifiersOrderFix.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,184 @@ +/******************************************************************************* + * Copyright (c) 2000, 2010 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + * Chris West (Faux) - [clean up] "Use modifier 'final' where possible" can introduce compile errors - https://bugs.eclipse.org/bugs/show_bug.cgi?id=272532 + *******************************************************************************/ +package org.eclipse.jdt.internal.corext.fix; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import org.eclipse.core.runtime.CoreException; + +import org.eclipse.text.edits.TextEditGroup; + +import org.eclipse.jdt.core.dom.ASTNode; +import org.eclipse.jdt.core.dom.BodyDeclaration; +import org.eclipse.jdt.core.dom.CompilationUnit; +import org.eclipse.jdt.core.dom.EnumConstantDeclaration; +import org.eclipse.jdt.core.dom.EnumDeclaration; +import org.eclipse.jdt.core.dom.FieldDeclaration; +import org.eclipse.jdt.core.dom.MethodDeclaration; +import org.eclipse.jdt.core.dom.SimpleName; +import org.eclipse.jdt.core.dom.TypeDeclaration; +import org.eclipse.jdt.core.dom.rewrite.ASTRewrite; + +import org.eclipse.jdt.internal.corext.dom.CorrectModifiersOrderRewrite; +import org.eclipse.jdt.internal.corext.dom.GenericVisitor; +import org.eclipse.jdt.internal.corext.refactoring.structure.CompilationUnitRewrite; + +import org.eclipse.jdt.ui.cleanup.ICleanUpFix; + +public class CorrectModifiersOrderFix extends CompilationUnitRewriteOperationsFix { + + private static class WithModifiersNodeFinder extends GenericVisitor { + + private final boolean fCorrectModifiersOrderClasses; + private final boolean fCorrectModifiersOrderFields; + private final boolean fCorrectModifiersOrderMethods; + private final List fWithModifiersNodes; + private final List fOperations; + + public WithModifiersNodeFinder(boolean correctModifiersOrderClasses, + boolean correctModifiersOrderFields, + boolean correctModifiersOrderMethods, + List withModifiersNodes, + List operations) { + fCorrectModifiersOrderClasses= correctModifiersOrderClasses; + fCorrectModifiersOrderFields= correctModifiersOrderFields; + fCorrectModifiersOrderMethods= correctModifiersOrderMethods; + fWithModifiersNodes= withModifiersNodes; + fOperations= operations; + } + + /** + * {@inheritDoc} + */ + public void endVisit(TypeDeclaration node) { + if (fCorrectModifiersOrderClasses && node.modifiers().size() > 1) { + fWithModifiersNodes.add(node); + fOperations.add(createCorrectModifiersOrderOperation(node)); + } + } + + /** + * {@inheritDoc} + */ + public void endVisit(EnumDeclaration node) { + if (fCorrectModifiersOrderClasses && node.modifiers().size() > 1) { + fWithModifiersNodes.add(node); + fOperations.add(createCorrectModifiersOrderOperation(node)); + } + } + + /** + * {@inheritDoc} + */ + public void endVisit(EnumConstantDeclaration node) { + if (fCorrectModifiersOrderClasses && node.modifiers().size() > 1) { + fWithModifiersNodes.add(node); + fOperations.add(createCorrectModifiersOrderOperation(node)); + } + } + + /** + * {@inheritDoc} + */ + public boolean visit(FieldDeclaration node) { + if (fCorrectModifiersOrderFields && node.modifiers().size() > 1) { + fWithModifiersNodes.add(node); + fOperations.add(createCorrectModifiersOrderOperation(node)); + } + return super.visit(node); + } + + /** + * {@inheritDoc} + */ + public boolean visit(MethodDeclaration node) { + if (fCorrectModifiersOrderMethods && node.modifiers().size() > 1) { + fWithModifiersNodes.add(node); + fOperations.add(createCorrectModifiersOrderOperation(node)); + } + return super.visit(node); + } + + } + + private static class CorrectModifiersOrderOperation extends CompilationUnitRewriteOperation { + + private final BodyDeclaration fWithModifiersNode; + + public CorrectModifiersOrderOperation(BodyDeclaration withModifiersNode) { + fWithModifiersNode= withModifiersNode; + } + + /** + * {@inheritDoc} + */ + public void rewriteAST(CompilationUnitRewrite cuRewrite, LinkedProposalModel model) throws CoreException { + ASTRewrite rewrite= cuRewrite.getASTRewrite(); + + TextEditGroup group= createTextEditGroup(FixMessages.VariableDeclarationFix_correctModifiersOrder_description, cuRewrite); + + CorrectModifiersOrderRewrite.rewriteModifiers(fWithModifiersNode, rewrite, group); + } + } + + private static CorrectModifiersOrderOperation createCorrectModifiersOrderOperation(BodyDeclaration withModifiersNode) { + return new CorrectModifiersOrderOperation(withModifiersNode); + } + + public static CorrectModifiersOrderFix createFix(final CompilationUnit compilationUnit, ASTNode[] selectedNodes) { + List withModifiersNode= new LinkedList(); + List operations= new ArrayList(); + WithModifiersNodeFinder visitor= new WithModifiersNodeFinder(true, true, true, withModifiersNode, operations); + compilationUnit.accept(visitor); + if (selectedNodes.length == 1) { + if (selectedNodes[0] instanceof SimpleName) { + selectedNodes[0]= selectedNodes[0].getParent(); + } + selectedNodes[0].accept(visitor); + } else { + for (int i= 0; i < selectedNodes.length; i++) { + ASTNode selectedNode= selectedNodes[i]; + selectedNode.accept(visitor); + } + } + if (operations.size() == 0) + return null; + + CompilationUnitRewriteOperation[] fixRewriteOperations= (CompilationUnitRewriteOperation[])operations.toArray(new CompilationUnitRewriteOperation[operations.size()]); + + return new CorrectModifiersOrderFix(FixMessages.VariableDeclarationFix_correctModifiersOrder_description, compilationUnit, fixRewriteOperations); + } + + public static ICleanUpFix createCleanUp(CompilationUnit compilationUnit, + boolean correctModifiersOrderClasses, + boolean correctModifiersOrderFields, + boolean correctModifiersOrderMethods) { + if (!correctModifiersOrderClasses && !correctModifiersOrderFields && !correctModifiersOrderMethods) + return null; + + List withModifiersNodes= new LinkedList(); + List operations= new ArrayList(); + WithModifiersNodeFinder finder= new WithModifiersNodeFinder(correctModifiersOrderClasses, correctModifiersOrderFields, correctModifiersOrderMethods, withModifiersNodes, operations); + compilationUnit.accept(finder); + + CompilationUnitRewriteOperation[] fixRewriteOperations= (CompilationUnitRewriteOperation[])operations.toArray(new CompilationUnitRewriteOperation[operations.size()]); + + return new CorrectModifiersOrderFix(FixMessages.VariableDeclarationFix_add_final_change_name, compilationUnit, fixRewriteOperations); + } + + protected CorrectModifiersOrderFix(String name, CompilationUnit compilationUnit, CompilationUnitRewriteOperation[] fixRewriteOperations) { + super(name, compilationUnit, fixRewriteOperations); + } + +} Index: core extension/org/eclipse/jdt/internal/corext/fix/FixMessages.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/FixMessages.java,v retrieving revision 1.42 diff -u -r1.42 FixMessages.java --- core extension/org/eclipse/jdt/internal/corext/fix/FixMessages.java 16 Nov 2009 16:55:03 -0000 1.42 +++ core extension/org/eclipse/jdt/internal/corext/fix/FixMessages.java 16 Aug 2010 10:55:12 -0000 @@ -117,6 +117,8 @@ public static String VariableDeclarationFix_changeModifierOfUnknownToFinal_description; public static String VariableDeclarationFix_ChangeMidifiersToFinalWherPossible_description; + public static String VariableDeclarationFix_correctModifiersOrder_description; + static { // initialize resource bundle NLS.initializeMessages(BUNDLE_NAME, FixMessages.class); Index: core extension/org/eclipse/jdt/internal/corext/fix/FixMessages.properties =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/FixMessages.properties,v retrieving revision 1.48 diff -u -r1.48 FixMessages.properties --- core extension/org/eclipse/jdt/internal/corext/fix/FixMessages.properties 20 May 2010 09:16:59 -0000 1.48 +++ core extension/org/eclipse/jdt/internal/corext/fix/FixMessages.properties 16 Aug 2010 10:55:12 -0000 @@ -83,6 +83,8 @@ VariableDeclarationFix_add_final_change_name=Add final VariableDeclarationFix_ChangeMidifiersToFinalWherPossible_description=Change modifiers to final where possible +VariableDeclarationFix_correctModifiersOrder_description=Correct modifiers order + PotentialProgrammingProblemsFix_calculatingUIDFailed_unknown=Could not calculate a serial version id for {0}. The type will be ignored. PotentialProgrammingProblemsFix_add_id_change_name=Add Serial Version ID PotentialProgrammingProblemsFix_calculatingUIDFailed_exception=Could not calculate serial version ids for serializable types in project {0}. The types will be ignored. Reason: {1}. Index: plugin.xml =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/plugin.xml,v retrieving revision 1.842 diff -u -r1.842 plugin.xml --- plugin.xml 29 Jul 2010 09:15:47 -0000 1.842 +++ plugin.xml 16 Aug 2010 10:55:11 -0000 @@ -6597,6 +6597,11 @@ runAfter="org.eclipse.jdt.ui.cleanup.loop"> + + Index: ui/org/eclipse/jdt/internal/ui/fix/CorrectModifiersOrderCleanUp.java =================================================================== RCS file: ui/org/eclipse/jdt/internal/ui/fix/CorrectModifiersOrderCleanUp.java diff -N ui/org/eclipse/jdt/internal/ui/fix/CorrectModifiersOrderCleanUp.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ ui/org/eclipse/jdt/internal/ui/fix/CorrectModifiersOrderCleanUp.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,114 @@ +/******************************************************************************* + * Copyright (c) 2000, 2010 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.jdt.internal.ui.fix; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.eclipse.core.runtime.CoreException; + +import org.eclipse.jdt.core.dom.CompilationUnit; + +import org.eclipse.jdt.internal.corext.fix.CleanUpConstants; +import org.eclipse.jdt.internal.corext.fix.CorrectModifiersOrderFix; + +import org.eclipse.jdt.ui.cleanup.CleanUpContext; +import org.eclipse.jdt.ui.cleanup.CleanUpRequirements; +import org.eclipse.jdt.ui.cleanup.ICleanUpFix; + +public class CorrectModifiersOrderCleanUp extends AbstractCleanUp { + + public CorrectModifiersOrderCleanUp(Map options) { + super(options); + } + + public CorrectModifiersOrderCleanUp() { + super(); + } + + /** + * {@inheritDoc} + */ + public CleanUpRequirements getRequirements() { + return new CleanUpRequirements(requireAST(), false, false, null); + } + + private boolean requireAST() { + boolean addFinal= isEnabled(CleanUpConstants.VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER); + if (!addFinal) + return false; + + return isEnabled(CleanUpConstants.VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_CLASSES) || + isEnabled(CleanUpConstants.VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_FIELDS) || + isEnabled(CleanUpConstants.VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_METHODS); + } + + /** + * {@inheritDoc} + */ + public ICleanUpFix createFix(CleanUpContext context) throws CoreException { + CompilationUnit compilationUnit= context.getAST(); + if (compilationUnit == null) + return null; + + boolean addFinal= isEnabled(CleanUpConstants.VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER); + if (!addFinal) + return null; + + return CorrectModifiersOrderFix.createCleanUp(compilationUnit, + isEnabled(CleanUpConstants.VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_CLASSES), + isEnabled(CleanUpConstants.VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_FIELDS), + isEnabled(CleanUpConstants.VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_METHODS)); + } + + /** + * {@inheritDoc} + */ + public String[] getStepDescriptions() { + List result= new ArrayList(); + if (isEnabled(CleanUpConstants.VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER) && isEnabled(CleanUpConstants.VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_CLASSES)) + result.add(MultiFixMessages.VariableDeclarationCleanUp_AddFinalField_description); + if (isEnabled(CleanUpConstants.VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER) && isEnabled(CleanUpConstants.VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_FIELDS)) + result.add(MultiFixMessages.VariableDeclarationCleanUp_AddFinalParameters_description); + if (isEnabled(CleanUpConstants.VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER) && isEnabled(CleanUpConstants.VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_METHODS)) + result.add(MultiFixMessages.VariableDeclarationCleanUp_AddFinalLocals_description); + + return (String[])result.toArray(new String[result.size()]); + } + + /** + * {@inheritDoc} + */ + public String getPreview() { + StringBuffer buf= new StringBuffer(); + + if (isEnabled(CleanUpConstants.VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER) && isEnabled(CleanUpConstants.VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_CLASSES)) { + buf.append("abstract public class A {\n"); //$NON-NLS-1$ + } else { + buf.append("public abstract class A {\n"); //$NON-NLS-1$ + } + if (isEnabled(CleanUpConstants.VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER) && isEnabled(CleanUpConstants.VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_FIELDS)) { + buf.append(" static public final int FIELD= 0;\n"); //$NON-NLS-1$ + } else { + buf.append(" public static final int FIELD= 0;\n"); //$NON-NLS-1$ + } + if (isEnabled(CleanUpConstants.VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER) && isEnabled(CleanUpConstants.VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_METHODS)) { + buf.append(" final synchronized protected void foo() {}\n"); //$NON-NLS-1$ + } else { + buf.append(" synchronized protected final void foo() {}\n"); //$NON-NLS-1$ + } + buf.append("}\n"); //$NON-NLS-1$ + + return buf.toString(); + } + +} Index: ui/org/eclipse/jdt/internal/ui/fix/MultiFixMessages.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/MultiFixMessages.java,v retrieving revision 1.54 diff -u -r1.54 MultiFixMessages.java --- ui/org/eclipse/jdt/internal/ui/fix/MultiFixMessages.java 17 Nov 2009 07:32:57 -0000 1.54 +++ ui/org/eclipse/jdt/internal/ui/fix/MultiFixMessages.java 16 Aug 2010 10:55:13 -0000 @@ -91,6 +91,10 @@ public static String VariableDeclarationCleanUp_AddFinalParameters_description; public static String VariableDeclarationCleanUp_AddFinalLocals_description; + public static String VariableDeclarationCleanUp_CorrectModifiersOrderClass_description; + public static String VariableDeclarationCleanUp_CorrectModifiersOrderField_description; + public static String VariableDeclarationCleanUp_CorrectModifiersOrderMethod_description; + public static String CodeFormatCleanUp_description; public static String CodeFormatFix_description; Index: ui/org/eclipse/jdt/internal/ui/fix/MultiFixMessages.properties =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/MultiFixMessages.properties,v retrieving revision 1.75 diff -u -r1.75 MultiFixMessages.properties --- ui/org/eclipse/jdt/internal/ui/fix/MultiFixMessages.properties 17 Nov 2009 07:32:57 -0000 1.75 +++ ui/org/eclipse/jdt/internal/ui/fix/MultiFixMessages.properties 16 Aug 2010 10:55:13 -0000 @@ -67,6 +67,9 @@ VariableDeclarationCleanUp_AddFinalField_description=Add final modifier to private fields VariableDeclarationCleanUp_AddFinalParameters_description=Add final modifier to method parameters VariableDeclarationCleanUp_AddFinalLocals_description=Add final modifier to local variables +VariableDeclarationCleanUp_CorrectModifiersOrderClass_description=Correct modifiers order to class declarations +VariableDeclarationCleanUp_CorrectModifiersOrderField_description=Correct modifiers order to fields declarations +VariableDeclarationCleanUp_CorrectModifiersOrderMethod_description=Correct modifiers order to methods declarations CleanUpRefactoringWizard_CleanUpConfigurationPage_title=Clean Up Configuration CleanUpRefactoringWizard_UnmanagedProfileWithName_Name=Unmanaged profile ''{0}'' Index: ui/org/eclipse/jdt/internal/ui/preferences/cleanup/CleanUpMessages.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/cleanup/CleanUpMessages.java,v retrieving revision 1.19 diff -u -r1.19 CleanUpMessages.java --- ui/org/eclipse/jdt/internal/ui/preferences/cleanup/CleanUpMessages.java 21 May 2010 07:30:58 -0000 1.19 +++ ui/org/eclipse/jdt/internal/ui/preferences/cleanup/CleanUpMessages.java 16 Aug 2010 10:55:14 -0000 @@ -53,6 +53,10 @@ public static String CodeStyleTabPage_CheckboxName_UseFinalForFields; public static String CodeStyleTabPage_CheckboxName_UseFinalForLocals; public static String CodeStyleTabPage_CheckboxName_UseFinalForParameters; + public static String CodeStyleTabPage_CheckboxName_CorrectModifiersOrder; + public static String CodeStyleTabPage_CheckboxName_CorrectModifiersOrderClasses; + public static String CodeStyleTabPage_CheckboxName_CorrectModifiersOrderFields; + public static String CodeStyleTabPage_CheckboxName_CorrectModifiersOrderMethods; public static String CodeStyleTabPage_CheckboxName_UseParentheses; public static String CodeStyleTabPage_GroupName_ControlStatments; public static String CodeStyleTabPage_GroupName_Expressions; Index: ui/org/eclipse/jdt/internal/ui/preferences/cleanup/CleanUpMessages.properties =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/cleanup/CleanUpMessages.properties,v retrieving revision 1.26 diff -u -r1.26 CleanUpMessages.properties --- ui/org/eclipse/jdt/internal/ui/preferences/cleanup/CleanUpMessages.properties 20 May 2010 09:16:59 -0000 1.26 +++ ui/org/eclipse/jdt/internal/ui/preferences/cleanup/CleanUpMessages.properties 16 Aug 2010 10:55:14 -0000 @@ -43,6 +43,10 @@ CodeStyleTabPage_GroupName_VariableDeclarations=Variable declarations CodeStyleTabPage_CheckboxName_UseFinalForFields=Private &fields CodeStyleTabPage_CheckboxName_UseFinalForLocals=&Local variables +CodeStyleTabPage_CheckboxName_CorrectModifiersOrder=Correct modifiers order +CodeStyleTabPage_CheckboxName_CorrectModifiersOrderClasses=Classes (and Enums) +CodeStyleTabPage_CheckboxName_CorrectModifiersOrderFields=Fields +CodeStyleTabPage_CheckboxName_CorrectModifiersOrderMethods=Methods CodeStyleTabPage_CheckboxName_ConvertForLoopToEnhanced=Conver&t for loops to enhanced CodeStyleTabPage_GroupName_ControlStatments=Control statements CodeStyleTabPage_RadioName_UseBlocksSpecial=Always &except for single 'return' or 'throw' statements Index: ui/org/eclipse/jdt/internal/ui/preferences/cleanup/CodeStyleTabPage.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/cleanup/CodeStyleTabPage.java,v retrieving revision 1.12 diff -u -r1.12 CodeStyleTabPage.java --- ui/org/eclipse/jdt/internal/ui/preferences/cleanup/CodeStyleTabPage.java 10 Oct 2008 17:27:19 -0000 1.12 +++ ui/org/eclipse/jdt/internal/ui/preferences/cleanup/CodeStyleTabPage.java 16 Aug 2010 10:55:14 -0000 @@ -72,5 +72,12 @@ final CheckboxPreference useFinalParametersPref= createCheckboxPref(variableGroup, 1, CleanUpMessages.CodeStyleTabPage_CheckboxName_UseFinalForParameters, CleanUpConstants.VARIABLE_DECLARATIONS_USE_FINAL_PARAMETERS, CleanUpModifyDialog.FALSE_TRUE); final CheckboxPreference useFinalVariablesPref= createCheckboxPref(variableGroup, 1, CleanUpMessages.CodeStyleTabPage_CheckboxName_UseFinalForLocals, CleanUpConstants.VARIABLE_DECLARATIONS_USE_FINAL_LOCAL_VARIABLES, CleanUpModifyDialog.FALSE_TRUE); registerSlavePreference(useFinalPref, new CheckboxPreference[] {useFinalFieldsPref, useFinalParametersPref, useFinalVariablesPref}); + + final CheckboxPreference correctModifiersOrderPref= createCheckboxPref(variableGroup, numColumns, CleanUpMessages.CodeStyleTabPage_CheckboxName_CorrectModifiersOrder, CleanUpConstants.VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER, CleanUpModifyDialog.FALSE_TRUE); + intent(variableGroup); + final CheckboxPreference correctModifiersOrderClassesPref= createCheckboxPref(variableGroup, 1, CleanUpMessages.CodeStyleTabPage_CheckboxName_CorrectModifiersOrderClasses, CleanUpConstants.VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_CLASSES, CleanUpModifyDialog.FALSE_TRUE); + final CheckboxPreference correctModifiersOrderFieldsPref= createCheckboxPref(variableGroup, 1, CleanUpMessages.CodeStyleTabPage_CheckboxName_CorrectModifiersOrderFields, CleanUpConstants.VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_FIELDS, CleanUpModifyDialog.FALSE_TRUE); + final CheckboxPreference correctModifiersOrderMethodsPref= createCheckboxPref(variableGroup, 1, CleanUpMessages.CodeStyleTabPage_CheckboxName_CorrectModifiersOrderMethods, CleanUpConstants.VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_METHODS, CleanUpModifyDialog.FALSE_TRUE); + registerSlavePreference(correctModifiersOrderPref, new CheckboxPreference[] {correctModifiersOrderClassesPref, correctModifiersOrderFieldsPref, correctModifiersOrderMethodsPref}); } } Index: ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java,v retrieving revision 1.163 diff -u -r1.163 QuickAssistProcessor.java --- ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java 13 Jul 2010 17:32:48 -0000 1.163 +++ ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java 16 Aug 2010 10:55:15 -0000 @@ -115,6 +115,7 @@ import org.eclipse.jdt.internal.corext.fix.CleanUpConstants; import org.eclipse.jdt.internal.corext.fix.ControlStatementsFix; import org.eclipse.jdt.internal.corext.fix.ConvertLoopFix; +import org.eclipse.jdt.internal.corext.fix.CorrectModifiersOrderFix; import org.eclipse.jdt.internal.corext.fix.IProposableFix; import org.eclipse.jdt.internal.corext.fix.LinkedProposalModel; import org.eclipse.jdt.internal.corext.fix.VariableDeclarationFix; @@ -139,6 +140,7 @@ import org.eclipse.jdt.internal.ui.JavaPluginImages; import org.eclipse.jdt.internal.ui.fix.ControlStatementsCleanUp; import org.eclipse.jdt.internal.ui.fix.ConvertLoopCleanUp; +import org.eclipse.jdt.internal.ui.fix.CorrectModifiersOrderCleanUp; import org.eclipse.jdt.internal.ui.fix.VariableDeclarationCleanUp; import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor; import org.eclipse.jdt.internal.ui.text.correction.proposals.ASTRewriteCorrectionProposal; @@ -201,6 +203,7 @@ || getConvertIterableLoopProposal(context, coveringNode, null) || getRemoveBlockProposals(context, coveringNode, null) || getMakeVariableDeclarationFinalProposals(context, null) + || getCorrectModifiersOrderProposals(context, null) || getMissingCaseStatementProposals(context, coveringNode, null) || getConvertStringConcatenationProposals(context, null); } @@ -239,6 +242,7 @@ getConvertIterableLoopProposal(context, coveringNode, resultingCollections); getRemoveBlockProposals(context, coveringNode, resultingCollections); getMakeVariableDeclarationFinalProposals(context, resultingCollections); + getCorrectModifiersOrderProposals(context, resultingCollections); getConvertStringConcatenationProposals(context, resultingCollections); getMissingCaseStatementProposals(context, coveringNode, resultingCollections); } @@ -1872,6 +1876,32 @@ resultingCollections.add(proposal); return true; } + + private static boolean getCorrectModifiersOrderProposals(IInvocationContext context, Collection resultingCollections) { + SelectionAnalyzer analyzer= new SelectionAnalyzer(Selection.createFromStartLength(context.getSelectionOffset(), context.getSelectionLength()), false); + context.getASTRoot().accept(analyzer); + ASTNode[] selectedNodes= analyzer.getSelectedNodes(); + if (selectedNodes.length == 0) + return false; + + IProposableFix fix= CorrectModifiersOrderFix.createFix(context.getASTRoot(), selectedNodes); + if (fix == null) + return false; + + if (resultingCollections == null) + return true; + + Image image= JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); + Map options= new Hashtable(); + options.put(CleanUpConstants.VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER, CleanUpOptions.TRUE); + options.put(CleanUpConstants.VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_CLASSES, CleanUpOptions.TRUE); + options.put(CleanUpConstants.VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_FIELDS, CleanUpOptions.TRUE); + options.put(CleanUpConstants.VARIABLE_DECLARATIONS_CORRECT_MODIFIERS_ORDER_METHODS, CleanUpOptions.TRUE); + CorrectModifiersOrderCleanUp cleanUp= new CorrectModifiersOrderCleanUp(options); + FixCorrectionProposal proposal= new FixCorrectionProposal(fix, cleanUp, 5, image, context); + resultingCollections.add(proposal); + return true; + } private static boolean getInlineLocalProposal(IInvocationContext context, final ASTNode node, Collection proposals) throws CoreException { if (!(node instanceof SimpleName))