/* * <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.xtend.parser; import java.util.List; import lpg.lpgjavaruntime.IToken; import org.eclipse.gmf.internal.xpand.expression.ast.DeclaredParameter; import org.eclipse.gmf.internal.xpand.expression.ast.Expression; import org.eclipse.gmf.internal.xpand.expression.ast.Identifier; import org.eclipse.gmf.internal.xpand.expression.ast.StringLiteral; import org.eclipse.gmf.internal.xpand.expression.ast.SyntaxElement; import org.eclipse.gmf.internal.xpand.expression.parser.ExpressionFactory; import org.eclipse.gmf.internal.xpand.xtend.ast.CreateExtensionStatement; import org.eclipse.gmf.internal.xpand.xtend.ast.ExpressionExtensionStatement; import org.eclipse.gmf.internal.xpand.xtend.ast.Extension; import org.eclipse.gmf.internal.xpand.xtend.ast.ExtensionFile; import org.eclipse.gmf.internal.xpand.xtend.ast.ImportStatement; import org.eclipse.gmf.internal.xpand.xtend.ast.JavaExtensionStatement; import org.eclipse.gmf.internal.xpand.xtend.ast.WorkflowSlotExtensionStatement; public class ExtensionFactory extends ExpressionFactory { public ExtensionFactory(String string) { super(string); } public ExtensionFile createExtensionFile(final List<SyntaxElement> nsimports, final List<SyntaxElement> extimports, final List<SyntaxElement> extensions) { return handle(new ExtensionFile(0, -1, 1, 0, -1, nsimports, extimports, extensions)); } public ImportStatement createNsImport(final IToken s, final IToken e, final StringLiteral st) { return handle(new ImportStatement(start(s), end(e), line(s), s.getStartOffset(), e.getEndOffset(), st.getValue())); } public ImportStatement createExtensionFileImport(final IToken s, final IToken e, final Identifier t, final IToken exported) { return handle(new ImportStatement(start(s), end(e), line(s), s.getStartOffset(), e.getEndOffset(), t, exported != null)); } public JavaExtensionStatement createJavaExtension(final IToken name, final IToken endSemi, final Identifier type, final List<DeclaredParameter> params, final Identifier fqn, final List<Identifier> javaParamTypes, final IToken cached, final IToken isPrivate, final Identifier instanceSlot) { final String txt = fqn.getValue(); final int index = txt.lastIndexOf('.'); final String typeName = txt.substring(0, index); final String methodName = txt.substring(index + 1); final int start = getExtensionStart(cached, type, name); final int startOffset = getExtensionStartOffset(cached, type, name); final int line = getExtensionLine(cached, type, name); final Identifier javaMethod = new Identifier(fqn.getStart() + index + 1, fqn.getEnd(), fqn.getLine(), fqn.getStartOffset() + index + 1, fqn.getEndOffset(), methodName); final Identifier javaType = new Identifier(fqn.getStart(), fqn.getStart() + index, fqn.getLine(), fqn.getStartOffset(), fqn.getStartOffset() + index, typeName); return handle(new JavaExtensionStatement(start, end(endSemi), line, startOffset, endSemi.getEndOffset(), createIdentifier(name), params, type, javaType, javaMethod, javaParamTypes, cached != null, isPrivate != null, instanceSlot)); } public WorkflowSlotExtensionStatement createWorkflowSlotExtension(final IToken name, final IToken e, final Identifier type, final List<DeclaredParameter> params, final Identifier slotName, final IToken cached, final IToken priv) { final int start = getExtensionStart(cached, type, name); final int startOffset = getExtensionStartOffset(cached, type, name); final int line = getExtensionLine(cached, type, name); return handle(new WorkflowSlotExtensionStatement(start, end(e), line, startOffset, e.getEndOffset(), createIdentifier(name), params, type, slotName, cached != null, priv != null)); } protected static int getExtensionStart(final IToken resentful, final Identifier type, final IToken name) { // XXX syntax ordering is smth like "resentful type name", and it's odd why start(type) gets higher precedence int start = start(name); if (resentful != null) { start = start(resentful); } else if (type != null) { start = type.getStart(); } return start; } protected static int getExtensionStartOffset(final IToken resentful, final Identifier type, final IToken name) { if (resentful != null) { return resentful.getStartOffset(); } else if (type != null) { return type.getStartOffset(); } return name.getStartOffset(); } protected static int getExtensionLine(final IToken resentful, final Identifier type, final IToken name) { int line = line(name); if (resentful != null) { line = line(resentful); } else if (type != null) { line = type.getLine(); } return line; } public ExpressionExtensionStatement createExpressionExtension(final IToken name, final IToken e, final Identifier returnType, final List<DeclaredParameter> params, final Expression expr, final IToken cached, final IToken priv) { final int start = getExtensionStart(cached, returnType, name); final int startOffset = getExtensionStartOffset(cached, returnType, name); final int line = getExtensionLine(cached, returnType, name); return handle(new ExpressionExtensionStatement(start, end(e), line, startOffset, e.getEndOffset(), createIdentifier(name), returnType, params, expr, cached != null, priv != null)); } public Extension createCreateExtension(final IToken create, final IToken e, final Identifier returnType, final IToken rtn, final IToken name, final List<DeclaredParameter> params, final Expression expr, final IToken priv) { int line = line(create); IToken startElement = create; if (priv != null) { startElement = priv; line = line(priv); } return handle(new CreateExtensionStatement(start(startElement), end(e), line, startElement.getStartOffset(), e.getEndOffset(), createIdentifier(name), returnType, rtn != null ? createIdentifier(rtn) : null, params, expr, priv != null)); } }