/******************************************************************************* * Copyright (c) 2005 - 2007 committers of openArchitectureWare 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: * committers of openArchitectureWare - initial API and implementation *******************************************************************************/ package org.eclipse.internal.xpand2.debug; import java.util.HashMap; import java.util.Map; import java.util.Set; import org.eclipse.emf.mwe.core.debug.model.SyntaxElement; import org.eclipse.internal.xpand2.ast.Definition; import org.eclipse.internal.xpand2.ast.ErrorStatement; import org.eclipse.internal.xpand2.ast.ExpandStatement; import org.eclipse.internal.xpand2.ast.FileStatement; import org.eclipse.internal.xpand2.ast.ForEachStatement; import org.eclipse.internal.xpand2.ast.IfStatement; import org.eclipse.internal.xpand2.ast.LetStatement; import org.eclipse.internal.xpand2.ast.ProtectStatement; import org.eclipse.internal.xpand2.ast.Statement; import org.eclipse.internal.xpand2.model.AdvicedDefinition; import org.eclipse.internal.xpand2.model.XpandDefinition; import org.eclipse.internal.xtend.expression.ast.ISyntaxElement; import org.eclipse.internal.xtend.expression.debug.BaseSpecialTreatment; import org.eclipse.internal.xtend.expression.debug.ExpressionModelPresentation; import org.eclipse.xtend.expression.ExecutionContext; /** * This class is responsible for all presentation topics for Xpand statements in * the debugger views. * * @author Clemens Kadura (zAJKa) */ public class XpandModelPresentation extends ExpressionModelPresentation { public class ElementRepresentation { String startName; String endName; public ElementRepresentation(String startName, String endName) { this.startName = startName; this.endName = endName; } } public static Map<Class<? extends ISyntaxElement>, ElementRepresentation> eReps = new HashMap<Class<? extends ISyntaxElement>, ElementRepresentation>(); { eReps.put(FileStatement.class, new ElementRepresentation("FILE", "ENDFILE")); eReps.put(ExpandStatement.class, new ElementRepresentation("EXPAND", "ENDDEFINE")); eReps.put(Definition.class, new ElementRepresentation("DEFINE", "ENDDEFINE")); eReps.put(AdvicedDefinition.class, new ElementRepresentation("AROUND", "ENDAROUND")); eReps.put(ForEachStatement.class, new ElementRepresentation("FOREACH", "ENDFOREACH")); eReps.put(IfStatement.class, new ElementRepresentation("IF", "ENDIF")); eReps.put(LetStatement.class, new ElementRepresentation("LET", "ENDLET")); eReps.put(ProtectStatement.class, new ElementRepresentation("PROTECT", "ENDPROTECT")); eReps.put(ErrorStatement.class, new ElementRepresentation("ERROR", "")); } // ------------------------------------------------------------------------- public XpandModelPresentation(Set<BaseSpecialTreatment> specials) { super(specials); } // ------------------------------------------------------------------------- @Override public SyntaxElement getStartPresentation(ISyntaxElement stmt, ExecutionContext context) { SyntaxElement to = new SyntaxElement(); to.containerName = getContainerName(stmt); to.elementName = getStartingElementName(stmt, context); to.resource = getResource(stmt); to.start = stmt.getStart(); to.end = getStartingEndPosition(stmt); to.line = stmt.getLine(); return to; } @Override public SyntaxElement getEndPresentation(ISyntaxElement element, ExecutionContext context) { SyntaxElement to = new SyntaxElement(); // Hint: for the end presentation we have to deal with types Statement // and AbstractDefinition what is not a Statement !! ISyntaxElement se = getEndSyntaxElement(element); to.containerName = getContainerName(se); to.elementName = getEndElementName(se); to.resource = getResource(se); to.start = getEndStartPosition(se); to.end = se.getEnd(); to.line = se.getLine();// TODO: Known issue: "last line" is not stored. // How to calculate it? return to; } // ------------------------------------------------------------------------- // containerName @Override protected String getContainerName(ISyntaxElement se) { XpandDefinition def; if (se instanceof XpandDefinition) { def = (XpandDefinition) se; } else { def = ((Statement) se).getContainingDefinition(); } if (def != null) return getTemplateName(se) + "::" + getDefinitionName(def); return ""; } private String getDefinitionName(XpandDefinition def) { return def.getName() + def.getParamString(true) + " FOR " + def.getTargetType(); } // ------------------------------------------------------------------------- // elementName private String getStartingElementName(ISyntaxElement se, ExecutionContext context) { return se.getNameString(context); // TODO: CK: to be finished for 4.2 final // ElementRepresentation rep = eReps.get(se.getClass()); // StringBuilder name = new StringBuilder(); // for (BaseSpecialTreatment special : specials) // name.append(special.adaptElementName(se, context)); // // if (name.length() == 0 && rep != null) // name.append(rep.startName); // // if (name.length() == 0) // name.append(se.toString()); // // return name.toString(); } private String getEndElementName(ISyntaxElement se) { ElementRepresentation rep = eReps.get(se.getClass()); return (rep != null) ? rep.endName : ((Statement) se).getContainingDefinition().toString(); } // ------------------------------------------------------------------------- // start private int getEndStartPosition(ISyntaxElement se) { ElementRepresentation rep = eReps.get(se.getClass()); return (rep != null) ? se.getEnd() - rep.endName.length() : se.getStart(); } // ------------------------------------------------------------------------- // end @Override public int getStartingEndPosition(ISyntaxElement stmt) { ElementRepresentation rep = eReps.get(stmt.getClass()); int startLength = (rep != null ? rep.startName.length() : 0); for (BaseSpecialTreatment special : specials) { int length = special.getElementNameLength(stmt); if (length != -1) { startLength = length; break; } } return (rep != null && startLength > 0) ? stmt.getStart() + startLength : stmt.getEnd(); } // ------------------------------------------------------------------------- private ISyntaxElement getEndSyntaxElement(ISyntaxElement stmt) { for (BaseSpecialTreatment special : specials) { ISyntaxElement se = special.getSpecialEndSyntaxElement(stmt); if (se != null) return se; } return stmt; } }