blob: 6b02a31e79314f3b26bc460ee9d0a96d5bfb0cd6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013 Christian Pontesegger and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
* Christian Pontesegger - initial API and implementation
*******************************************************************************/
package org.eclipse.ease.lang.ruby;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.ease.AbstractCodeFactory;
import org.eclipse.ease.Logger;
import org.eclipse.ease.modules.EnvironmentModule;
import org.eclipse.ease.modules.IEnvironment;
import org.eclipse.ease.modules.ModuleHelper;
import org.eclipse.ease.tools.StringTools;
public class RubyCodeFactory extends AbstractCodeFactory {
public static List<String> RESERVED_KEYWORDS = new ArrayList<>();
static {
// TODO set keywords
// RESERVED_KEYWORDS.add("abstract");
}
@Override
public String getSaveVariableName(final String variableName) {
return RubyHelper.getSaveName(variableName);
}
@Override
public String createFunctionWrapper(final IEnvironment environment, final String moduleVariable, final Method method) {
final String methodId = ((EnvironmentModule) environment).registerMethod(method);
final StringBuilder rubyScriptCode = new StringBuilder();
// parse parameters
final List<Parameter> parameters = ModuleHelper.getParameters(method);
// build parameter string
final StringBuilder parameterList = new StringBuilder();
for (final Parameter parameter : parameters)
parameterList.append(", ").append(parameter.getName());
if (parameterList.length() > 2)
parameterList.delete(0, 2);
final StringBuilder body = new StringBuilder();
// insert parameter checks
body.append(verifyParameters(parameters));
// insert hooked pre execution code
body.append("\t$").append(EnvironmentModule.getWrappedVariableName(environment)).append(".preMethodCallback('").append(methodId).append("'")
.append(parameters.isEmpty() ? "" : ", ").append(parameterList).append(");").append(StringTools.LINE_DELIMITER);
// insert method call
body.append("\t").append(RESULT_NAME).append(" = ").append('$').append(moduleVariable).append('.').append(method.getName()).append('(');
body.append(parameterList);
body.append(");\n");
// insert hooked post execution code
body.append("\t$").append(EnvironmentModule.getWrappedVariableName(environment)).append(".postMethodCallback('").append(methodId).append("', ")
.append(RESULT_NAME).append(");").append(StringTools.LINE_DELIMITER);
// insert return statement
body.append("\treturn ").append(RESULT_NAME).append(";\n");
// build function declarations
for (final String name : getMethodNames(method)) {
if (!isValidMethodName(name)) {
Logger.error(PluginConstants.PLUGIN_ID,
"The method name \"" + name + "\" from the module \"" + moduleVariable + "\" can not be wrapped because it's name is reserved");
} else if (!name.isEmpty()) {
rubyScriptCode.append("def ").append(name).append("(").append(parameterList).append(")\n");
rubyScriptCode.append(body);
rubyScriptCode.append("end\n");
}
}
return rubyScriptCode.toString();
}
private StringBuilder verifyParameters(final List<Parameter> parameters) {
final StringBuilder data = new StringBuilder();
// FIXME currently not supported
return data;
}
@Override
public String classInstantiation(final Class<?> clazz, final String[] parameters) {
final StringBuilder code = new StringBuilder();
code.append(clazz.getName());
code.append(".new(");
if (parameters != null) {
for (final String parameter : parameters) {
code.append('"');
code.append(parameter);
code.append('"');
code.append(", ");
}
if (parameters.length > 0)
code.replace(code.length() - 2, code.length(), "");
}
code.append(")");
return code.toString();
}
private static boolean isValidMethodName(final String methodName) {
return RubyHelper.isSaveName(methodName) && !RESERVED_KEYWORDS.contains(methodName);
}
@Override
protected String getNullString() {
return "nil";
}
@Override
protected String getSingleLineCommentToken() {
return "#";
}
@Override
protected Object getLanguageIdentifier() {
return "Ruby";
}
@Override
protected String toSafeName(String name) {
// TODO we do not have KEYWORDS yet, so we cannot filter
return name;
}
}