blob: dd17e02ffc58916d4d33a64123876a5a0dcf657a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2020 Martin Weber.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package org.eclipse.cdt.cmake.core.internal;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
/**
* Default implementation of {@code ICMakeExecutionMarkerFactory}.
*
* @author Martin Weber
*/
public class CMakeExecutionMarkerFactory implements ICMakeExecutionMarkerFactory {
private final IContainer srcFolder;
/**
* @param srcFolder
* source-folder ofthe project currently being build.
*
*/
public CMakeExecutionMarkerFactory(IContainer srcFolder) {
this.srcFolder = Objects.requireNonNull(srcFolder);
}
@Override
public final void createMarker(String message, int severity, String filePath,
Map<String, Object> mandatoryAttributes) throws CoreException {
IMarker marker;
if (filePath == null) {
marker = srcFolder.createMarker(CMAKE_PROBLEM_MARKER_ID);
} else {
// NOTE normally, cmake reports the file name relative to source root.
// BUT some messages give an absolute file-system path which is problematic when the build
// runs in a docker container
// So we do some heuristics here...
IPath path = new Path(filePath);
try {
// normal case: file is rel. to source root
marker = srcFolder.getFile(path).createMarker(CMAKE_PROBLEM_MARKER_ID);
} catch (CoreException ign) {
// try abs. path
IPath srcLocation = srcFolder.getLocation();
if (srcLocation.isPrefixOf(path)) {
// can resolve the cmake file
int segmentsToRemove = srcLocation.segmentCount();
path = path.removeFirstSegments(segmentsToRemove);
marker = srcFolder.getFile(path).createMarker(CMAKE_PROBLEM_MARKER_ID);
} else {
// possibly a build in docker container. we would reach this if the source-dir path inside
// the container is NOT the same as the one in the host/IDE.
// for now, just add the markers to the source dir and lets users file issues:-)
marker = srcFolder.createMarker(CMAKE_PROBLEM_MARKER_ID);
Activator.getPlugin().getLog().log(new Status(IStatus.INFO, Activator.getId(),
String.format(Messages.CMakeErrorParser_NotAWorkspaceResource, filePath)));
// Extra case: IDE runs on Linux, build runs on Windows, or vice versa...
}
}
}
marker.setAttribute(IMarker.MESSAGE, message);
marker.setAttribute(IMarker.SEVERITY, severity);
for (Entry<String, Object> elem : mandatoryAttributes.entrySet()) {
marker.setAttribute(elem.getKey(), elem.getValue());
}
}
}