### Eclipse Workspace Patch 1.0 #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.50 diff -u -r1.50 CleanUpTest.java --- ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest.java 22 Jun 2006 08:44:03 -0000 1.50 +++ ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest.java 3 Jul 2006 10:18:53 -0000 @@ -3023,6 +3023,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); @@ -3716,7 +3758,6 @@ assertRefactoringResultAsExpected(refactoring, new String[] {expected1}); } - public void testSerialVersion01() throws Exception { JavaProjectHelper.set14CompilerOptions(fJProject1); #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 3 Jul 2006 10:18:55 -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; @@ -393,7 +395,7 @@ if (!isNonStaticAccess(problem)) return null; - ToStaticAccessOperation operations[]= createNonStaticAccessResolveOperations(compilationUnit, problem); + ToStaticAccessOperation operations[]= createToStaticAccessOperations(compilationUnit, problem); if (operations == null) return null; @@ -424,7 +426,7 @@ if (!isIndirectStaticAccess(problem)) return null; - ToStaticAccessOperation operations[]= createNonStaticAccessResolveOperations(compilationUnit, problem); + ToStaticAccessOperation operations[]= createToStaticAccessOperations(compilationUnit, problem); if (operations == null) return null; @@ -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,25 +492,36 @@ } } + 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]; boolean isNonStaticAccess= changeNonStaticAccessToStatic && isNonStaticAccess(problem); boolean isIndirectStaticAccess= changeIndirectStaticAccessToDirect && isIndirectStaticAccess(problem); if (isNonStaticAccess || isIndirectStaticAccess) { - ToStaticAccessOperation[] nonStaticAccessInformation= createNonStaticAccessResolveOperations(compilationUnit, problem); + ToStaticAccessOperation[] nonStaticAccessInformation= createToStaticAccessOperations(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) { @@ -529,7 +534,7 @@ || problem.getProblemId() == IProblem.NonStaticAccessToStaticMethod); } - private static ToStaticAccessOperation[] createNonStaticAccessResolveOperations(CompilationUnit astRoot, IProblemLocation problem) { + private static ToStaticAccessOperation[] createToStaticAccessOperations(CompilationUnit astRoot, IProblemLocation problem) { ASTNode selectedNode= problem.getCoveringNode(astRoot); if (selectedNode == null) { return null;