/******************************************************************************* * Copyright (c) 2017 Alex Xu 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: * Alex Xu - initial API and implementation *******************************************************************************/ package org.eclipse.php.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.dltk.compiler.problem.IProblemIdentifier; import org.eclipse.dltk.core.ISourceModule; import org.eclipse.dltk.ui.text.completion.IScriptCompletionProposal; import org.eclipse.php.internal.core.compiler.ast.parser.PHPProblemIdentifier; import org.eclipse.php.internal.ui.text.correction.proposals.AbstractCorrectionProposal; import org.eclipse.php.ui.text.correction.IInvocationContext; import org.eclipse.php.ui.text.correction.IProblemLocation; import org.eclipse.php.ui.text.correction.IQuickFixProcessor; public class QuickFixProcessor implements IQuickFixProcessor { @Override public IScriptCompletionProposal[] getCorrections(IInvocationContext context, IProblemLocation[] locations) throws CoreException { if (locations == null || locations.length == 0) { return null; } HashSet<IProblemIdentifier> handledProblems = new HashSet<>(locations.length); ArrayList<AbstractCorrectionProposal> resultingCollections = new ArrayList<>(); for (int i = 0; i < locations.length; i++) { IProblemLocation curr = locations[i]; IProblemIdentifier id = curr.getProblemIdentifier(); if (handledProblems.add(id)) { process(context, curr, resultingCollections); } } return (IScriptCompletionProposal[]) resultingCollections .toArray(new IScriptCompletionProposal[resultingCollections.size()]); } private void process(IInvocationContext context, IProblemLocation problem, Collection<AbstractCorrectionProposal> proposals) throws CoreException { if (!(problem.getProblemIdentifier() instanceof PHPProblemIdentifier)) return; PHPProblemIdentifier id = (PHPProblemIdentifier) problem.getProblemIdentifier(); switch (id) { case UnusedImport: case DuplicateImport: case UnnecessaryImport: ReorgCorrectionsSubProcessor.removeImportStatementProposals(context, problem, proposals); break; case ImportNotFound: ReorgCorrectionsSubProcessor.removeImportStatementProposals(context, problem, proposals); break; case ClassExtendFinalClass: ModifierCorrectionSubProcessor.addNonAccessibleReferenceProposal(context, problem, proposals, ModifierCorrectionSubProcessor.TO_NON_FINAL, IProposalRelevance.REMOVE_FINAL_MODIFIER); break; case AbstractMethodInAbstractClass: case BodyForAbstractMethod: ModifierCorrectionSubProcessor.addAbstractMethodProposals(context, problem, proposals); break; case AbstractMethodsInConcreteClass: ModifierCorrectionSubProcessor.addAbstractTypeProposals(context, problem, proposals); break; case MethodRequiresBody: ModifierCorrectionSubProcessor.addMethodRequiresBodyProposals(context, problem, proposals); break; case UndefinedType: UnresolvedElementsSubProcessor.getTypeProposals(context, problem, proposals); break; case AbstractMethodMustBeImplemented: LocalCorrectionsSubProcessor.addUnimplementedMethodsProposals(context, problem, proposals); break; case SuperclassMustBeAClass: LocalCorrectionsSubProcessor.getInterfaceExtendsClassProposals(context, problem, proposals); break; default: return; } } @Override public boolean hasCorrections(ISourceModule unit, IProblemIdentifier identifier) { if (!(identifier instanceof PHPProblemIdentifier)) return false; PHPProblemIdentifier problem = (PHPProblemIdentifier) identifier; switch (problem) { case AbstractMethodInAbstractClass: case AbstractMethodsInConcreteClass: case BodyForAbstractMethod: case MethodRequiresBody: case AbstractMethodMustBeImplemented: case ClassExtendFinalClass: case DuplicateImport: case ImportNotFound: case SuperclassMustBeAClass: case UndefinedType: case UnnecessaryImport: case UnusedImport: return true; default: break; } return false; } }