| /******************************************************************************* |
| * Copyright (c) 2000, 2003 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Common Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/cpl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jdt.internal.ui.text.correction; |
| |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.HashSet; |
| |
| import org.eclipse.core.runtime.CoreException; |
| |
| import org.eclipse.jdt.core.IBuffer; |
| import org.eclipse.jdt.core.ICompilationUnit; |
| import org.eclipse.jdt.core.JavaModelException; |
| import org.eclipse.jdt.core.compiler.IProblem; |
| |
| import org.eclipse.jdt.ui.text.java.*; |
| import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal; |
| |
| /** |
| */ |
| public class QuickFixProcessor implements IQuickFixProcessor { |
| |
| public boolean hasCorrections(ICompilationUnit cu, int problemId) { |
| switch (problemId) { |
| case IProblem.UnterminatedString: |
| case IProblem.UnusedImport: |
| case IProblem.DuplicateImport: |
| case IProblem.CannotImportPackage: |
| case IProblem.ConflictingImport: |
| case IProblem.ImportNotFound: |
| case IProblem.UndefinedMethod: |
| case IProblem.UndefinedConstructor: |
| case IProblem.ParameterMismatch: |
| case IProblem.MethodButWithConstructorName: |
| case IProblem.UndefinedField: |
| case IProblem.UndefinedName: |
| case IProblem.PublicClassMustMatchFileName: |
| case IProblem.PackageIsNotExpectedPackage: |
| case IProblem.UndefinedType: |
| case IProblem.FieldTypeNotFound: |
| case IProblem.ArgumentTypeNotFound: |
| case IProblem.ReturnTypeNotFound: |
| case IProblem.SuperclassNotFound: |
| case IProblem.ExceptionTypeNotFound: |
| case IProblem.InterfaceNotFound: |
| case IProblem.TypeMismatch: |
| case IProblem.UnhandledException: |
| case IProblem.UnreachableCatch: |
| case IProblem.VoidMethodReturnsValue: |
| case IProblem.ShouldReturnValue: |
| case IProblem.MissingReturnType: |
| case IProblem.NonExternalizedStringLiteral: |
| case IProblem.NonStaticAccessToStaticField: |
| case IProblem.NonStaticAccessToStaticMethod: |
| case IProblem.StaticMethodRequested: |
| case IProblem.NonStaticFieldFromStaticInvocation: |
| case IProblem.InstanceMethodDuringConstructorInvocation: |
| case IProblem.InstanceFieldDuringConstructorInvocation: |
| case IProblem.NotVisibleMethod: |
| case IProblem.NotVisibleConstructor: |
| case IProblem.NotVisibleType: |
| case IProblem.SuperclassNotVisible: |
| case IProblem.InterfaceNotVisible: |
| case IProblem.FieldTypeNotVisible: |
| case IProblem.ArgumentTypeNotVisible: |
| case IProblem.ReturnTypeNotVisible: |
| case IProblem.ExceptionTypeNotVisible: |
| case IProblem.NotVisibleField: |
| case IProblem.ImportNotVisible: |
| case IProblem.BodyForAbstractMethod: |
| case IProblem.AbstractMethodInAbstractClass: |
| case IProblem.AbstractMethodMustBeImplemented: |
| case IProblem.BodyForNativeMethod: |
| case IProblem.OuterLocalMustBeFinal: |
| case IProblem.UninitializedLocalVariable: |
| case IProblem.UndefinedConstructorInDefaultConstructor: |
| case IProblem.UnhandledExceptionInDefaultConstructor: |
| case IProblem.NotVisibleConstructorInDefaultConstructor: |
| case IProblem.FieldTypeAmbiguous: |
| case IProblem.ArgumentTypeAmbiguous: |
| case IProblem.ExceptionTypeAmbiguous: |
| case IProblem.ReturnTypeAmbiguous: |
| case IProblem.SuperclassAmbiguous: |
| case IProblem.InterfaceAmbiguous: |
| case IProblem.AmbiguousType: |
| case IProblem.UnusedPrivateMethod: |
| case IProblem.UnusedPrivateConstructor: |
| case IProblem.UnusedPrivateField: |
| case IProblem.UnusedPrivateType: |
| case IProblem.LocalVariableIsNeverUsed: |
| case IProblem.ArgumentIsNeverUsed: |
| case IProblem.MethodRequiresBody: |
| case IProblem.NeedToEmulateFieldReadAccess: |
| case IProblem.NeedToEmulateFieldWriteAccess: |
| case IProblem.NeedToEmulateMethodAccess: |
| case IProblem.NeedToEmulateConstructorAccess: |
| case IProblem.SuperfluousSemicolon: |
| case IProblem.UnnecessaryCast: |
| case IProblem.UnnecessaryArgumentCast: |
| case IProblem.UnnecessaryInstanceof: |
| case IProblem.IndirectAccessToStaticField: |
| case IProblem.IndirectAccessToStaticMethod: |
| case IProblem.Task: |
| case IProblem.UnusedMethodDeclaredThrownException: |
| case IProblem.UnusedConstructorDeclaredThrownException: |
| case IProblem.UnqualifiedFieldAccess: |
| case IProblem.JavadocMissing: |
| case IProblem.JavadocMissingParamTag: |
| case IProblem.JavadocMissingReturnTag: |
| case IProblem.JavadocMissingThrowsTag: |
| return true; |
| default: |
| return false; |
| } |
| } |
| |
| private static int moveBack(int offset, int start, String ignoreCharacters, ICompilationUnit cu) { |
| try { |
| IBuffer buf= cu.getBuffer(); |
| while (offset >= start) { |
| if (ignoreCharacters.indexOf(buf.getChar(offset - 1)) == -1) { //$NON-NLS-1$ |
| return offset; |
| } |
| offset--; |
| } |
| } catch(JavaModelException e) { |
| } |
| return start; |
| } |
| |
| |
| /* (non-Javadoc) |
| * @see IAssistProcessor#getCorrections(org.eclipse.jdt.internal.ui.text.correction.IAssistContext, org.eclipse.jdt.internal.ui.text.correction.IProblemLocation[]) |
| */ |
| public IJavaCompletionProposal[] getCorrections(IInvocationContext context, IProblemLocation[] locations) throws CoreException { |
| if (locations == null || locations.length == 0) { |
| return null; |
| } |
| |
| HashSet handledProblems= new HashSet(locations.length); |
| ArrayList resultingCollections= new ArrayList(); |
| for (int i= 0; i < locations.length; i++) { |
| IProblemLocation curr= locations[i]; |
| Integer id= new Integer(curr.getProblemId()); |
| if (handledProblems.add(id)) { |
| process(context, curr, resultingCollections); |
| } |
| } |
| return (IJavaCompletionProposal[]) resultingCollections.toArray(new IJavaCompletionProposal[resultingCollections.size()]); |
| } |
| |
| private void process(IInvocationContext context, IProblemLocation problem, Collection proposals) throws CoreException { |
| int id= problem.getProblemId(); |
| if (id == 0) { // no proposals for none-problem locations |
| return; |
| } |
| |
| switch (id) { |
| case IProblem.UnterminatedString: |
| String quoteLabel= CorrectionMessages.getString("JavaCorrectionProcessor.addquote.description"); //$NON-NLS-1$ |
| int pos= moveBack(problem.getOffset() + problem.getLength(), problem.getOffset(), "\n\r", context.getCompilationUnit()); //$NON-NLS-1$ |
| proposals.add(new ReplaceCorrectionProposal(quoteLabel, context.getCompilationUnit(), pos, 0, "\"", 0)); //$NON-NLS-1$ |
| break; |
| case IProblem.UnusedImport: |
| case IProblem.DuplicateImport: |
| case IProblem.CannotImportPackage: |
| case IProblem.ConflictingImport: |
| case IProblem.ImportNotFound: |
| ReorgCorrectionsSubProcessor.removeImportStatementProposals(context, problem, proposals); |
| break; |
| case IProblem.UndefinedMethod: |
| UnresolvedElementsSubProcessor.getMethodProposals(context, problem, false, proposals); |
| break; |
| case IProblem.UndefinedConstructor: |
| UnresolvedElementsSubProcessor.getConstructorProposals(context, problem, proposals); |
| break; |
| case IProblem.ParameterMismatch: |
| UnresolvedElementsSubProcessor.getMethodProposals(context, problem, true, proposals); |
| break; |
| case IProblem.MethodButWithConstructorName: |
| ReturnTypeSubProcessor.addMethodWithConstrNameProposals(context, problem, proposals); |
| break; |
| case IProblem.UndefinedField: |
| case IProblem.UndefinedName: |
| UnresolvedElementsSubProcessor.getVariableProposals(context, problem, proposals); |
| break; |
| case IProblem.FieldTypeAmbiguous: |
| case IProblem.ArgumentTypeAmbiguous: |
| case IProblem.ExceptionTypeAmbiguous: |
| case IProblem.ReturnTypeAmbiguous: |
| case IProblem.SuperclassAmbiguous: |
| case IProblem.InterfaceAmbiguous: |
| case IProblem.AmbiguousType: |
| UnresolvedElementsSubProcessor.getAmbiguosTypeReferenceProposals(context, problem, proposals); |
| break; |
| case IProblem.PublicClassMustMatchFileName: |
| ReorgCorrectionsSubProcessor.getWrongTypeNameProposals(context, problem, proposals); |
| break; |
| case IProblem.PackageIsNotExpectedPackage: |
| ReorgCorrectionsSubProcessor.getWrongPackageDeclNameProposals(context, problem, proposals); |
| break; |
| case IProblem.UndefinedType: |
| case IProblem.FieldTypeNotFound: |
| case IProblem.ArgumentTypeNotFound: |
| case IProblem.ReturnTypeNotFound: |
| case IProblem.SuperclassNotFound: |
| case IProblem.ExceptionTypeNotFound: |
| case IProblem.InterfaceNotFound: |
| UnresolvedElementsSubProcessor.getTypeProposals(context, problem, proposals); |
| break; |
| case IProblem.TypeMismatch: |
| LocalCorrectionsSubProcessor.addCastProposals(context, problem, proposals); |
| break; |
| case IProblem.UnhandledException: |
| LocalCorrectionsSubProcessor.addUncaughtExceptionProposals(context, problem, proposals); |
| break; |
| case IProblem.UnreachableCatch: |
| LocalCorrectionsSubProcessor.addUnreachableCatchProposals(context, problem, proposals); |
| break; |
| case IProblem.VoidMethodReturnsValue: |
| ReturnTypeSubProcessor.addVoidMethodReturnsProposals(context, problem, proposals); |
| break; |
| case IProblem.MissingReturnType: |
| ReturnTypeSubProcessor.addMissingReturnTypeProposals(context, problem, proposals); |
| break; |
| case IProblem.ShouldReturnValue: |
| ReturnTypeSubProcessor.addMissingReturnStatementProposals(context, problem, proposals); |
| break; |
| case IProblem.NonExternalizedStringLiteral: |
| LocalCorrectionsSubProcessor.addNLSProposals(context, problem, proposals); |
| break; |
| case IProblem.NonStaticAccessToStaticField: |
| case IProblem.NonStaticAccessToStaticMethod: |
| case IProblem.IndirectAccessToStaticField: |
| case IProblem.IndirectAccessToStaticMethod: |
| LocalCorrectionsSubProcessor.addCorrectAccessToStaticProposals(context, problem, proposals); |
| break; |
| case IProblem.StaticMethodRequested: |
| case IProblem.NonStaticFieldFromStaticInvocation: |
| case IProblem.InstanceMethodDuringConstructorInvocation: |
| case IProblem.InstanceFieldDuringConstructorInvocation: |
| ModifierCorrectionSubProcessor.addNonAccessibleMemberProposal(context, problem, proposals, ModifierCorrectionSubProcessor.TO_STATIC, 5); |
| break; |
| case IProblem.NotVisibleMethod: |
| case IProblem.NotVisibleConstructor: |
| case IProblem.NotVisibleType: |
| case IProblem.SuperclassNotVisible: |
| case IProblem.InterfaceNotVisible: |
| case IProblem.FieldTypeNotVisible: |
| case IProblem.ArgumentTypeNotVisible: |
| case IProblem.ReturnTypeNotVisible: |
| case IProblem.ExceptionTypeNotVisible: |
| case IProblem.NotVisibleField: |
| case IProblem.ImportNotVisible: |
| ModifierCorrectionSubProcessor.addNonAccessibleMemberProposal(context, problem, proposals, ModifierCorrectionSubProcessor.TO_VISIBLE, 5); |
| break; |
| case IProblem.BodyForAbstractMethod: |
| case IProblem.AbstractMethodInAbstractClass: |
| ModifierCorrectionSubProcessor.addAbstractMethodProposals(context, problem, proposals); |
| break; |
| case IProblem.AbstractMethodMustBeImplemented: |
| LocalCorrectionsSubProcessor.addUnimplementedMethodsProposals(context, problem, proposals); |
| break; |
| case IProblem.BodyForNativeMethod: |
| ModifierCorrectionSubProcessor.addNativeMethodProposals(context, problem, proposals); |
| break; |
| case IProblem.MethodRequiresBody: |
| ModifierCorrectionSubProcessor.addMethodRequiresBodyProposals(context, problem, proposals); |
| break; |
| case IProblem.OuterLocalMustBeFinal: |
| ModifierCorrectionSubProcessor.addNonFinalLocalProposal(context, problem, proposals); |
| break; |
| case IProblem.UninitializedLocalVariable: |
| LocalCorrectionsSubProcessor.addUninitializedLocalVariableProposal(context, problem, proposals); |
| break; |
| case IProblem.UnhandledExceptionInDefaultConstructor: |
| case IProblem.UndefinedConstructorInDefaultConstructor: |
| case IProblem.NotVisibleConstructorInDefaultConstructor: |
| LocalCorrectionsSubProcessor.addConstructorFromSuperclassProposal(context, problem, proposals); |
| break; |
| case IProblem.UnusedPrivateMethod: |
| case IProblem.UnusedPrivateConstructor: |
| case IProblem.UnusedPrivateField: |
| case IProblem.UnusedPrivateType: |
| case IProblem.LocalVariableIsNeverUsed: |
| case IProblem.ArgumentIsNeverUsed: |
| LocalCorrectionsSubProcessor.addUnusedMemberProposal(context, problem, proposals); |
| break; |
| case IProblem.NeedToEmulateFieldReadAccess: |
| case IProblem.NeedToEmulateFieldWriteAccess: |
| case IProblem.NeedToEmulateMethodAccess: |
| case IProblem.NeedToEmulateConstructorAccess: |
| ModifierCorrectionSubProcessor.addNonAccessibleMemberProposal(context, problem, proposals, ModifierCorrectionSubProcessor.TO_NON_PRIVATE, 5); |
| break; |
| case IProblem.SuperfluousSemicolon: |
| LocalCorrectionsSubProcessor.addSuperfluousSemicolonProposal(context, problem, proposals); |
| break; |
| case IProblem.UnnecessaryCast: |
| case IProblem.UnnecessaryArgumentCast: |
| LocalCorrectionsSubProcessor.addUnnecessaryCastProposal(context, problem, proposals); |
| break; |
| case IProblem.UnnecessaryInstanceof: |
| LocalCorrectionsSubProcessor.addUnnecessaryInstanceofProposal(context, problem, proposals); |
| break; |
| case IProblem.UnusedMethodDeclaredThrownException: |
| case IProblem.UnusedConstructorDeclaredThrownException: |
| LocalCorrectionsSubProcessor.addUnnecessaryThrownExceptionProposal(context, problem, proposals); |
| break; |
| case IProblem.UnqualifiedFieldAccess: |
| LocalCorrectionsSubProcessor.addUnqualifiedFieldAccessProposal(context, problem, proposals); |
| break; |
| case IProblem.Task: |
| proposals.add(new TaskMarkerProposal(context.getCompilationUnit(), problem, 10)); |
| break; |
| case IProblem.JavadocMissing: |
| JavadocTagsSubProcessor.getMissingJavadocCommentProposals(context, problem, proposals); |
| break; |
| case IProblem.JavadocMissingParamTag: |
| case IProblem.JavadocMissingReturnTag: |
| case IProblem.JavadocMissingThrowsTag: |
| JavadocTagsSubProcessor.getMissingJavadocTagProposals(context, problem, proposals); |
| break; |
| default: |
| } |
| } |
| |
| |
| |
| } |