Index: CorrectionMessages.properties =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.properties,v retrieving revision 1.14 diff -u -r1.14 CorrectionMessages.properties --- CorrectionMessages.properties 13 Aug 2002 10:19:38 -0000 1.14 +++ CorrectionMessages.properties 20 Aug 2002 03:25:46 -0000 @@ -31,7 +31,7 @@ LocalCorrectionsSubProcessor.missingreturntype.description=Set return type to ''{0}'' LocalCorrectionsSubProcessor.externalizestrings.description=Externalize Strings LocalCorrectionsSubProcessor.externalizestrings.dialog.title=Externalize Strings - +LocalCorrectionsSubProcessor.changeaccesstostatic.description=Change access to static UnresolvedElementsSubProcessor.changemethod.description=Change to ''{0}(..)'' UnresolvedElementsSubProcessor.createmethod.description=Create method ''{0}(..)'' Index: JavaCorrectionProcessor.java =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/JavaCorrectionProcessor.java,v retrieving revision 1.36 diff -u -r1.36 JavaCorrectionProcessor.java --- JavaCorrectionProcessor.java 23 Jul 2002 13:17:28 -0000 1.36 +++ JavaCorrectionProcessor.java 20 Aug 2002 03:25:46 -0000 @@ -206,8 +206,12 @@ case IProblem.NonExternalizedStringLiteral: LocalCorrectionsSubProcessor.addNLSProposals(problemPos, proposals); break; + case IProblem.NonStaticAccessToStaticField: + case IProblem.NonStaticAccessToStaticMethod: + LocalCorrectionsSubProcessor.addAccessToStaticProposals(problemPos, proposals); + break; default: - proposals.add(new NoCorrectionProposal(problemPos)); + proposals.add(new NoCorrectionProposal(problemPos)); } } catch (CoreException e) { JavaPlugin.log(e); Index: LocalCorrectionsSubProcessor.java =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/LocalCorrectionsSubProcessor.java,v retrieving revision 1.16 diff -u -r1.16 LocalCorrectionsSubProcessor.java --- LocalCorrectionsSubProcessor.java 12 Aug 2002 10:19:36 -0000 1.16 +++ LocalCorrectionsSubProcessor.java 20 Aug 2002 03:25:46 -0000 @@ -1,6 +1,7 @@ package org.eclipse.jdt.internal.ui.text.correction; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import org.eclipse.core.runtime.CoreException; @@ -22,12 +23,17 @@ import org.eclipse.jdt.core.dom.BodyDeclaration; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.Expression; +import org.eclipse.jdt.core.dom.FieldAccess; import org.eclipse.jdt.core.dom.FieldDeclaration; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.MethodDeclaration; +import org.eclipse.jdt.core.dom.MethodInvocation; +import org.eclipse.jdt.core.dom.Name; +import org.eclipse.jdt.core.dom.QualifiedName; import org.eclipse.jdt.core.dom.ReturnStatement; import org.eclipse.jdt.core.dom.SimpleName; import org.eclipse.jdt.core.dom.Statement; +import org.eclipse.jdt.core.dom.ThisExpression; import org.eclipse.jdt.core.dom.Type; import org.eclipse.jdt.core.dom.VariableDeclarationFragment; import org.eclipse.jdt.core.dom.VariableDeclarationStatement; @@ -35,7 +41,9 @@ import org.eclipse.jdt.internal.corext.codemanipulation.CodeGenerationSettings; import org.eclipse.jdt.internal.corext.codemanipulation.ImportEdit; import org.eclipse.jdt.internal.corext.codemanipulation.StubUtility; +import org.eclipse.jdt.internal.corext.dom.ASTNodes; import org.eclipse.jdt.internal.corext.dom.ASTRewriteAnalyzer; +import org.eclipse.jdt.internal.corext.dom.Bindings; import org.eclipse.jdt.internal.corext.dom.GenericVisitor; import org.eclipse.jdt.internal.corext.refactoring.changes.CompilationUnitChange; import org.eclipse.jdt.internal.corext.refactoring.nls.NLSRefactoring; @@ -88,10 +96,7 @@ String label= CorrectionMessages.getFormattedString("LocalCorrectionsSubProcessor.addcast.description", castDestType); //$NON-NLS-1$ InsertCorrectionProposal proposal= new InsertCorrectionProposal(label, cu, pos, cast, 1); - CodeGenerationSettings settings= JavaPreferencesSettings.getCodeGenerationSettings(); - ImportEdit edit= new ImportEdit(cu, settings); - edit.addImport(castDestType); - proposal.getCompilationUnitChange().addTextEdit("import", edit); //$NON-NLS-1$ + addImportToProposal(cu, castDestType, proposal); proposals.add(proposal); @@ -116,9 +121,8 @@ label= CorrectionMessages.getFormattedString("LocalCorrectionsSubProcessor.addcast_var.description", simpleCastType); //$NON-NLS-1$ ReplaceCorrectionProposal varProposal= new ReplaceCorrectionProposal(label, cu, type.getStartPosition(), type.getLength(), simpleCastType, 1); - edit= new ImportEdit(cu, settings); - edit.addImport(castType); - varProposal.getCompilationUnitChange().addTextEdit("import", edit); //$NON-NLS-1$ + + addImportToProposal(cu, castType, varProposal); proposals.add(varProposal); } @@ -164,10 +168,8 @@ Image image= JavaPluginImages.get(JavaPluginImages.IMG_OBJS_EXCEPTION); ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal(label, cu, astRoot, 0, image); - ImportEdit edit= new ImportEdit(cu, JavaPreferencesSettings.getCodeGenerationSettings()); - edit.addImport(uncaughtName); - proposal.getCompilationUnitChange().addTextEdit("import", edit); //$NON-NLS-1$ - + addImportToProposal(cu, uncaughtName, proposal); + proposals.add(proposal); } } @@ -256,10 +258,7 @@ String label= CorrectionMessages.getFormattedString("LocalCorrectionsSubProcessor.missingreturntype.description", type.getName()); //$NON-NLS-1$ InsertCorrectionProposal proposal= new InsertCorrectionProposal(label, cu, pos, str, 1); - CodeGenerationSettings settings= JavaPreferencesSettings.getCodeGenerationSettings(); - ImportEdit edit= new ImportEdit(problemPos.getCompilationUnit(), settings); - edit.addImport(type.getName()); - proposal.getCompilationUnitChange().addTextEdit("import", edit); //$NON-NLS-1$ + addImportToProposal(problemPos.getCompilationUnit(), type, proposal); proposals.add(proposal); } @@ -334,6 +333,60 @@ proposals.add(proposal); } + /** + * A static field or method is accessed using a non-static reference. E.g. + *
+     * File f = new File();
+     * f.pathSeparator;
+     * 
+ * This correction changes f above to File. + * + * @param problemPos + * @param proposals + */ + public static void addAccessToStaticProposals(ProblemPosition problemPos, List proposals) throws CoreException { + ICompilationUnit cu= problemPos.getCompilationUnit(); + + CompilationUnit astRoot= AST.parseCompilationUnit(cu, true); + ASTNode selectedNode= ASTResolving.findSelectedNode(astRoot, problemPos.getOffset(), problemPos.getLength()); + + if (selectedNode != null) { + Name qualifier= getQualifier(selectedNode); + + if (qualifier != null) { + ITypeBinding type= qualifier.resolveTypeBinding(); + + String label= CorrectionMessages.getString("LocalCorrectionsSubProcessor.changeaccesstostatic.description"); + ReplaceCorrectionProposal proposal= new ReplaceCorrectionProposal(label, cu, qualifier.getStartPosition(), qualifier.getLength(), type.getName(), 0); + + addImportToProposal(cu, type, proposal); + + proposals.add(proposal); + } + } + } + private static void addImportToProposal(ICompilationUnit cu, ITypeBinding type, CUCorrectionProposal proposal) throws CoreException { + addImportToProposal(cu, Bindings.getFullyQualifiedImportName(type), proposal); + } + + private static void addImportToProposal(ICompilationUnit cu, String typeName, CUCorrectionProposal proposal) throws CoreException { + ImportEdit edit= new ImportEdit(cu, JavaPreferencesSettings.getCodeGenerationSettings()); + edit.addImport(typeName); + proposal.getCompilationUnitChange().addTextEdit("import", edit); //$NON-NLS-1$ + } + + private static Name getQualifier(ASTNode node) { + if (node instanceof QualifiedName) { + QualifiedName qn= (QualifiedName) node; + return qn.getQualifier(); + } else if (node instanceof MethodInvocation) { + MethodInvocation mi= (MethodInvocation) node; + if (mi.getExpression() instanceof Name) { + return (Name) mi.getExpression(); + } + } + return null; + } }