call method

  1. @override
FutureOr<ASTValue<T>> call(
  1. VMContext parent, {
  2. List? positionalParameters,
  3. Map? namedParameters,
})
override

Implementation

@override
FutureOr<ASTValue<T>> call(VMContext parent,
    {List? positionalParameters, Map? namedParameters}) async {
  var context = VMContext(this, parent: parent);

  var prevContext = VMContext.setCurrent(context);
  try {
    await initializeVariables(context, positionalParameters, namedParameters);

    var parametersSize = this.parametersSize;

    dynamic result;
    if (externalFunction.isParametersSize0 || parametersSize == 0) {
      result = externalFunction();
    } else if (externalFunction.isParametersSize1 || parametersSize == 1) {
      var paramVal = await getParameterValueByIndex(context, 0);
      var a0 = resolveParameterValue(paramVal, context);
      result = externalFunction(a0);
    } else if (this.parametersSize == 2) {
      var paramVal0 = await getParameterValueByIndex(context, 0);
      var paramVal1 = await getParameterValueByIndex(context, 1);
      var a0 = resolveParameterValue(paramVal0, context);
      var a1 = resolveParameterValue(paramVal1, context);
      result = externalFunction(a0, a1);
    } else if (this.parametersSize == 3) {
      var paramVal0 = await getParameterValueByIndex(context, 0);
      var paramVal1 = await getParameterValueByIndex(context, 1);
      var paramVal2 = await getParameterValueByIndex(context, 2);
      var a0 = resolveParameterValue(paramVal0, context);
      var a1 = resolveParameterValue(paramVal1, context);
      var a2 = resolveParameterValue(paramVal2, context);
      result = externalFunction(a0, a1, a2);
    } else if (this.parametersSize == 4) {
      var paramVal0 = await getParameterValueByIndex(context, 0);
      var paramVal1 = await getParameterValueByIndex(context, 1);
      var paramVal2 = await getParameterValueByIndex(context, 2);
      var paramVal3 = await getParameterValueByIndex(context, 4);
      var a0 = resolveParameterValue(paramVal0, context);
      var a1 = resolveParameterValue(paramVal1, context);
      var a2 = resolveParameterValue(paramVal2, context);
      var a3 = resolveParameterValue(paramVal3, context);
      result = externalFunction(a0, a1, a2, a3);
    } else if (this.parametersSize == 5) {
      var paramVal0 = await getParameterValueByIndex(context, 0);
      var paramVal1 = await getParameterValueByIndex(context, 1);
      var paramVal2 = await getParameterValueByIndex(context, 2);
      var paramVal3 = await getParameterValueByIndex(context, 4);
      var paramVal4 = await getParameterValueByIndex(context, 5);
      var a0 = resolveParameterValue(paramVal0, context);
      var a1 = resolveParameterValue(paramVal1, context);
      var a2 = resolveParameterValue(paramVal2, context);
      var a3 = resolveParameterValue(paramVal3, context);
      var a4 = resolveParameterValue(paramVal4, context);
      result = externalFunction(a0, a1, a2, a3, a4);
    } else {
      result = externalFunction.call();
    }

    if (result is Future) {
      var r = await result;
      return await resolveReturnValue(context, r);
    } else {
      return await resolveReturnValue(context, result);
    }
  } finally {
    VMContext.setCurrent(prevContext);
  }
}