/******************************************************************************* * Copyright © 2011, 2013 IBM Corporation 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: * IBM Corporation - initial API and implementation * *******************************************************************************/ package org.eclipse.edt.gen.javascript.templates; import org.eclipse.edt.gen.CommonUtilities; import org.eclipse.edt.gen.EglContext; import org.eclipse.edt.gen.javascript.Constants; import org.eclipse.edt.gen.javascript.Context; import org.eclipse.edt.mof.codegen.api.TabbedWriter; import org.eclipse.edt.mof.egl.*; public class MemberNameTemplate extends JavaScriptTemplate { public void genAssignment(MemberName expr, Context ctx, TabbedWriter out, Expression arg1, String arg2) { // check to see if we are copying boxed function parameters if (expr.getMember() instanceof FunctionParameter && isBoxedParameterType((FunctionParameter) expr.getMember(), ctx)) { ctx.invoke(genAccessor, expr.getMember(), ctx, out); out.print(".ezeCopy("); // if we are doing some type of complex assignment, we need to place that in the argument if (arg2.length() > 3 && arg2.indexOf("=") > 1) { ctx.invoke(genAccessor, expr.getMember(), ctx, out); out.print(".ezeUnbox()"); out.print(arg2.substring(0, arg2.indexOf("=")) + arg2.substring(arg2.indexOf("=") + 1)); } ctx.invoke(genExpression, arg1, ctx, out); // check to see if we are unboxing RHS temporary variables (inout and out types only) if (arg1 instanceof MemberName && ctx.getAttribute(((MemberName) arg1).getMember(), org.eclipse.edt.gen.Constants.SubKey_functionArgumentTemporaryVariable) != null && ctx.getAttribute(((MemberName) arg1).getMember(), org.eclipse.edt.gen.Constants.SubKey_functionArgumentTemporaryVariable) != ParameterKind.PARM_IN) out.print(".ezeUnbox()"); out.print(")"); // check to see if we are copying LHS boxed temporary variables (inout and out types only) } else if (ctx.getAttribute(expr.getMember(), org.eclipse.edt.gen.Constants.SubKey_functionArgumentTemporaryVariable) != null && ctx.getAttribute(expr.getMember(), org.eclipse.edt.gen.Constants.SubKey_functionArgumentTemporaryVariable) != ParameterKind.PARM_IN) { ctx.invoke(genExpression, (Expression) expr, ctx, out); out.print(arg2); out.print(Constants.JSRT_EGL_NAMESPACE + ctx.getNativeMapping("eglx.lang.EAny") + ".ezeWrap("); ctx.invoke(genExpression, arg1, ctx, out); // check to see if we are unboxing RHS temporary variables (inout and out types only) if (arg1 instanceof MemberName && ctx.getAttribute(((MemberName) arg1).getMember(), org.eclipse.edt.gen.Constants.SubKey_functionArgumentTemporaryVariable) != null && ctx.getAttribute(((MemberName) arg1).getMember(), org.eclipse.edt.gen.Constants.SubKey_functionArgumentTemporaryVariable) != ParameterKind.PARM_IN) out.print(".ezeUnbox()"); out.print(")"); // check to see if we are unboxing RHS temporary variables (inout and out types only) } else if (arg1 instanceof MemberName && ctx.getAttribute(((MemberName) arg1).getMember(), org.eclipse.edt.gen.Constants.SubKey_functionArgumentTemporaryVariable) != null && ctx.getAttribute(((MemberName) arg1).getMember(), org.eclipse.edt.gen.Constants.SubKey_functionArgumentTemporaryVariable) != ParameterKind.PARM_IN) { ctx.invoke(genExpression, (Expression) expr, ctx, out); out.print(arg2); ctx.invoke(genExpression, arg1, ctx, out); out.print(".ezeUnbox()"); } else ctx.invokeSuper(this, genAssignment, expr, ctx, out, arg1, arg2); } public void genExpression(MemberName expr, Context ctx, TabbedWriter out) { Member member = expr.getMember(); if (member != null && member instanceof Function) { ctx.invoke(genCallbackAccesor, expr, ctx, out, null); } else if (member != null && member.getContainer() != null && member.getContainer() instanceof Type) { ctx.invoke(genContainerBasedMemberName, (Type) member.getContainer(), ctx, out, expr, member); } else { genMemberName(expr, ctx, out); } } public Function getCallbackFunction(MemberName expr, Context ctx) { return (Function) ctx.invoke(getCallbackFunction, expr.getMember(), ctx); } public void genCallbackAccesor(MemberName expr, Context ctx, TabbedWriter out, Member arg1) { out.print("new egl.egl.jsrt.Delegate(this"); if ( arg1 != null ) { out.print("."); ctx.invoke(genName, expr.getMember(), ctx, out); out.print(", this."); ctx.invoke(genName, expr.getMember(), ctx, out); out.print("."); ctx.invoke(genName, arg1, ctx, out); } else { out.print(", "); ctx.invoke(genPartName, expr.getMember().getContainer(), ctx, out); out.print(".prototype."); ctx.invoke(genName, expr.getMember(), ctx, out); } out.print(", \""); if ( expr.getMember() instanceof Function || arg1 instanceof Function ) { String sig; if(expr.getMember() instanceof Function) sig = ((Function)expr.getMember()).getSignature(); else sig = ((Function)arg1).getSignature(); Delegate delegate = (Delegate)ctx.get( "Delegate_signature_for_function_" + sig); if ( delegate != null ) { ctx.put(Constants.SubKey_isaSignature, "true"); ctx.invoke(genSignature, delegate, ctx, out); ctx.remove(Constants.SubKey_isaSignature); } } out.print( "\""); out.print(")"); } public void genMemberName(MemberName expr, Context ctx, TabbedWriter out) { /* * Determine whether we need an implicit "this." as required by JavaScript for when accessing local fields within * their containing part */ if ((expr.getQualifier() == null) && (expr.getMember() instanceof Field)) { ctx.invoke(genQualifier, (Field) expr.getMember(), ctx, out); } boolean unbox = (expr.getMember() instanceof FunctionParameter && isBoxedParameterType((FunctionParameter) expr.getMember(), ctx)); unboxStart(unbox, out); ctx.invoke(genAccessor, expr.getMember(), ctx, out); unboxEnd(unbox, out); } private static boolean isBoxedParameterType(FunctionParameter parameter, EglContext ctx) { /* TODO sbg If the parm type is ANY, then we want to also treat as boxed; this check may get moved * to CommonUtilities.isBoxedParameterType if it makes sense for all generators.... */ return (CommonUtilities.isBoxedParameterType(parameter, ctx)); // || (parameter.getType() == TypeUtils.Type_ANY)); } }