/*******************************************************************************
* Copyright (c) 2000, 2010 QNX Software Systems 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:
* QNX Software Systems - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.make.internal.core.makefile.gnu;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.cdt.core.model.ICModelMarker;
import org.eclipse.cdt.core.resources.ACBuilder;
import org.eclipse.cdt.make.core.makefile.IMakefileValidator;
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.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Path;
public class GNUMakefileChecker extends ACBuilder {
public class MyResourceDeltaVisitor implements IResourceDeltaVisitor {
IProgressMonitor monitor;
public MyResourceDeltaVisitor(IProgressMonitor monitor) {
this.monitor = monitor;
}
public boolean visit(IResourceDelta delta) throws CoreException {
IResource resource = delta.getResource();
if (resource != null && resource.getProject() == getProject()) {
if (resource instanceof IFile) {
// see if this a makefile candidate
IFile candidate = (IFile) resource;
if (isMakefileCandidate(candidate)) {
// ok verify.
if (delta.getKind() != IResourceDelta.REMOVED) {
checkMakefile(candidate, monitor);
}
}
}
}
return true;
}
}
protected Map<IProject, IMakefileValidator> validatorMap = new HashMap<IProject, IMakefileValidator>();
public GNUMakefileChecker() {
}
/**
* @see IncrementalProjectBuilder#build
*/
@Override
protected IProject[] build(int kind, @SuppressWarnings("rawtypes") Map args, IProgressMonitor monitor) throws CoreException {
if (DEBUG_EVENTS) {
@SuppressWarnings("unchecked")
Map<String, String> pargs = args;
printEvent(kind, pargs);
}
IResourceDelta delta = null;
// For non-full-build fetch the deltas
if (kind != FULL_BUILD) {
delta = getDelta(getProject());
}
if (delta == null || kind == FULL_BUILD) {
// Full build
checkProject(getProject(), monitor);
} else {
MyResourceDeltaVisitor vis = new MyResourceDeltaVisitor(monitor);
delta.accept(vis);
}
checkCancel(monitor);
return new IProject[0];
}
/**
* Check whether the build has been canceled.
*/
public void checkCancel(IProgressMonitor monitor) {
if (monitor != null && monitor.isCanceled()) {
throw new OperationCanceledException();
}
}
protected void checkProject(IProject project, IProgressMonitor monitor) {
IFile[] files = getCandidateMakefiles(project);
for (int i = 0; i < files.length; i++) {
checkMakefile(files[i], monitor);
}
}
protected boolean isMakefileCandidate(IFile file) {
IFile[] files = getCandidateMakefiles(file.getProject());
for (int i = 0; i < files.length; i++) {
if (files[i].getFullPath().equals(file.getFullPath())) {
return true;
}
}
return false;
}
protected void checkMakefile(IFile file, IProgressMonitor monitor) {
IMakefileValidator validator = getMakefileValidator(file);
try {
removeAllMarkers(file);
} catch (CoreException e) {
//e.printStackTrace();
}
validator.checkFile(file, monitor);
}
protected IFile[] getCandidateMakefiles(IProject proj) {
// FIXME: Find the candidate in the store somewhere.
IFile defaultMakefile = proj.getFile(new Path("Makefile")); //$NON-NLS-1$
if (defaultMakefile.exists()) {
return new IFile[] {defaultMakefile};
}
return new IFile[0];
}
protected IMakefileValidator getMakefileValidator(IFile file) {
IMakefileValidator validator = validatorMap.get(file.getProject());
if (validator == null) {
// FIXME: look int the preference store for a value.
validator = new GNUMakefileValidator();
validator.setMarkerGenerator(this);
validatorMap.put(file.getProject(), validator);
}
return validator;
}
private void removeAllMarkers(IFile file) throws CoreException {
IWorkspace workspace = file.getWorkspace();
// remove all markers
IMarker[] markers = file.findMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, true, IResource.DEPTH_INFINITE);
if (markers != null) {
workspace.deleteMarkers(markers);
}
}
}