/* * <copyright> * * Copyright (c) 2005-2006 Sven Efftinge 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: * Sven Efftinge - Initial API and implementation * * </copyright> */ package org.eclipse.gmf.internal.xpand.util; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.gmf.internal.xpand.build.OawBuilder; import org.eclipse.gmf.internal.xpand.expression.AnalysationIssue; import org.eclipse.gmf.internal.xpand.migration.Activator; import org.eclipse.gmf.internal.xpand.util.ParserException.ErrorLocationInfo; /** * FIXME fix syntax elements to keep not (only) line-relative column info, but buffer-related - otherwise * it makes no much sense for us to show markers */ public class OawMarkerManager { public static void addMarkers(final IFile file, AnalysationIssue... issues) { MarkerData[] data = new MarkerData[issues.length]; int i = 0; for (AnalysationIssue issue : issues) { data[i++] = createMarkerData(issue); } internalAddMarker(file, data); } public static void addMarkers(IFile file, ErrorLocationInfo... issues) { MarkerData[] data = new MarkerData[issues.length]; int i = 0; for (ErrorLocationInfo issue : issues) { int start = issue.startLine == issue.endLine ? issue.startColumn : -1; int end = issue.startLine == issue.endLine ? issue.endColumn : -1; data[i++] = new MarkerData(issue.message, IMarker.SEVERITY_ERROR, start, end, issue.startLine); } internalAddMarker(file, data); } public static void addErrorMarker(final IFile file, final String message, final int start, final int end) { internalAddMarker(file, new MarkerData(message, IMarker.SEVERITY_ERROR, start, end)); } private static MarkerData createMarkerData(AnalysationIssue issue) { int start = -1, end = -1, line = -1; if (issue.getElement() != null) { start = issue.getElement().getStart() - 1; end = issue.getElement().getEnd() - 1; line = issue.getElement().getLine(); } int severity = issue.isWarningNotError() ? IMarker.SEVERITY_WARNING : IMarker.SEVERITY_ERROR; return new MarkerData(issue.getMessage(), severity, start, end, line); } private static class MarkerData { final String message; final int severity; final int start; final int end; final int line; MarkerData(String message, int severity, int start, int end) { this(message, severity, start, end, -1); } MarkerData(String message, int severity, int start, int end, int line) { this.message = message; this.severity = severity; this.start = start; this.end = end; this.line = line; } } private static final String getMARKER_TYPE() { return OawBuilder.LEGACY_XPAND_PLUGIN_ID + ".problem"; } private final static void internalAddMarker(final IFile file, final MarkerData... markerData) { try { file.getWorkspace().run(new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { for (MarkerData d : markerData) { createMarker(d); } } private void createMarker(MarkerData data) throws CoreException { final IMarker marker = file.createMarker(getMARKER_TYPE()); marker.setAttribute(IMarker.MESSAGE, data.message); marker.setAttribute(IMarker.SEVERITY, data.severity); if (data.line != -1) { marker.setAttribute(IMarker.LINE_NUMBER, data.line); marker.setAttribute(IMarker.LOCATION, toLocationString(data)); } else { // "else" clause here because in case we possess line number info, most probably // start and end are relative to that line, and are not file buffer positions (as it seems to be assumed by CHAR_START|END). if (data.start != -1 && data.end != -1) { marker.setAttribute(IMarker.CHAR_START, data.start); marker.setAttribute(IMarker.CHAR_END, data.end); marker.setAttribute(IMarker.LOCATION, toLocationString(data)); } } } private String toLocationString(MarkerData data) { StringBuilder sb = new StringBuilder(); if (data.line != -1) { sb.append("line: "); sb.append(data.line); } if (data.start != -1 && data.end != -1) { boolean theOnlyData = sb.length() == 0; if (!theOnlyData) { sb.append(" ("); } sb.append(data.start); sb.append(" .. "); sb.append(data.end); if (!theOnlyData) { sb.append(")"); } } return sb.toString(); } }, file.getWorkspace().getRuleFactory().markerRule(file), 0, new NullProgressMonitor()); } catch (final CoreException e) { Activator.log(e.getStatus()); } } public static void deleteMarkers(final IResource file) { try { if (!file.exists()) { return; } file.getWorkspace().run(new IWorkspaceRunnable() { public void run(final IProgressMonitor monitor) throws CoreException { file.deleteMarkers(getMARKER_TYPE(), true, IResource.DEPTH_INFINITE); } }, file.getWorkspace().getRuleFactory().markerRule(file), 0, new NullProgressMonitor()); } catch (CoreException ce) { Activator.log(ce.getStatus()); } } }