// Copyright (c) 2015, 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 services.dependencies.reachable_source_collector;

import 'dart:collection';

import 'package:analyzer/src/generated/engine.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer/task/dart.dart';

/// Collects reachable sources.
class ReachableSourceCollector {
  final Map<String, List<String>> _sourceMap =
      new HashMap<String, List<String>>();

  final Source source;
  final AnalysisContext context;
  ReachableSourceCollector(this.source, this.context) {
    if (source == null) {
      throw new ArgumentError.notNull('source');
    }
    if (context == null) {
      throw new ArgumentError.notNull('context');
    }
  }

  /// Collect reachable sources.
  Map<String, List<String>> collectSources() {
    _addDependencies(source);
    return _sourceMap;
  }

  void _addDependencies(Source source) {
    String sourceUri = source.uri.toString();

    // Careful not to revisit.
    if (_sourceMap[source.uri.toString()] != null) {
      return;
    }

    List<Source> sources = <Source>[];
    sources.addAll(context.computeResult(source, IMPORTED_LIBRARIES));
    sources.addAll(context.computeResult(source, EXPORTED_LIBRARIES));

    _sourceMap[sourceUri] =
        sources.map((source) => source.uri.toString()).toList();

    sources.forEach((s) => _addDependencies(s));
  }
}
