call method

  1. @override
Object? call(
  1. Interpreter interpreter,
  2. List<Object?> arguments,
  3. Map<Symbol, Object?> namedArguments
)
override

Implementation

@override
Object? call(Interpreter interpreter, List<Object?> arguments,
    Map<Symbol, Object?> namedArguments) {
  Environment environment = Environment(closure);
  for (int i = 0; i < declaration.params.length; i++) {
    environment.define(declaration.params[i].lexeme, arguments[i]);
  }
  for (var key in declaration.namedParams.keys) {
    if (namedArguments[Symbol(key.lexeme)] != null) {
      environment.define(key.lexeme, namedArguments[Symbol(key.lexeme)]);
    } else {
      environment.define(key.lexeme, declaration.namedParams[key]);
    }
  }
  try {
    interpreter.executeBlock(declaration.body, environment);
  } on ReturnException catch (returnValue) {
    if (isInitializer) {
      return closure.getAt(0, "this");
    }
    return returnValue.value;
  } on RuntimeError catch (error) {
    runtimeError(error);
    rethrow;
  }
  if (isInitializer) {
    return closure.getAt(0, "this");
  }
  return null;
}