// 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.constant_context;

enum ConstantContext {
  /// Not in a constant context.
  ///
  /// This means that `Object()` and `[]` are equivalent to `new Object()` and
  /// `[]` respectively. `new Object()` is **not** a compile-time error.
  ///
  /// TODO(ahe): Update the above specification and corresponding
  /// implementation because `Object()` is a compile-time constant. See [magic
  /// const](
  /// ../../../../../../docs/language/informal/docs/language/informal/implicit-creation.md
  /// ).
  none,

  /// In a context where constant expressions are required, and `const` may be
  /// inferred.
  ///
  /// This means that `Object()` and `[]` are equivalent to `const Object()` and
  /// `const []` respectively. `new Object()` is a compile-time error.
  inferred,

  /// In a context where constant expressions are required, but `const` is not
  /// inferred. This includes default values of optional parameters and
  /// initializing expressions on fields in classes with a `const` constructor.
  required,
}
