### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.ui 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.29 diff -u -r1.29 CleanUpConstants.java --- core extension/org/eclipse/jdt/internal/corext/fix/CleanUpConstants.java 5 Jan 2011 10:04:47 -0000 1.29 +++ core extension/org/eclipse/jdt/internal/corext/fix/CleanUpConstants.java 31 Jan 2011 18:44:00 -0000 @@ -663,6 +663,19 @@ 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.
+ *
+ * Possible values: {TRUE, FALSE}
+ * + *
+ * + * @see CleanUpOptions#TRUE + * @see CleanUpOptions#FALSE + * @since 3.7 + */ + public static final String VARIABLE_DECLARATIONS_SORT_MODIFIERS= "cleanup.correct_variable_modifiers_order"; //$NON-NLS-1$ + + /** * Removes unused imports.
*
* Possible values: {TRUE, FALSE}
@@ -1135,6 +1148,7 @@ 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); + options.setOption(VARIABLE_DECLARATIONS_SORT_MODIFIERS, CleanUpOptions.FALSE); //Unused Code options.setOption(REMOVE_UNUSED_CODE_IMPORTS, CleanUpOptions.TRUE); 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.43 diff -u -r1.43 FixMessages.java --- core extension/org/eclipse/jdt/internal/corext/fix/FixMessages.java 29 Jan 2011 05:29:11 -0000 1.43 +++ core extension/org/eclipse/jdt/internal/corext/fix/FixMessages.java 31 Jan 2011 18:44:00 -0000 @@ -116,6 +116,7 @@ public static String VariableDeclarationFix_changeModifierOfUnknownToFinal_description; public static String VariableDeclarationFix_ChangeMidifiersToFinalWherPossible_description; + public static String VariableDeclarationFix_sortModifiers_description; static { // initialize resource bundle 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.50 diff -u -r1.50 FixMessages.properties --- core extension/org/eclipse/jdt/internal/corext/fix/FixMessages.properties 29 Jan 2011 05:29:11 -0000 1.50 +++ core extension/org/eclipse/jdt/internal/corext/fix/FixMessages.properties 31 Jan 2011 18:44:00 -0000 @@ -82,6 +82,7 @@ VariableDeclarationFix_changeModifierOfUnknownToFinal_description=Change modifier to final VariableDeclarationFix_add_final_change_name=Add final VariableDeclarationFix_ChangeMidifiersToFinalWherPossible_description=Change modifiers to final where possible +VariableDeclarationFix_sortModifiers_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 Index: core extension/org/eclipse/jdt/internal/corext/fix/SortModifiersFix.java =================================================================== RCS file: core extension/org/eclipse/jdt/internal/corext/fix/SortModifiersFix.java diff -N core extension/org/eclipse/jdt/internal/corext/fix/SortModifiersFix.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ core extension/org/eclipse/jdt/internal/corext/fix/SortModifiersFix.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,122 @@ +/******************************************************************************* + * 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.SimpleName; +import org.eclipse.jdt.core.dom.rewrite.ASTRewrite; + +import org.eclipse.jdt.internal.corext.dom.HierarchicalASTVisitor; +import org.eclipse.jdt.internal.corext.dom.ModifierRewrite; +import org.eclipse.jdt.internal.corext.refactoring.structure.CompilationUnitRewrite; + +import org.eclipse.jdt.ui.cleanup.ICleanUpFix; + +public class SortModifiersFix extends CompilationUnitRewriteOperationsFix { + + private static class WithModifiersNodeFinder extends HierarchicalASTVisitor { + + private final List fWithModifiersNodes; + private final List fOperations; + + public WithModifiersNodeFinder(List withModifiersNodes, List operations) { + fWithModifiersNodes= withModifiersNodes; + fOperations= operations; + } + + /** + * {@inheritDoc} + */ + public boolean visit(BodyDeclaration node) { + if (node.modifiers().size() > 1) { + fWithModifiersNodes.add(node); + fOperations.add(createSortModifiersOperation(node)); + } + return super.visit(node); + } + + } + + private static class SortModifiersOperation extends CompilationUnitRewriteOperation { + + private final BodyDeclaration fWithModifiersNode; + + public SortModifiersOperation(BodyDeclaration withModifiersNode) { + fWithModifiersNode= withModifiersNode; + } + + /** + * {@inheritDoc} + */ + public void rewriteAST(CompilationUnitRewrite cuRewrite, LinkedProposalModel model) throws CoreException { + ASTRewrite rewrite= cuRewrite.getASTRewrite(); + TextEditGroup group= createTextEditGroup(FixMessages.VariableDeclarationFix_sortModifiers_description, cuRewrite); + int modifiers= fWithModifiersNode.getModifiers(); + ModifierRewrite listRewrite= ModifierRewrite.create(rewrite, fWithModifiersNode); + listRewrite.setModifiers(modifiers, group); + } + } + + private static SortModifiersOperation createSortModifiersOperation(BodyDeclaration withModifiersNode) { + return new SortModifiersOperation(withModifiersNode); + } + + public static SortModifiersFix createFix(final CompilationUnit compilationUnit, ASTNode[] selectedNodes) { + List withModifiersNode= new LinkedList(); + List operations= new ArrayList(); + WithModifiersNodeFinder visitor= new WithModifiersNodeFinder(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 SortModifiersFix(FixMessages.VariableDeclarationFix_sortModifiers_description, compilationUnit, fixRewriteOperations); + } + + public static ICleanUpFix createCleanUp(CompilationUnit compilationUnit) { + List withModifiersNodes= new LinkedList(); + List operations= new ArrayList(); + WithModifiersNodeFinder finder= new WithModifiersNodeFinder(withModifiersNodes, operations); + compilationUnit.accept(finder); + + CompilationUnitRewriteOperation[] fixRewriteOperations= (CompilationUnitRewriteOperation[])operations.toArray(new CompilationUnitRewriteOperation[operations.size()]); + + return new SortModifiersFix(FixMessages.VariableDeclarationFix_sortModifiers_description, compilationUnit, fixRewriteOperations); + } + + protected SortModifiersFix(String name, CompilationUnit compilationUnit, CompilationUnitRewriteOperation[] fixRewriteOperations) { + super(name, compilationUnit, fixRewriteOperations); + } + +} Index: plugin.xml =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/plugin.xml,v retrieving revision 1.846 diff -u -r1.846 plugin.xml --- plugin.xml 6 Dec 2010 07:02:24 -0000 1.846 +++ plugin.xml 31 Jan 2011 18:44:05 -0000 @@ -6616,6 +6616,11 @@ runAfter="org.eclipse.jdt.ui.cleanup.loop"> + + Index: ui/org/eclipse/jdt/internal/ui/fix/SortModifiersCleanUp.java =================================================================== RCS file: ui/org/eclipse/jdt/internal/ui/fix/SortModifiersCleanUp.java diff -N ui/org/eclipse/jdt/internal/ui/fix/SortModifiersCleanUp.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ ui/org/eclipse/jdt/internal/ui/fix/SortModifiersCleanUp.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,92 @@ +/******************************************************************************* + * 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.SortModifiersFix; + +import org.eclipse.jdt.ui.cleanup.CleanUpContext; +import org.eclipse.jdt.ui.cleanup.CleanUpRequirements; +import org.eclipse.jdt.ui.cleanup.ICleanUpFix; + +public class SortModifiersCleanUp extends AbstractCleanUp { + + public SortModifiersCleanUp(Map options) { + super(options); + } + + public SortModifiersCleanUp() { + super(); + } + + /** + * {@inheritDoc} + */ + public CleanUpRequirements getRequirements() { + return new CleanUpRequirements(requireAST(), false, false, null); + } + + private boolean requireAST() { + return isEnabled(CleanUpConstants.VARIABLE_DECLARATIONS_SORT_MODIFIERS); + } + + /** + * {@inheritDoc} + */ + public ICleanUpFix createFix(CleanUpContext context) throws CoreException { + CompilationUnit compilationUnit= context.getAST(); + if (compilationUnit == null) + return null; + + boolean addFinal= isEnabled(CleanUpConstants.VARIABLE_DECLARATIONS_SORT_MODIFIERS); + if (!addFinal) + return null; + + return SortModifiersFix.createCleanUp(compilationUnit); + } + + /** + * {@inheritDoc} + */ + public String[] getStepDescriptions() { + List result= new ArrayList(); + return (String[])result.toArray(new String[result.size()]); + } + + /** + * {@inheritDoc} + */ + public String getPreview() { + StringBuffer buf= new StringBuffer(); + + if (isEnabled(CleanUpConstants.VARIABLE_DECLARATIONS_SORT_MODIFIERS)) { + buf.append("abstract public class A {\n"); //$NON-NLS-1$ + buf.append(" static public final int FIELD= 0;\n"); //$NON-NLS-1$ + buf.append(" final synchronized protected void foo() {}\n"); //$NON-NLS-1$ + } else { + buf.append("public abstract class A {\n"); //$NON-NLS-1$ + buf.append(" public static final int FIELD= 0;\n"); //$NON-NLS-1$ + 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/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 31 Jan 2011 18:44:07 -0000 @@ -53,6 +53,7 @@ public static String CodeStyleTabPage_CheckboxName_UseFinalForFields; public static String CodeStyleTabPage_CheckboxName_UseFinalForLocals; public static String CodeStyleTabPage_CheckboxName_UseFinalForParameters; + public static String CodeStyleTabPage_CheckboxName_SortModifiers; 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 31 Jan 2011 18:44:07 -0000 @@ -43,6 +43,7 @@ CodeStyleTabPage_GroupName_VariableDeclarations=Variable declarations CodeStyleTabPage_CheckboxName_UseFinalForFields=Private &fields CodeStyleTabPage_CheckboxName_UseFinalForLocals=&Local variables +CodeStyleTabPage_CheckboxName_SortModifiers=Sort modifiers 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 31 Jan 2011 18:44:07 -0000 @@ -21,6 +21,7 @@ import org.eclipse.jdt.internal.ui.fix.ControlStatementsCleanUp; import org.eclipse.jdt.internal.ui.fix.ConvertLoopCleanUp; import org.eclipse.jdt.internal.ui.fix.ExpressionsCleanUp; +import org.eclipse.jdt.internal.ui.fix.SortModifiersCleanUp; import org.eclipse.jdt.internal.ui.fix.VariableDeclarationCleanUp; public final class CodeStyleTabPage extends AbstractCleanUpTabPage { @@ -36,7 +37,8 @@ new ControlStatementsCleanUp(values), new ConvertLoopCleanUp(values), new ExpressionsCleanUp(values), - new VariableDeclarationCleanUp(values) + new VariableDeclarationCleanUp(values), + new SortModifiersCleanUp(values), }; } @@ -72,5 +74,8 @@ 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 sortModifiersPref= createCheckboxPref(variableGroup, numColumns, CleanUpMessages.CodeStyleTabPage_CheckboxName_SortModifiers, CleanUpConstants.VARIABLE_DECLARATIONS_SORT_MODIFIERS, CleanUpModifyDialog.FALSE_TRUE); + registerPreference(sortModifiersPref); } } 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.168 diff -u -r1.168 QuickAssistProcessor.java --- ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java 31 Jan 2011 17:50:44 -0000 1.168 +++ ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java 31 Jan 2011 18:44:08 -0000 @@ -116,6 +116,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.SortModifiersFix; import org.eclipse.jdt.internal.corext.fix.IProposableFix; import org.eclipse.jdt.internal.corext.fix.LinkedProposalModel; import org.eclipse.jdt.internal.corext.fix.VariableDeclarationFix; @@ -141,6 +142,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.SortModifiersCleanUp; 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; @@ -204,6 +206,7 @@ || getConvertIterableLoopProposal(context, coveringNode, null) || getRemoveBlockProposals(context, coveringNode, null) || getMakeVariableDeclarationFinalProposals(context, null) + || getSortModifiersProposals(context, null) || getMissingCaseStatementProposals(context, coveringNode, null) || getConvertStringConcatenationProposals(context, null); } @@ -242,6 +245,7 @@ getConvertIterableLoopProposal(context, coveringNode, resultingCollections); getRemoveBlockProposals(context, coveringNode, resultingCollections); getMakeVariableDeclarationFinalProposals(context, resultingCollections); + getSortModifiersProposals(context, resultingCollections); getConvertStringConcatenationProposals(context, resultingCollections); getMissingCaseStatementProposals(context, coveringNode, resultingCollections); } @@ -1913,6 +1917,29 @@ return true; } + private static boolean getSortModifiersProposals(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= SortModifiersFix.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_SORT_MODIFIERS, CleanUpOptions.TRUE); + SortModifiersCleanUp cleanUp= new SortModifiersCleanUp(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)) return false;