| Index: packages/analyzer/tool/task_dependency_graph.dart
|
| diff --git a/packages/analyzer/tool/task_dependency_graph.dart b/packages/analyzer/tool/task_dependency_graph.dart
|
| deleted file mode 100644
|
| index 5da29763ab9aa5af877da6b922e8454e868a62a3..0000000000000000000000000000000000000000
|
| --- a/packages/analyzer/tool/task_dependency_graph.dart
|
| +++ /dev/null
|
| @@ -1,157 +0,0 @@
|
| -// 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.
|
| -
|
| -/**
|
| - * This file contains code to output a description of tasks and their
|
| - * dependencies in ".dot" format. Prior to running, the user should run "pub
|
| - * get" in the analyzer directory to ensure that a "packages" folder exists.
|
| - *
|
| - * The ".dot" file is output to standard out. To convert it to a pdf, store it
|
| - * in a file (e.g. "tasks.dot"), and post-process it with
|
| - * "dot tasks.dart -Tpdf -O".
|
| - *
|
| - * TODO(paulberry):
|
| - * - Add general.dart and html.dart for completeness.
|
| - * - Use Graphviz's "record" feature to produce more compact output
|
| - * (http://www.graphviz.org/content/node-shapes#record)
|
| - * - Produce a warning if a result descriptor is found which isn't the output
|
| - * of exactly one task.
|
| - * - Convert this tool to use package_config to find the package map.
|
| - */
|
| -library task_dependency_graph;
|
| -
|
| -import 'dart:io' hide File;
|
| -
|
| -import 'package:analyzer/analyzer.dart';
|
| -import 'package:analyzer/file_system/file_system.dart';
|
| -import 'package:analyzer/file_system/physical_file_system.dart';
|
| -import 'package:analyzer/src/generated/element.dart';
|
| -import 'package:analyzer/src/generated/engine.dart';
|
| -import 'package:analyzer/src/generated/java_io.dart';
|
| -import 'package:analyzer/src/generated/sdk.dart';
|
| -import 'package:analyzer/src/generated/sdk_io.dart';
|
| -import 'package:analyzer/src/generated/source.dart';
|
| -import 'package:analyzer/src/generated/source_io.dart';
|
| -import 'package:path/path.dart' as path;
|
| -
|
| -main() {
|
| - new Driver().run();
|
| -}
|
| -
|
| -typedef void ResultDescriptorFinderCallback(PropertyAccessorElement element);
|
| -
|
| -class Driver {
|
| - PhysicalResourceProvider resourceProvider;
|
| - AnalysisContext context;
|
| - InterfaceType resultDescriptorType;
|
| - String rootDir;
|
| -
|
| - void findResultDescriptors(
|
| - AstNode node, void callback(String descriptorName)) {
|
| - Set<PropertyAccessorElement> resultDescriptors =
|
| - new Set<PropertyAccessorElement>();
|
| - node.accept(new ResultDescriptorFinder(
|
| - resultDescriptorType, resultDescriptors.add));
|
| - for (PropertyAccessorElement resultDescriptor in resultDescriptors) {
|
| - callback(resultDescriptor.name);
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Find the root directory of the analyzer package by proceeding
|
| - * upward to the 'tool' dir, and then going up one more directory.
|
| - */
|
| - String findRoot(String pathname) {
|
| - while (path.basename(pathname) != 'tool') {
|
| - String parent = path.dirname(pathname);
|
| - if (parent.length >= pathname.length) {
|
| - throw new Exception("Can't find root directory");
|
| - }
|
| - pathname = parent;
|
| - }
|
| - return path.dirname(pathname);
|
| - }
|
| -
|
| - CompilationUnit getUnit(Source source) =>
|
| - context.resolveCompilationUnit2(source, source);
|
| -
|
| - void run() {
|
| - rootDir = findRoot(Platform.script.toFilePath(windows: Platform.isWindows));
|
| - resourceProvider = PhysicalResourceProvider.INSTANCE;
|
| - DartSdk sdk = DirectoryBasedDartSdk.defaultSdk;
|
| - context = AnalysisEngine.instance.createAnalysisContext();
|
| - JavaFile packagesDir = new JavaFile(path.join(rootDir, 'packages'));
|
| - List<UriResolver> uriResolvers = [
|
| - new DartUriResolver(sdk),
|
| - new PackageUriResolver(<JavaFile>[packagesDir]),
|
| - new FileUriResolver()
|
| - ];
|
| - context.sourceFactory = new SourceFactory(uriResolvers);
|
| - Source taskSource =
|
| - setupSource(path.join('lib', 'src', 'task', 'dart.dart'));
|
| - Source modelSource = setupSource(path.join('lib', 'task', 'model.dart'));
|
| - CompilationUnitElement modelElement = getUnit(modelSource).element;
|
| - InterfaceType analysisTaskType = modelElement.getType('AnalysisTask').type;
|
| - DartType dynamicType = context.typeProvider.dynamicType;
|
| - resultDescriptorType = modelElement
|
| - .getType('ResultDescriptor')
|
| - .type
|
| - .substitute4([dynamicType]);
|
| - CompilationUnit taskUnit = getUnit(taskSource);
|
| - CompilationUnitElement taskUnitElement = taskUnit.element;
|
| - print('digraph G {');
|
| - Set<String> results = new Set<String>();
|
| - for (ClassElement cls in taskUnitElement.types) {
|
| - if (!cls.isAbstract && cls.type.isSubtypeOf(analysisTaskType)) {
|
| - String task = cls.name;
|
| - // TODO(paulberry): node is deprecated. What am I supposed to do
|
| - // instead?
|
| - findResultDescriptors(cls.getMethod('buildInputs').node,
|
| - (String input) {
|
| - results.add(input);
|
| - print(' $input -> $task');
|
| - });
|
| - findResultDescriptors(cls.getField('DESCRIPTOR').node, (String output) {
|
| - results.add(output);
|
| - print(' $task -> $output');
|
| - });
|
| - }
|
| - }
|
| - for (String result in results) {
|
| - print(' $result [shape=box]');
|
| - }
|
| - print('}');
|
| - }
|
| -
|
| - Source setupSource(String filename) {
|
| - String filePath = path.join(rootDir, filename);
|
| - File file = resourceProvider.getResource(filePath);
|
| - Source source = file.createSource();
|
| - Uri restoredUri = context.sourceFactory.restoreUri(source);
|
| - if (restoredUri != null) {
|
| - source = file.createSource(restoredUri);
|
| - }
|
| - ChangeSet changeSet = new ChangeSet();
|
| - changeSet.addedSource(source);
|
| - context.applyChanges(changeSet);
|
| - return source;
|
| - }
|
| -}
|
| -
|
| -class ResultDescriptorFinder extends GeneralizingAstVisitor {
|
| - final InterfaceType resultDescriptorType;
|
| - final ResultDescriptorFinderCallback callback;
|
| -
|
| - ResultDescriptorFinder(this.resultDescriptorType, this.callback);
|
| -
|
| - @override
|
| - visitIdentifier(Identifier node) {
|
| - Element element = node.staticElement;
|
| - if (element is PropertyAccessorElement &&
|
| - element.isGetter &&
|
| - element.returnType.isSubtypeOf(resultDescriptorType)) {
|
| - callback(element);
|
| - }
|
| - }
|
| -}
|
|
|