Index: pkg/analyzer/tool/task_dependency_graph/generate.dart |
diff --git a/pkg/analyzer/tool/task_dependency_graph.dart b/pkg/analyzer/tool/task_dependency_graph/generate.dart |
similarity index 82% |
rename from pkg/analyzer/tool/task_dependency_graph.dart |
rename to pkg/analyzer/tool/task_dependency_graph/generate.dart |
index ec28f5213b7825591388e306b8fa958a291faee6..efc0d0cffc356d9a71f2bc49afb7252488067226 100644 |
--- a/pkg/analyzer/tool/task_dependency_graph.dart |
+++ b/pkg/analyzer/tool/task_dependency_graph/generate.dart |
@@ -7,10 +7,6 @@ |
* 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.dot -Tpdf -O". |
- * |
* TODO(paulberry): |
* - Add general.dart and html.dart for completeness. |
* - Use Graphviz's "record" feature to produce more compact output |
@@ -19,9 +15,10 @@ |
* of exactly one task. |
* - Convert this tool to use package_config to find the package map. |
*/ |
-library task_dependency_graph; |
+library task_dependency_graph.generate; |
import 'dart:io' hide File; |
+import 'dart:io' as io; |
import 'package:analyzer/analyzer.dart'; |
import 'package:analyzer/file_system/file_system.dart'; |
@@ -36,8 +33,11 @@ import 'package:analyzer/src/generated/source.dart'; |
import 'package:analyzer/src/generated/source_io.dart'; |
import 'package:path/path.dart' as path; |
+/** |
+ * Generate the target .dot file. |
+ */ |
main() { |
- new Driver().run(); |
+ new Driver().generateFile(); |
} |
typedef void GetterFinderCallback(PropertyAccessorElement element); |
@@ -50,7 +50,30 @@ class Driver { |
ClassElement enginePluginClass; |
CompilationUnitElement taskUnitElement; |
InterfaceType extensionPointIdType; |
- String rootDir; |
+ final String rootDir; |
+ |
+ Driver() |
+ : rootDir = |
+ findRoot(Platform.script.toFilePath(windows: Platform.isWindows)); |
+ |
+ /** |
+ * Get an [io.File] object corresponding to the file in which the generated |
+ * graph should be output. |
+ */ |
+ io.File get file => new io.File( |
+ path.join(rootDir, 'tool', 'task_dependency_graph', 'tasks.dot')); |
+ |
+ /** |
+ * Determine if the output [file] contains the expected contents. |
+ */ |
+ bool checkFile() { |
+ String expectedContents = generateFileContents(); |
+ String actualContents = file.readAsStringSync(); |
+ // Normalize Windows line endings to Unix line endings so that the |
+ // comparison doesn't fail on Windows. |
+ actualContents = actualContents.replaceAll('\r\n', '\n'); |
+ return expectedContents == actualContents; |
+ } |
/** |
* Starting at [node], find all calls to registerExtension() which refer to |
@@ -100,25 +123,18 @@ class Driver { |
} |
/** |
- * Find the root directory of the analyzer package by proceeding |
- * upward to the 'tool' dir, and then going up one more directory. |
+ * Generate the task dependency graph and write it to the output [file]. |
*/ |
- 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); |
+ void generateFile() { |
+ String fileContents = generateFileContents(); |
+ file.writeAsStringSync(fileContents); |
} |
- CompilationUnit getUnit(Source source) => |
- context.resolveCompilationUnit2(source, source); |
- |
- void run() { |
- rootDir = findRoot(Platform.script.toFilePath(windows: Platform.isWindows)); |
+ /** |
+ * Generate the task dependency graph and return it as a [String]. |
+ */ |
+ String generateFileContents() { |
+ List<String> lines = <String>[]; |
resourceProvider = PhysicalResourceProvider.INSTANCE; |
DartSdk sdk = DirectoryBasedDartSdk.defaultSdk; |
context = AnalysisEngine.instance.createAnalysisContext(); |
@@ -153,7 +169,6 @@ class Driver { |
CompilationUnitElement dartDartUnitElement = dartDartUnit.element; |
CompilationUnit taskUnit = getUnit(taskSource); |
taskUnitElement = taskUnit.element; |
- print('digraph G {'); |
Set<String> results = new Set<String>(); |
Set<String> resultLists = new Set<String>(); |
for (ClassElement cls in dartDartUnitElement.types) { |
@@ -164,33 +179,51 @@ class Driver { |
AstNode buildInputsAst = cls.getMethod('buildInputs').node; |
findResultDescriptors(buildInputsAst, (String input) { |
results.add(input); |
- print(' $input -> $task'); |
+ lines.add(' $input -> $task'); |
}); |
findResultDescriptorLists(buildInputsAst, (String input) { |
resultLists.add(input); |
- print(' $input -> $task'); |
+ lines.add(' $input -> $task'); |
}); |
- findResultDescriptors(cls.getField('DESCRIPTOR').node, (String output) { |
- results.add(output); |
- print(' $task -> $output'); |
+ findResultDescriptors(cls.getField('DESCRIPTOR').node, (String out) { |
+ results.add(out); |
+ lines.add(' $task -> $out'); |
}); |
} |
} |
AstNode enginePluginAst = enginePluginUnitElement.node; |
for (String resultList in resultLists) { |
- print(' $resultList [shape=hexagon]'); |
+ lines.add(' $resultList [shape=hexagon]'); |
TopLevelVariableElement extensionIdVariable = _getExtensionId(resultList); |
findExtensions(enginePluginAst, extensionIdVariable, (String extension) { |
results.add(extension); |
- print(' $extension -> $resultList'); |
+ lines.add(' $extension -> $resultList'); |
}); |
} |
for (String result in results) { |
- print(' $result [shape=box]'); |
+ lines.add(' $result [shape=box]'); |
} |
- print('}'); |
+ lines.sort(); |
+ return ''' |
+// 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 has been automatically generated. Please do not edit it manually. |
+// To regenerate the file, use the script |
+// "pkg/analyzer/tool/task_dependency_graph/generate.dart". |
+// |
+// To render this graph using Graphviz (www.graphviz.org) use the command: |
+// "dot tasks.dot -Tpdf -O". |
+digraph G { |
+${lines.join('\n')} |
+} |
+'''; |
} |
+ CompilationUnit getUnit(Source source) => |
+ context.resolveCompilationUnit2(source, source); |
+ |
Source setupSource(String filename) { |
String filePath = path.join(rootDir, filename); |
File file = resourceProvider.getResource(filePath); |
@@ -233,6 +266,21 @@ class Driver { |
throw new Exception( |
'Could not find extension ID corresponding to $resultListGetterName'); |
} |
+ |
+ /** |
+ * Find the root directory of the analyzer package by proceeding |
+ * upward to the 'tool' dir, and then going up one more directory. |
+ */ |
+ static 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); |
+ } |
} |
/** |