docs: function invokeCallExpression(callExpression, app, argsDict) {
    const memberExpression = callExpression.callee;
    const functionPath = getPathFromMemberExpression(memberExpression);
    const [fnPtr, thisPtr] = functionPath.reduce(([_fn, _this], item) =>  [_fn[item], _fn], [app, undefined])
  
    const args = callExpression.arguments.map(a => {
      if (a.type === "Identifier") {
        return argsDict[a.name];
      } else if (a.type === "Literal") {
        return a.value;
      } else {
        throw new Error(`Expected Identifier or Literal but got ${a.type}.`);
      }
    });
  
    return fnPtr.apply(thisPtr, args)
  }