// 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:nnbd_migration/src/front_end/web/navigation_tree.dart';

/// Information about a link to a compilation unit.
class UnitLink {
  final String fullPath;
  final List<String> pathParts;
  final int editCount;

  /// The number of directories deep in which this compilation unit is found.
  ///
  /// A compilation unit in the root has a depth of 0.
  final int depth;

  /// Whether this compilation unit was explicitly opted out of null safety at
  /// the start of this migration.
  final bool wasExplicitlyOptedOut;

  final UnitMigrationStatus migrationStatus;

  /// Whether the migration status of this compilation unit can be changed in
  /// the web interface.
  final bool migrationStatusCanBeChanged;

  UnitLink(
      this.fullPath,
      this.pathParts,
      this.editCount,
      this.wasExplicitlyOptedOut,
      this.migrationStatus,
      this.migrationStatusCanBeChanged)
      : depth = pathParts.length - 1;

  String get fileName => pathParts.last;
}
