/******************************************************************************* * Copyright (c) 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.xpand.ui.debug; import static org.eclipse.internal.xpand2.debug.XpandElementAdapter.TYPE; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.emf.mwe.ui.workflow.util.PluginConfigurationElementUtil; import org.eclipse.internal.xpand2.ast.AbstractDefinition; import org.eclipse.internal.xpand2.ast.ErrorStatement; import org.eclipse.internal.xpand2.ast.ExpandStatement; import org.eclipse.internal.xpand2.ast.ExpressionStatement; 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.ast.Template; import org.eclipse.internal.xpand2.ast.TextStatement; import org.eclipse.internal.xpand2.debug.ExpandSpecial; import org.eclipse.internal.xpand2.debug.ForEachSpecial; import org.eclipse.internal.xpand2.debug.IfSpecial; import org.eclipse.internal.xpand2.debug.XpandModelPresentation; import org.eclipse.internal.xpand2.model.XpandAdvice; import org.eclipse.internal.xpand2.model.XpandDefinition; import org.eclipse.internal.xtend.expression.ast.Expression; import org.eclipse.internal.xtend.expression.ast.ISyntaxElement; import org.eclipse.internal.xtend.expression.debug.EvaluatedElementWrapper; import org.eclipse.internal.xtend.expression.debug.NoResourceSpecial; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.widgets.Display; import org.eclipse.xpand.ui.XpandEditorPlugin; import org.eclipse.xpand.ui.editor.XpandEditor; import org.eclipse.xpand.ui.internal.XpandLog; import org.eclipse.xtend.shared.ui.core.IXtendXpandResource; import org.eclipse.xtend.ui.debug.ExpressionPluginAdapter; /** * The IPluginAdapter implementation for Xpand statements. * * @author Clemens Kadura (zAJKa) */ public class XpandPluginAdapter extends ExpressionPluginAdapter { public XpandPluginAdapter() { super(); specials.add(new ForEachSpecial()); specials.add(new ExpandSpecial()); specials.add(new IfSpecial()); specials.add(new NoResourceSpecial()); pres = new XpandModelPresentation(specials); } // ------------------------------------------------------------------------- @Override protected String getRequiredExtension() { return "xpt"; } @Override public boolean canHandleType(String type) { return TYPE.equals(type); } @Override public String getEditorId() { return PluginConfigurationElementUtil.getConfigAttribute("org.eclipse.ui.editors/" + "editor[class=" + XpandEditor.class.getName() + "]/id"); } // ------------------------------------------------------------------------- @Override protected List<ISyntaxElement> collectFirstLevelElements(IXtendXpandResource res) { List<ISyntaxElement> result = new ArrayList<ISyntaxElement>(); XpandDefinition[] defs = ((Template) res.getExtXptResource()).getDefinitions(); for (XpandDefinition def : defs) result.add(def); XpandAdvice[] advs = ((Template) res.getExtXptResource()).getAdvices(); for (XpandAdvice adv : advs) result.add(adv); return result; } @Override protected List<ISyntaxElement> getBody(ISyntaxElement parent) { List<ISyntaxElement> result = new ArrayList<ISyntaxElement>(); // Definition or Advice if (parent instanceof AbstractDefinition) { result.addAll(((AbstractDefinition) parent).getBodyAsList()); } // TextStatement else if (parent instanceof TextStatement) { // don't handle text } // FileStatement else if (parent instanceof FileStatement) { FileStatement stmt = (FileStatement) parent; result.add(new EvaluatedElementWrapper(parent)); result.add(stmt.getTargetFileName()); result.addAll(stmt.getBodyAsList()); } // ForEachStatement else if (parent instanceof ForEachStatement) { ForEachStatement stmt = (ForEachStatement) parent; result.add(new EvaluatedElementWrapper(parent)); result.add(stmt.getTarget()); result.add(stmt.getSeparator()); result.addAll(stmt.getBodyAsList()); } // IfStatement else if (parent instanceof IfStatement) { IfStatement stmt = (IfStatement) parent; result.add(new EvaluatedElementWrapper(parent)); result.add(stmt.getCondition()); result.addAll(stmt.getBodyAsList()); result.add(stmt.getElseIf()); } // LetStatement else if (parent instanceof LetStatement) { LetStatement stmt = (LetStatement) parent; result.add(new EvaluatedElementWrapper(parent)); result.add(stmt.getVarValue()); result.addAll(stmt.getBodyAsList()); } // ProtectStatement else if (parent instanceof ProtectStatement) { ProtectStatement stmt = (ProtectStatement) parent; result.add(new EvaluatedElementWrapper(parent)); result.add(stmt.getCommentStart()); result.add(stmt.getCommentEnd()); result.add(stmt.getId()); result.addAll(stmt.getBodyAsList()); } // ErrorStatement else if (parent instanceof ErrorStatement) { result.add(new EvaluatedElementWrapper(parent)); result.add(((ErrorStatement) parent).getMessage()); } // ExpandStatement else if (parent instanceof ExpandStatement) { ExpandStatement stmt = (ExpandStatement) parent; result.add(new EvaluatedElementWrapper(parent)); result.addAll(stmt.getParametersAsList()); Expression target = ((ExpandStatement) parent).getTarget(); if(target != null) result.add(target); Expression sep = ((ExpandStatement) parent).getSeparator(); if(sep != null) result.add(sep); } // ExpressionStmt else if (parent instanceof ExpressionStatement) { result.add(new EvaluatedElementWrapper(parent)); result.add(((ExpressionStatement) parent).getExpression()); } else if (parent instanceof Statement) XpandLog.logInfo("Implementation error: Wanted to set Breakpoint for unknown statement: " + parent.getClass().getSimpleName()); else result.addAll(super.getBody(parent)); return result; } @Override protected boolean isValidReturnElement(ISyntaxElement element) { if (element instanceof TextStatement) return false; if (element instanceof Statement) return true; return super.isValidReturnElement(element); } // ------------------------------------------------------------------------- private Image icon = null; @Override public Image getIcon() { if (icon != null) return icon; IPath path = new Path("/icons/templatefile.gif"); InputStream is = null; try { is = FileLocator.openStream(XpandEditorPlugin.getDefault().getBundle(), path, false); } catch (IOException e) { } if (is != null) { final ImageData iData = new ImageData(is); icon = new Image(Display.getCurrent(), iData); return icon; } return null; } }