// Copyright (c) 2017, 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.

part of '../expression.dart';

/// Represents invoking [target] as a method with arguments.
class InvokeExpression extends Expression {
  /// Target of the method invocation.
  final Expression target;

  /// Optional; type of invocation.
  @Deprecated('Use isConst instead')
  final InvokeExpressionType? type;

  @override
  final bool isConst;

  final List<Expression> positionalArguments;
  final Map<String, Expression> namedArguments;
  final List<Reference> typeArguments;
  final String? name;

  const InvokeExpression._(
    this.target,
    this.positionalArguments,
    this.namedArguments,
    this.typeArguments,
  ) : name = null,
      type = null,
      isConst = false;

  const InvokeExpression.newOf(
    this.target,
    this.positionalArguments, [
    this.namedArguments = const {},
    this.typeArguments = const [],
    this.name,
  ]) : type = InvokeExpressionType.newInstance,
       isConst = false;

  const InvokeExpression.constOf(
    this.target,
    this.positionalArguments, [
    this.namedArguments = const {},
    this.typeArguments = const [],
    this.name,
  ]) : type = InvokeExpressionType.constInstance,
       isConst = true;

  @override
  R accept<R>(ExpressionVisitor<R> visitor, [R? context]) =>
      visitor.visitInvokeExpression(this, context);

  @override
  String toString() =>
      '${type ?? ''} $target($positionalArguments, $namedArguments)';
}

enum InvokeExpressionType { newInstance, constInstance }
