/*******************************************************************************
* Copyright (c) 2007, 2008 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.ui.text.java;
import org.eclipse.swt.graphics.Image;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaConventions;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.corext.refactoring.changes.ClasspathChange;
import org.eclipse.jdt.internal.ui.text.correction.ClasspathFixProcessorDescriptor;
/**
* Class to be implemented by contributors to the extension point
* <code>org.eclipse.jdt.ui.classpathFixProcessors</code>.
*
* @since 3.4
*/
public abstract class ClasspathFixProcessor {
/**
* A proposal to fix a class path issue.
*/
public static abstract class ClasspathFixProposal {
/**
* A helper method to create a {@link Change} that modifies a class path.
*
* @param project the project to change
* @param newClasspath the new class path
* @param outputLocation the new output location
*
* @return the {@link Change} to change the class path or <code>null</code> if the class path is
* not valid (See {@link JavaConventions#validateClasspath(IJavaProject, IClasspathEntry[], IPath)}).
*/
public static Change newClasspathChange(IJavaProject project, IClasspathEntry[] newClasspath, IPath outputLocation) {
return ClasspathChange.newChange(project, newClasspath, outputLocation);
}
/**
* A helper method to create a {@link Change} that adds an entry to the class path.
*
* @param project the project to change
* @param entryToAdd the entry to add to the class path
*
* @return the {@link Change} to change the class path or <code>null</code> if the class path is
* not valid (See {@link JavaConventions#validateClasspath(IJavaProject, IClasspathEntry[], IPath)}).
* @throws JavaModelException thrown if accessing the project failed.
*/
public static Change newAddClasspathChange(IJavaProject project, IClasspathEntry entryToAdd) throws JavaModelException {
return ClasspathChange.addEntryChange(project, entryToAdd);
}
/**
* Returns the change to invoke when the proposal is selected.
*
* @param monitor the progress monitor
* @return the change
* @throws CoreException thrown when the creation of the change failed
*/
public abstract Change createChange(IProgressMonitor monitor) throws CoreException;
/**
* Returns the string to be displayed in a list of proposals.
*
* @return the string to be displayed
*/
public abstract String getDisplayString();
/**
* Returns optional additional information about the proposal. The additional information will
* be presented to assist the user in deciding if the selected proposal is the desired choice.
*
* @return the additional information or <code>null</code>
*/
public abstract String getAdditionalProposalInfo();
/**
* Returns the image to be displayed in the list of completion proposals.
* The image would typically be shown to the left of the display string.
*
* @return the image to be shown or <code>null</code> if no image is desired
*/
public abstract Image getImage();
/**
* Returns the relevance of this completion proposal.
* <p>
* The relevance is used to determine if this proposal is more
* relevant than another proposal.</p>
*
* @return the relevance of this completion proposal in the range of [0, 100]
*/
public abstract int getRelevance();
}
/**
* Returns proposal that can fix non-resolvable imports. The proposal is expected to change the class path or a classpath container
* so that the missing type can be resolved. A proposal should also consider to fix related types. For example, when a reference to
* <code>junit.framework.TestCase</code> is requested, it makes sense to import the full JUnit library, not just fixing the missing type.
*
* @param project the current project
* @param name the missing type to be added to the class path. The entries can be either a
* <ul><li>qualified type name, like 'junit.framework.Test'</li>
* <li>simple type name, like 'TestCase'</li>
* <li>on demand import name, like 'org.junit.*'</li></ul>
* @return returns proposals to fix the class path so that the missing types are found. If no proposals can be offered,
* either <code>null</code> or the empty array can be returned. If <code>null</code> is returned, also the processors
* overridden by this processor are asked. If a non null result is returned, all overridden processors are skipped.
*
* @throws CoreException thrown when the creation of the proposals fails
*/
public abstract ClasspathFixProposal[] getFixImportProposals(IJavaProject project, String name) throws CoreException;
/**
* Evaluates all contributed proposals that can fix non-resolvable imports.
*
* @param project the current project
* @param name the missing type to be added to the class path. The entries can be either a
* <ul><li>qualified type name, like 'junit.framework.Test'</li>
* <li>simple type name, like 'TestCase'</li>
* <li>on demand import name, like 'org.junit.*'</li></ul>
* @param status a {@link MultiStatus} to collect the resulting status or <code>null</code> to not collect status.
* @return returns proposals to fix the class path so that the missing types are found.
*/
public static ClasspathFixProposal[] getContributedFixImportProposals(IJavaProject project, String name, MultiStatus status) {
return ClasspathFixProcessorDescriptor.getProposals(project, name, status);
}
}