### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.ui Index: core extension/org/eclipse/jdt/internal/corext/fix/CodeStyleFix.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/CodeStyleFix.java,v retrieving revision 1.31 diff -u -r1.31 CodeStyleFix.java --- core extension/org/eclipse/jdt/internal/corext/fix/CodeStyleFix.java 25 Apr 2006 15:19:54 -0000 1.31 +++ core extension/org/eclipse/jdt/internal/corext/fix/CodeStyleFix.java 14 Aug 2006 09:13:40 -0000 @@ -11,6 +11,8 @@ package org.eclipse.jdt.internal.corext.fix; import java.util.ArrayList; +import java.util.Hashtable; +import java.util.Iterator; import java.util.List; import org.eclipse.text.edits.TextEditGroup; @@ -451,20 +453,12 @@ compilationUnit.accept(codeStyleVisitor); } - if (changeNonStaticAccessToStatic || changeIndirectStaticAccessToDirect) { - IProblem[] problems= compilationUnit.getProblems(); - for (int i= 0; i < problems.length; i++) { - IProblemLocation problem= new ProblemLocation(problems[i]); - boolean isNonStaticAccess= changeNonStaticAccessToStatic && isNonStaticAccess(problem); - boolean isIndirectStaticAccess= changeIndirectStaticAccessToDirect && isIndirectStaticAccess(problem); - if (isNonStaticAccess || isIndirectStaticAccess) { - ToStaticAccessOperation[] nonStaticAccessInformation= createNonStaticAccessResolveOperations(compilationUnit, problem); - if (nonStaticAccessInformation != null) { - operations.add(nonStaticAccessInformation[0]); - } - } - } - } + IProblem[] problems= compilationUnit.getProblems(); + IProblemLocation[] locations= new IProblemLocation[problems.length]; + for (int i= 0; i < problems.length; i++) { + locations[i]= new ProblemLocation(problems[i]); + } + addToStaticAccessOperations(compilationUnit, locations, changeNonStaticAccessToStatic, changeIndirectStaticAccessToDirect, operations); if (removeFieldQualifier || removeMethodQualifier) { ThisQualifierVisitor visitor= new ThisQualifierVisitor(removeFieldQualifier, removeMethodQualifier, compilationUnit, operations); @@ -498,6 +492,17 @@ } } + addToStaticAccessOperations(compilationUnit, problems, changeNonStaticAccessToStatic, changeIndirectStaticAccessToDirect, operations); + + if (operations.isEmpty()) + return null; + + IFixRewriteOperation[] operationsArray= (IFixRewriteOperation[])operations.toArray(new IFixRewriteOperation[operations.size()]); + return new CodeStyleFix("", compilationUnit, operationsArray); //$NON-NLS-1$ + } + + private static void addToStaticAccessOperations(CompilationUnit compilationUnit, IProblemLocation[] problems, boolean changeNonStaticAccessToStatic, boolean changeIndirectStaticAccessToDirect, List result) { + Hashtable nonStaticAccessOps= new Hashtable(); if (changeNonStaticAccessToStatic || changeIndirectStaticAccessToDirect) { for (int i= 0; i < problems.length; i++) { IProblemLocation problem= problems[i]; @@ -506,17 +511,17 @@ if (isNonStaticAccess || isIndirectStaticAccess) { ToStaticAccessOperation[] nonStaticAccessInformation= createNonStaticAccessResolveOperations(compilationUnit, problem); if (nonStaticAccessInformation != null) { - operations.add(nonStaticAccessInformation[0]); + ToStaticAccessOperation op= nonStaticAccessInformation[0]; + nonStaticAccessOps.put(op.fQualifier, op); } } } } - - if (operations.isEmpty()) - return null; - - IFixRewriteOperation[] operationsArray= (IFixRewriteOperation[])operations.toArray(new IFixRewriteOperation[operations.size()]); - return new CodeStyleFix("", compilationUnit, operationsArray); //$NON-NLS-1$ + for (Iterator iter= nonStaticAccessOps.values().iterator(); iter.hasNext();) { + ToStaticAccessOperation op= (ToStaticAccessOperation)iter.next(); + if (!nonStaticAccessOps.containsKey(op.fQualifier.getParent())) + result.add(op); + } } private static boolean isIndirectStaticAccess(IProblemLocation problem) { #P org.eclipse.jdt.ui.tests Index: ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest.java,v retrieving revision 1.47 diff -u -r1.47 CleanUpTest.java --- ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest.java 5 May 2006 10:14:47 -0000 1.47 +++ ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest.java 14 Aug 2006 09:13:44 -0000 @@ -3224,6 +3224,48 @@ assertRefactoringResultAsExpected(refactoring, new String[] {expected1}); } + + public void testCodeStyle_Bug140565() throws Exception { + IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null); + StringBuffer buf= new StringBuffer(); + buf.append("package test1;\n"); + buf.append("import java.io.*;\n"); + buf.append("public class E1 {\n"); + buf.append(" static class ClassA {static ClassB B;}\n"); + buf.append(" static class ClassB {static ClassC C;}\n"); + buf.append(" static class ClassC {static ClassD D;}\n"); + buf.append(" static class ClassD {}\n"); + buf.append("\n"); + buf.append(" public void foo() {\n"); + buf.append(" ClassA.B.C.D.toString();\n"); + buf.append(" }\n"); + buf.append("}\n"); + ICompilationUnit cu1= pack1.createCompilationUnit("E1.java", buf.toString(), false, null); + + CleanUpRefactoring refactoring= new CleanUpRefactoring(); + refactoring.addCompilationUnit(cu1); + + ICleanUp cleanUp1= new CodeStyleCleanUp(CodeStyleCleanUp.CHANGE_NON_STATIC_ACCESS_TO_STATIC); + ICleanUp cleanUp2= new UnusedCodeCleanUp(UnusedCodeCleanUp.REMOVE_UNUSED_IMPORTS); + refactoring.addCleanUp(cleanUp1); + refactoring.addCleanUp(cleanUp2); + + buf= new StringBuffer(); + buf.append("package test1;\n"); + buf.append("public class E1 {\n"); + buf.append(" static class ClassA {static ClassB B;}\n"); + buf.append(" static class ClassB {static ClassC C;}\n"); + buf.append(" static class ClassC {static ClassD D;}\n"); + buf.append(" static class ClassD {}\n"); + buf.append("\n"); + buf.append(" public void foo() {\n"); + buf.append(" ClassB.C.D.toString();\n"); + buf.append(" }\n"); + buf.append("}\n"); + String expected1= buf.toString(); + + assertRefactoringResultAsExpected(refactoring, new String[] {expected1}); + } public void testJava50ForLoop01() throws Exception { IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);