package fr.inria.diverse.iot2.iot2.aspects;
import com.google.common.base.Objects;
import fr.inria.diverse.k3.al.annotationprocessor.Aspect;
import fr.inria.diverse.k3.al.annotationprocessor.OverrideAspectMethod;
import java.util.ArrayList;
import java.util.Map;
import java.util.Stack;
import java.util.function.Consumer;
import org.eclipse.emf.common.util.EList;
import org.eclipse.xtext.xbase.lib.Exceptions;
import org.eclipse.xtext.xbase.lib.InputOutput;
import fr.inria.diverse.iot2.iot2.iot2.Block;
import fr.inria.diverse.iot2.iot2.iot2.Expression;
import fr.inria.diverse.iot2.iot2.iot2.Expression_VariableName;
import fr.inria.diverse.iot2.iot2.iot2.Function;
import fr.inria.diverse.iot2.iot2.iot2.Functioncall_Arguments;
import fr.inria.diverse.iot2.iot2.iot2.Statement_CallFunction;
import fr.inria.diverse.iot2.iot2.aspects.BlockAspect;
import fr.inria.diverse.iot2.iot2.aspects.Environment;
import fr.inria.diverse.iot2.iot2.aspects.LuaExpressionAspect;
import fr.inria.diverse.iot2.iot2.aspects.Statement_CallFunctionAspectStatement_CallFunctionAspectProperties;
import fr.inria.diverse.iot2.iot2.aspects.Statement_FunctioncallOrAssignmentAspect;
@Aspect(className = Statement_CallFunction.class)
@SuppressWarnings("all")
public class Statement_CallFunctionAspect extends Statement_FunctioncallOrAssignmentAspect {
@OverrideAspectMethod
public static void execute(final Statement_CallFunction _self, final Environment c) {
fr.inria.diverse.iot2.iot2.aspects.Statement_CallFunctionAspectStatement_CallFunctionAspectProperties _self_ = fr.inria.diverse.iot2.iot2.aspects.Statement_CallFunctionAspectStatement_CallFunctionAspectContext.getSelf(_self);
if (_self instanceof fr.inria.diverse.iot2.iot2.iot2.Statement_CallFunction){
fr.inria.diverse.iot2.iot2.aspects.Statement_CallFunctionAspect._privk3_execute(_self_, (fr.inria.diverse.iot2.iot2.iot2.Statement_CallFunction)_self,c);
} else if (_self instanceof fr.inria.diverse.iot2.iot2.iot2.Statement_FunctioncallOrAssignment){
fr.inria.diverse.iot2.iot2.aspects.Statement_FunctioncallOrAssignmentAspect.execute((fr.inria.diverse.iot2.iot2.iot2.Statement_FunctioncallOrAssignment)_self,c);
} else if (_self instanceof fr.inria.diverse.iot2.iot2.iot2.Statement){
fr.inria.diverse.iot2.iot2.aspects.StatementAspect.execute((fr.inria.diverse.iot2.iot2.iot2.Statement)_self,c);
} else { throw new IllegalArgumentException("Unhandled parameter types: " + java.util.Arrays.<Object>asList(_self).toString()); };
}
private static void super_execute(final Statement_CallFunction _self, final Environment c) {
fr.inria.diverse.iot2.iot2.aspects.Statement_FunctioncallOrAssignmentAspectStatement_FunctioncallOrAssignmentAspectProperties _self_ = fr.inria.diverse.iot2.iot2.aspects.Statement_FunctioncallOrAssignmentAspectStatement_FunctioncallOrAssignmentAspectContext.getSelf(_self);
fr.inria.diverse.iot2.iot2.aspects.Statement_FunctioncallOrAssignmentAspect._privk3_execute(_self_, _self,c);
}
protected static void _privk3_execute(final Statement_CallFunctionAspectStatement_CallFunctionAspectProperties _self_, final Statement_CallFunction _self, final Environment c) {
try {
Expression x = _self.getObject();
boolean _matched = false;
if (!_matched) {
if (x instanceof Expression_VariableName) {
String _variable = ((Expression_VariableName)x).getVariable();
boolean _equals = _variable.equals("print");
if (_equals) {
_matched=true;
Functioncall_Arguments _arguments = _self.getArguments();
EList<Expression> _arguments_1 = _arguments.getArguments();
Expression _get = _arguments_1.get(0);
LuaExpressionAspect.execute(_get, c);
Object _popValue = c.popValue();
InputOutput.<Object>print(_popValue);
return;
}
}
}
if (!_matched) {
if (x instanceof Expression_VariableName) {
String _variable = ((Expression_VariableName)x).getVariable();
boolean _equals = _variable.equals("println");
if (_equals) {
_matched=true;
Functioncall_Arguments _arguments = _self.getArguments();
EList<Expression> _arguments_1 = _arguments.getArguments();
Expression _get = _arguments_1.get(0);
LuaExpressionAspect.execute(_get, c);
Object _popValue = c.popValue();
InputOutput.<Object>println(_popValue);
return;
}
}
}
if (!_matched) {
if (x instanceof Expression_VariableName) {
String _variable = ((Expression_VariableName)x).getVariable();
boolean _equals = _variable.equals("sleep");
if (_equals) {
_matched=true;
Functioncall_Arguments _arguments = _self.getArguments();
EList<Expression> _arguments_1 = _arguments.getArguments();
Expression _get = _arguments_1.get(0);
LuaExpressionAspect.execute(_get, c);
Object _popValue = c.popValue();
String _string = _popValue.toString();
double _parseDouble = Double.parseDouble(_string);
final int sleep = Double.valueOf(_parseDouble).intValue();
Thread.sleep(sleep);
return;
}
}
}
Expression _object = _self.getObject();
if ((_object instanceof Expression_VariableName)) {
Expression _object_1 = _self.getObject();
String _variable = ((Expression_VariableName) _object_1).getVariable();
Function function = c.getFunction(_variable);
boolean _notEquals = (!Objects.equal(function, null));
if (_notEquals) {
final ArrayList<Object> params = new ArrayList<Object>();
Functioncall_Arguments _arguments = _self.getArguments();
EList<Expression> _arguments_1 = _arguments.getArguments();
final Consumer<Expression> _function = (Expression args) -> {
LuaExpressionAspect.execute(args, c);
Object _popValue = c.popValue();
params.add(_popValue);
};
_arguments_1.forEach(_function);
Environment newC = new Environment();
newC.setParent(c);
Map<String, Object> _variables = c.getVariables();
newC.putAllVariables(_variables);
Map<String, Function> _functions = c.getFunctions();
newC.putAllFunctions(_functions);
Stack<Object> _values = c.getValues();
newC.pushAllValues(_values);
for (int i = 0; (i < function.getParameters().size()); i++) {
EList<String> _parameters = function.getParameters();
String _get = _parameters.get(i);
Object _get_1 = params.get(i);
newC.putVariable(_get, _get_1);
}
Block _body = function.getBody();
BlockAspect.execute(_body, newC);
Object _popValue = newC.popValue();
c.pushValue(_popValue);
}
}
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
}