package org.checkerframework.eclipse.actions;
import java.util.List;
import org.checkerframework.eclipse.CheckerPlugin;
import org.checkerframework.eclipse.prefs.CheckerPreferences;
import org.checkerframework.eclipse.util.MutexSchedulingRule;
import org.checkerframework.eclipse.util.PluginUtil;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jface.viewers.ISelection;
/** RunCheckerAction is an action handler that determines what */
//TODO: Rename to RunCheckerHandler
//TODO: Remove all subclasses and just parameterize RunCheckerAction (perhaps take a list of checkers,
//TODO: or if no checkers are specified use custom checkers)
public abstract class RunCheckerAction extends CheckerHandler {
private final String checkerName;
protected boolean usePrefs;
protected boolean useCustom;
protected boolean useSingleCustom;
protected boolean hasQuals;
/** true if this action is used from editor */
protected boolean usedInEditor;
protected RunCheckerAction() {
super();
this.checkerName = null;
this.usePrefs = true;
this.useCustom = false;
this.useSingleCustom = false;
this.hasQuals = true;
}
protected RunCheckerAction(String checkerName) {
this(checkerName, true);
}
protected RunCheckerAction(String checkerName, boolean hasQuals) {
super();
this.checkerName = checkerName;
this.useCustom = false;
this.usePrefs = false;
this.useSingleCustom = false;
this.hasQuals = hasQuals;
}
/**
* If constructed with a no-arg constructor, then we get the list of classes to use from the
* preferences system
*/
private List<String> getClassNameFromPrefs() {
return CheckerManager.getSelectedClasses();
}
/** */
public Object execute(ExecutionEvent event) {
ISelection selection = getSelection(event);
List<IJavaElement> elements = selectionToJavaElements(selection);
if (!elements.isEmpty()) {
Job checkerJob;
String customClasses =
CheckerPlugin.getDefault()
.getPreferenceStore()
.getString(CheckerPreferences.PREF_CHECKER_CUSTOM_CLASSES);
// Depending on how this runner was created, we will either:
// * just run one particular checker
// * use the custom configured checkers
// * run "selected" checkers using the action or auto build
final String actualNames;
if (!usePrefs && !useCustom && !useSingleCustom) {
actualNames = checkerName;
} else if (!usePrefs && !useSingleCustom) {
actualNames = customClasses;
} else if (useSingleCustom) {
actualNames = event.getParameter("checker-framework-eclipse-plugin.checker");
} else {
List<String> names = getClassNameFromPrefs();
actualNames = PluginUtil.join(",", names);
}
checkerJob = new CheckerWorker(elements, actualNames, hasQuals);
checkerJob.setUser(true);
checkerJob.setPriority(Job.BUILD);
checkerJob.setRule(new MutexSchedulingRule());
checkerJob.schedule();
}
return null;
}
}