resolve method

  1. @override
MethodExecutor? resolve(
  1. EvaluationContext context,
  2. Object target,
  3. String name,
  4. List<Object?> arguments,
)
override

An executor that runs method name on target with arguments (already evaluated), or null to let the next resolver try.

Throwing an AccessException here is reported as problemLocatingMethod (EL1031E).

Implementation

@override
MethodExecutor? resolve(
  EvaluationContext context,
  Object target,
  String name,
  List<Object?> arguments,
) {
  if (target is! PropertyResolver) {
    return null;
  }
  final function = switch (name) {
    'getProperty' => ([
      String? key,
      String? defaultValue,
    ]) => target.getProperty(key!, defaultValue: defaultValue),
    'getRequiredProperty' => (String key) => target.getRequiredProperty(key),
    'containsProperty' => (String key) => target.containsProperty(key),
    'resolvePlaceholders' => (String text) => target.resolvePlaceholders(
      text,
    ),
    'resolveRequiredPlaceholders' => (
      String text,
    ) => target.resolveRequiredPlaceholders(text),
    'getActiveProfiles' when target is Environment =>
      () => target.activeProfiles,
    'getDefaultProfiles' when target is Environment =>
      () => target.defaultProfiles,
    'matchesProfiles' when target is Environment => VarargsFunction(
      (List<Object?> expressions) =>
          target.matchesProfiles([for (final e in expressions) '$e']),
    ),
    _ => null,
  };
  if (function == null ||
      (name == 'getProperty' && arguments.isEmpty) ||
      !VarargsFunction.accepts(function, arguments.length)) {
    return null;
  }
  return (_, _, args) => SpelTypeMethodResolver.callChecked(
    function,
    args,
    () => SpelEvaluationException(
      SpelMessage.methodNotFound,
      inserts: ['$name(${args.length} arguments)', target.runtimeType],
    ),
  );
}