call method
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;
}