package org.rascalmpl.eclipse.editor;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.resources.IMarker;
import io.usethesource.vallang.IConstructor;
import io.usethesource.vallang.ISet;
import io.usethesource.vallang.ISourceLocation;
import io.usethesource.vallang.IString;
import io.usethesource.vallang.IValue;
import io.usethesource.vallang.type.Type;
import org.rascalmpl.values.uptr.ITree;
import org.rascalmpl.values.uptr.TreeAdapter;
import io.usethesource.impulse.parser.IMessageHandler;
import io.usethesource.impulse.parser.IModelListener;
public class MessagesTo {
MessagesTo(int defaultSeverity,Map<String,Integer> severityMap){
this.severityMap = severityMap;
this.defaultSeverity = defaultSeverity;
}
private Map<String,Integer> severityMap;
private int defaultSeverity;
public void process(final ITree parseTree, IMessageHandler handler) {
if (parseTree != null) {
processMarkers(parseTree, handler);
}
}
private void processMarkers(ITree tree, IMessageHandler handler) {
if (TreeAdapter.isAppl(tree) && !TreeAdapter.isLexical(tree)) {
IValue anno = tree.asAnnotatable().getAnnotation("message");
if (anno != null && anno.getType().isAbstractData() && anno.getType().getName().equals("Message")) {
IConstructor message = (IConstructor) anno;
ISourceLocation loc = TreeAdapter.getLocation(tree);
processMessage(message, loc, handler);
}
anno = tree.asAnnotatable().getAnnotation("messages");
if (anno != null && anno.getType().isSet()) {
process((ISourceLocation) tree.asAnnotatable().getAnnotation("loc"), (ISet) anno, handler);
return; // we do not recurse if we found messages (for efficiency)
}
for (IValue child : TreeAdapter.getArgs(tree)) {
processMarkers((ITree) child, handler);
}
}
else if (TreeAdapter.isAmb(tree)) {
for (IValue alt : TreeAdapter.getAlternatives(tree)) {
processMarkers((ITree) alt, handler);
}
}
}
public void process(ISourceLocation treeLoc, ISet set, IMessageHandler handler) {
Type elemType = set.getType().getElementType();
if (elemType.isAbstractData() && elemType.getName().equals("Message")) {
for (IValue messagev : ((ISet) set)) {
IConstructor message = (IConstructor)messagev;
ISourceLocation loc = (ISourceLocation) message.get(1);
if (loc.getPath().equals(treeLoc.getPath()))
processMessage(message, loc, handler);
}
}
}
private void processMessage(IConstructor marker, ISourceLocation loc, IMessageHandler handler) {
int severity;
if(severityMap.containsKey(marker.getName())){
severity = severityMap.get(marker.getName());
} else {
severity = defaultSeverity;
}
String msg = ((IString) marker.get(0)).getValue();
Map<String,Object> attrs = new HashMap<String,Object>();
attrs.put(IMarker.SEVERITY, severity);
attrs.put(IMarker.PRIORITY, IMarker.PRIORITY_HIGH);
handler.handleSimpleMessage(msg, loc.getOffset(), loc.getOffset() + loc.getLength(), loc.getBeginColumn(), loc.getEndColumn(), loc.getBeginLine(), loc.getEndLine(), attrs);
}
public int compareTo(IModelListener o) {
return 0;
}
}