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

library fasta.forest;

// TODO(ahe): Remove this import.
import 'package:kernel/ast.dart' as kernel show Arguments;

/// A tree factory.
abstract class Forest<Expression, Statement, Location, Arguments> {
  Arguments arguments(List<Expression> positional, Location location,
      {covariant List types, covariant List named});

  Arguments argumentsEmpty(Location location);

  List argumentsNamed(Arguments arguments);

  List<Expression> argumentsPositional(Arguments arguments);

  List argumentsTypes(Arguments arguments);

  void argumentsSetExplicitArgumentTypes(
      Arguments arguments, covariant List types);

  Expression asLiteralString(Expression value);

  Expression literalBool(bool value, Location location);

  Expression literalDouble(double value, Location location);

  Expression literalInt(int value, Location location);

  Expression literalList(covariant typeArgument, List<Expression> expressions,
      bool isConst, Location location);

  Expression literalMap(covariant keyType, covariant valueType,
      covariant List entries, bool isConst, Location location);

  Expression literalNull(Location location);

  Expression literalString(String value, Location location);

  Expression literalSymbol(String value, Location location);

  Expression literalType(covariant type, Location location);

  Object mapEntry(Expression key, Expression value, Location location);

  List mapEntryList(int length);

  int readOffset(covariant node);

  // TODO(ahe): Remove this method when all users are moved here.
  kernel.Arguments castArguments(Arguments arguments) {
    dynamic a = arguments;
    return a;
  }
}
