package org.erlide.dialyzer.internal.builder; import java.lang.reflect.InvocationTargetException; import java.util.Map; import java.util.Set; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IncrementalProjectBuilder; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.osgi.util.NLS; import org.erlide.backend.BackendCore; import org.erlide.backend.api.IBackend; import org.erlide.dialyzer.builder.DialyzerMarkerUtils; import org.erlide.dialyzer.builder.DialyzerPreferences; import org.erlide.dialyzer.builder.DialyzerUtils; import org.erlide.dialyzer.builder.DialyzerUtils.DialyzerErrorException; import org.erlide.engine.ErlangEngine; import org.erlide.engine.model.root.IErlElementLocator; import org.erlide.engine.model.root.IErlModule; import org.erlide.engine.model.root.IErlProject; import org.erlide.util.ErlLogger; import com.google.common.collect.Sets; public class DialyzerBuilder extends IncrementalProjectBuilder { public static final String BUILDER_ID = "org.erlide.core.builder.dialyzer"; // private static final BuilderHelper helper = new BuilderHelper(); @Override protected IProject[] build(final int kind, @SuppressWarnings("rawtypes") final Map args, final IProgressMonitor monitor) throws CoreException { final IProject project = getProject(); if (project == null) { monitor.done(); return null; } DialyzerPreferences prefs = null; prefs = DialyzerPreferences.get(project); if (prefs == null || !prefs.getDialyzeOnCompile()) { return null; } final IErlElementLocator model = ErlangEngine.getInstance().getModel(); final Set<IErlModule> modules = DialyzerUtils.collectModulesFromResource(model, project); final Set<IErlProject> projects = Sets.newHashSet(); projects.add(model.findProject(project)); if (!modules.isEmpty()) { try { final IErlProject eproject = model.findProject(project); if (eproject == null) { return null; } final IBackend backend = BackendCore.getBackendManager() .getBuildBackend(eproject); DialyzerUtils.doDialyze(monitor, modules, projects, backend); } catch (final InvocationTargetException e) { ErlLogger.error(e); } catch (final DialyzerErrorException e) { ErlLogger.error(e); final String msg = NLS.bind(BuilderMessages.build_dialyzerProblem, e.getLocalizedMessage()); DialyzerMarkerUtils.addProblemMarker(project, null, null, msg, 0, IMarker.SEVERITY_ERROR); } } monitor.done(); return null; } @Override protected void clean(final IProgressMonitor monitor) throws CoreException { final IProject project = getProject(); if (project == null || !project.isAccessible()) { return; } DialyzerMarkerUtils.removeDialyzerMarkersFor(project); } }