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

import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/utilities/kythe/entries.dart';

/// A concrete implementation of [EntryRequest].
class DartEntryRequestImpl implements DartEntryRequest {
  @override
  final ResourceProvider resourceProvider;

  @override
  final ResolvedUnitResult result;

  /// Initialize a newly create request with the given data.
  DartEntryRequestImpl(this.resourceProvider, this.result);

  @override
  String get path => result.path!;
}

/// A concrete implementation of [EntryCollector].
class EntryCollectorImpl implements EntryCollector {
  /// A list of entries.
  final List<KytheEntry> entries = <KytheEntry>[];

  /// A list of paths to files.
  final List<String> files = <String>[];

  @override
  void addEntry(KytheEntry entry) {
    entries.add(entry);
  }
}
