blob: d0160d81494673f6feee76d0cccf4855dc22d3da [file] [log] [blame]
// 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));
}
}