package org.eclipse.dltk.tcl.internal.ui.text;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.dltk.compiler.problem.DefaultProblemIdentifier;
import org.eclipse.dltk.compiler.problem.IProblemIdentifier;
import org.eclipse.dltk.core.CorrectionEngine;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.IScriptProject;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.tcl.core.TclPackagesManager;
import org.eclipse.dltk.tcl.core.TclProblems;
import org.eclipse.dltk.tcl.internal.core.packages.TclVariableResolver;
import org.eclipse.dltk.ui.text.ScriptMarkerResoltionUtils;
import org.eclipse.ui.IMarkerResolution;
import org.eclipse.ui.IMarkerResolutionGenerator;
public class TclRequireMarkerResolutionGenerator
implements IMarkerResolutionGenerator {
@Override
public IMarkerResolution[] getResolutions(IMarker marker) {
if (TclSourcePackageCorrectionProcessor.isFixable(marker)) {
IProblemIdentifier idValue = DefaultProblemIdentifier
.getProblemId(marker);
if (idValue == TclProblems.UNKNOWN_REQUIRED_PACKAGE) {
String pkgName = CorrectionEngine
.getProblemArguments(marker)[0];
if (pkgName != null) {
IProject project = marker.getResource().getProject();
IScriptProject scriptProject = DLTKCore.create(project);
return new IMarkerResolution[] {
new TclRequirePackageMarkerResolution(pkgName,
scriptProject) };
}
} else if (idValue == TclProblems.UNKNOWN_SOURCE_CORRECTION) {
String pkgName = CorrectionEngine
.getProblemArguments(marker)[0];
if (pkgName != null) {
IProject project = marker.getResource().getProject();
IScriptProject scriptProject = DLTKCore.create(project);
IResource resource = marker.getResource();
if (resource.getType() == IResource.FILE) {
ISourceModule file = (ISourceModule) DLTKCore
.create(resource);
List<IMarkerResolution> resolutions = new ArrayList<>();
resolutions.add(new TclSourceCorrectionMarkerResolution(
pkgName, scriptProject, file));
addGlobalVariableCorrections(pkgName, project,
scriptProject, resolutions);
return resolutions.toArray(
new IMarkerResolution[resolutions.size()]);
}
}
} else if (idValue == TclProblems.UNKNOWN_REQUIRED_PACKAGE_CORRECTION) {
String pkgName = CorrectionEngine
.getProblemArguments(marker)[0];
if (pkgName != null) {
final IResource resource = marker.getResource();
if (resource.getType() == IResource.FILE) {
ISourceModule module = (ISourceModule) DLTKCore
.create((IFile) resource);
IProject project = resource.getProject();
IScriptProject scriptProject = DLTKCore.create(project);
List<IMarkerResolution> resolutions = new ArrayList<>();
resolutions.add(
new TclRequirePackageCorrectionMarkerResolution(
pkgName, scriptProject, module));
addGlobalVariableCorrections(pkgName, project,
scriptProject, resolutions);
return resolutions.toArray(
new IMarkerResolution[resolutions.size()]);
}
}
}
}
return ScriptMarkerResoltionUtils.NO_RESOLUTIONS;
}
private void addGlobalVariableCorrections(String pkgName, IProject project,
IScriptProject scriptProject, List<IMarkerResolution> resolutions) {
String[] names = TclVariableResolver.extractVariableNames(pkgName);
Map<String, String> eMap = TclPackagesManager
.getVariables(project.getName());
if (names != null) {
for (String var : names) {
if (!eMap.containsKey(var)) {
resolutions.add(
new TclGlobalVariableSourceCorrectionMarkerResolution(
var, scriptProject));
}
}
}
}
}