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

library elements.jumps;

import 'entities.dart' show Entity, Local;

/// The label entity defined by a labeled statement.
abstract class LabelDefinition extends Entity {
  String get labelName;
  JumpTarget get target;

  bool get isTarget => isBreakTarget || isContinueTarget;

  bool get isBreakTarget;
  bool get isContinueTarget;
}

/// A jump target is the reference point of a statement or switch-case,
/// either by label or as the default target of a break or continue.
abstract class JumpTarget extends Local {
  @override
  String get name => 'target';

  bool get isTarget => isBreakTarget || isContinueTarget;

  int get nestingLevel;
  List<LabelDefinition> get labels;

  bool get isBreakTarget;
  bool get isContinueTarget;
  bool get isSwitch;
  bool get isSwitchCase;

  LabelDefinition addLabel(String labelName,
      {bool isBreakTarget = false, bool isContinueTarget = false});
}
