blob: 29517ef7249b8295a9450dedea25b1f1e588c0b5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013, 2016 Atos 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:
* Arthur Daussy - initial implementation
* Christian Pontesegger - simplified to use base class
*******************************************************************************/
package org.eclipse.ease.lang.python;
import java.lang.reflect.Field;
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.IEnvironment;
import org.eclipse.ease.modules.IScriptFunctionModifier;
import org.eclipse.ease.modules.ModuleHelper;
public class PythonCodeFactory extends AbstractCodeFactory {
public static List<String> RESERVED_KEYWORDS = new ArrayList<String>();
static {
RESERVED_KEYWORDS.add("and");
RESERVED_KEYWORDS.add("as");
RESERVED_KEYWORDS.add("assert");
RESERVED_KEYWORDS.add("break");
RESERVED_KEYWORDS.add("class");
RESERVED_KEYWORDS.add("continue");
RESERVED_KEYWORDS.add("def");
RESERVED_KEYWORDS.add("del");
RESERVED_KEYWORDS.add("elif");
RESERVED_KEYWORDS.add("else");
RESERVED_KEYWORDS.add("except");
RESERVED_KEYWORDS.add("exec");
RESERVED_KEYWORDS.add("finally");
RESERVED_KEYWORDS.add("for");
RESERVED_KEYWORDS.add("from");
RESERVED_KEYWORDS.add("global");
RESERVED_KEYWORDS.add("if");
RESERVED_KEYWORDS.add("import");
RESERVED_KEYWORDS.add("in");
RESERVED_KEYWORDS.add("is");
RESERVED_KEYWORDS.add("lambda");
RESERVED_KEYWORDS.add("not");
RESERVED_KEYWORDS.add("or");
RESERVED_KEYWORDS.add("pass");
RESERVED_KEYWORDS.add("print");
RESERVED_KEYWORDS.add("raise");
RESERVED_KEYWORDS.add("return");
RESERVED_KEYWORDS.add("try");
RESERVED_KEYWORDS.add("while");
RESERVED_KEYWORDS.add("with");
RESERVED_KEYWORDS.add("yield");
}
@Override
public String createFunctionWrapper(final IEnvironment environment, final String moduleVariable, final Method method) {
final StringBuilder pythonCode = new StringBuilder();
// parse parameters
final List<Parameter> parameters = ModuleHelper.getParameters(method);
// build parameter string
final StringBuilder methodSignature = new StringBuilder();
final StringBuilder methodCall = new StringBuilder();
for (final Parameter parameter : parameters) {
methodSignature.append(", ").append(parameter.getName());
methodCall.append(", ").append(parameter.getName());
if (parameter.isOptional())
methodSignature.append(" = ").append(getDefaultValue(parameter));
}
if (methodSignature.length() > 2) {
methodSignature.delete(0, 2);
methodCall.delete(0, 2);
}
final StringBuilder body = new StringBuilder();
// insert hooked pre execution code
body.append(getPreExecutionCode(environment, method));
// insert method call
body.append('\t').append(IScriptFunctionModifier.RESULT_NAME).append(" = ").append(moduleVariable).append('.').append(method.getName()).append('(');
body.append(methodCall);
body.append(")\n");
// insert hooked post execution code
body.append(getPostExecutionCode(environment, method));
// insert return statement
body.append("\treturn ").append(IScriptFunctionModifier.RESULT_NAME).append('\n');
// build function declarations
for (final String name : getMethodNames(method)) {
if (!isValidMethodName(name)) {
Logger.error(Activator.PLUGIN_ID,
"The method name \"" + name + "\" from the module \"" + moduleVariable + "\" can not be wrapped because it's name is reserved");
} else if (!name.isEmpty()) {
pythonCode.append("def ").append(name).append('(').append(methodSignature).append("):\n");
pythonCode.append(body);
pythonCode.append('\n');
}
}
return pythonCode.toString();
}
@Override
public String getSaveVariableName(final String variableName) {
return PythonHelper.getSaveName(variableName);
}
@Override
public String classInstantiation(final Class<?> clazz, final String[] parameters) {
final StringBuilder code = new StringBuilder();
code.append(clazz.getCanonicalName());
code.append('(');
if (parameters != null) {
for (final String parameter : parameters) {
code.append(parameter);
code.append(", ");
}
if (parameters.length > 0)
code.delete(code.length() - 2, code.length());
}
code.append(')');
return code.toString();
}
public boolean isValidMethodName(final String methodName) {
return PythonHelper.isSaveName(methodName) && !RESERVED_KEYWORDS.contains(methodName);
}
@Override
public String createFinalFieldWrapper(final IEnvironment environment, final String moduleVariable, final Field field) {
return PythonHelper.getSaveName(field.getName()) + " = " + moduleVariable + '.' + field.getName() + '\n';
}
@Override
protected String getNullString() {
return "None";
}
@Override
protected String getTrueString() {
return "True";
}
@Override
protected String getFalseString() {
return "False";
}
@Override
protected String getSingleLineCommentToken() {
return "# ";
}
@Override
protected String getMultiLineCommentStartToken() {
return "\"\"\"";
}
@Override
protected String getMultiLineCommentEndToken() {
return getMultiLineCommentStartToken();
}
}