// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'package:analyzer/dart/ast/ast.dart';

/// A reference to a named parameter.
class NamedParameterReference extends ParameterReference {
  /// The name of the named parameter.
  final String name;

  /// Initialize a newly created reference to refer to the named parameter with
  /// the given [name].
  NamedParameterReference(this.name) : assert(name.isNotEmpty);

  @override
  Expression? argumentFrom(ArgumentList argumentList) {
    for (var argument in argumentList.arguments) {
      if (argument is NamedExpression && argument.name.label.name == name) {
        return argument.expression;
      }
    }
    return null;
  }

  @override
  String toString() => name;
}

/// A reference to a formal parameter.
abstract class ParameterReference {
  /// Return the expression used to compute the value of the referenced
  /// parameter, or `null` if there is no argument corresponding to the
  /// parameter. Note that for named parameters this will be an expression whose
  /// parent is a named expression.
  Expression? argumentFrom(ArgumentList argumentList);
}

/// A reference to a positional parameter.
class PositionalParameterReference extends ParameterReference {
  /// The index of the positional parameter.
  final int index;

  /// Initialize a newly created reference to refer to the positional parameter
  /// with the given [index].
  PositionalParameterReference(this.index) : assert(index >= 0);

  @override
  Expression? argumentFrom(ArgumentList argumentList) {
    var arguments = argumentList.arguments;
    if (index >= arguments.length) {
      return null;
    }
    var argument = arguments[index];
    if (argument is NamedExpression) {
      return null;
    }
    return argument;
  }

  @override
  String toString() => '$index';
}
