Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(280)

Unified Diff: pkg/analyzer/lib/src/codegen/tools.dart

Issue 1428673004: Rework codegen tools to avoid relying on CWD; integrate with task model graph. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | pkg/analyzer/tool/task_dependency_graph/check_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/lib/src/codegen/tools.dart
diff --git a/pkg/analyzer/lib/src/codegen/tools.dart b/pkg/analyzer/lib/src/codegen/tools.dart
index 3b2115d91a2ce7b498671fa77216fd722e776d24..dac63d15281ec183d8de4b414929b26b4b787369 100644
--- a/pkg/analyzer/lib/src/codegen/tools.dart
+++ b/pkg/analyzer/lib/src/codegen/tools.dart
@@ -15,8 +15,8 @@ import 'package:path/path.dart';
import 'html.dart';
import 'text_formatter.dart';
-final RegExp trailingWhitespaceRegExp = new RegExp(r'[\n ]+$');
final RegExp trailingSpacesInLineRegExp = new RegExp(r' +$', multiLine: true);
+final RegExp trailingWhitespaceRegExp = new RegExp(r'[\n ]+$');
/**
* Join the given strings using camelCase. If [doCapitalize] is true, the first
@@ -43,13 +43,16 @@ String capitalize(String string) {
/**
* Type of functions used to compute the contents of a set of generated files.
+ * [pkgPath] is the path to the current package.
*/
-typedef Map<String, FileContentsComputer> DirectoryContentsComputer();
+typedef Map<String, FileContentsComputer> DirectoryContentsComputer(
+ String pkgPath);
/**
* Type of functions used to compute the contents of a generated file.
+ * [pkgPath] is the path to the current package.
*/
-typedef String FileContentsComputer();
+typedef String FileContentsComputer(String pkgPath);
/**
* Mixin class for generating code.
@@ -261,10 +264,28 @@ class CodeGeneratorSettings {
this.indent: ' '});
}
+/**
+ * Abstract base class representing behaviors common to generated files and
+ * generated directories.
+ */
abstract class GeneratedContent {
- FileSystemEntity get outputFile;
- bool check();
- void generate();
+ /**
+ * Check whether the [output] has the correct contents, and return true if it
+ * does. [pkgPath] is the path to the current package.
+ */
+ bool check(String pkgPath);
+
+ /**
+ * Replace the [output] with the correct contents. [pkgPath] is the path to
+ * the current package.
+ */
+ void generate(String pkgPath);
+
+ /**
+ * Get a [FileSystemEntity] representing the output file or directory.
+ * [pkgPath] is the path to the current package.
+ */
+ FileSystemEntity output(String pkgPath);
}
/**
@@ -284,25 +305,15 @@ class GeneratedDirectory extends GeneratedContent {
GeneratedDirectory(this.outputDirPath, this.directoryContentsComputer);
- /**
- * Get a Directory object representing the output directory.
- */
- Directory get outputFile =>
- new Directory(joinAll(posix.split(outputDirPath)));
-
- /**
- * Check whether the directory has the correct contents, and return true if it
- * does.
- */
@override
- bool check() {
- Map<String, FileContentsComputer> map = directoryContentsComputer();
+ bool check(String pkgPath) {
+ Directory outputDirectory = output(pkgPath);
+ Map<String, FileContentsComputer> map = directoryContentsComputer(pkgPath);
try {
for (String file in map.keys) {
FileContentsComputer fileContentsComputer = map[file];
- String expectedContents = fileContentsComputer();
- File outputFile =
- new File(joinAll(posix.split(posix.join(outputDirPath, file))));
+ String expectedContents = fileContentsComputer(pkgPath);
+ File outputFile = new File(posix.join(outputDirectory.path, file));
String actualContents = outputFile.readAsStringSync();
// Normalize Windows line endings to Unix line endings so that the
// comparison doesn't fail on Windows.
@@ -312,7 +323,7 @@ class GeneratedDirectory extends GeneratedContent {
}
}
int nonHiddenFileCount = 0;
- outputFile
+ outputDirectory
.listSync(recursive: false, followLinks: false)
.forEach((FileSystemEntity fileSystemEntity) {
if (fileSystemEntity is File &&
@@ -334,30 +345,30 @@ class GeneratedDirectory extends GeneratedContent {
return true;
}
- /**
- * Replace the directory with the correct contents. [spec] is the "tool/spec"
- * directory. If [spec] is unspecified, it is assumed to be the directory
- * containing Platform.executable.
- */
@override
- void generate() {
+ void generate(String pkgPath) {
+ Directory outputDirectory = output(pkgPath);
try {
// delete the contents of the directory (and the directory itself)
- outputFile.deleteSync(recursive: true);
+ outputDirectory.deleteSync(recursive: true);
} catch (e) {
// Error caught while trying to delete the directory, this can happen if
// it didn't yet exist.
}
// re-create the empty directory
- outputFile.createSync(recursive: true);
+ outputDirectory.createSync(recursive: true);
// generate all of the files in the directory
- Map<String, FileContentsComputer> map = directoryContentsComputer();
+ Map<String, FileContentsComputer> map = directoryContentsComputer(pkgPath);
map.forEach((String file, FileContentsComputer fileContentsComputer) {
- File outputFile = new File(joinAll(posix.split(outputDirPath + file)));
- outputFile.writeAsStringSync(fileContentsComputer());
+ File outputFile = new File(posix.join(outputDirectory.path, file));
+ outputFile.writeAsStringSync(fileContentsComputer(pkgPath));
});
}
+
+ @override
+ Directory output(String pkgPath) =>
+ new Directory(join(pkgPath, joinAll(posix.split(outputDirPath))));
}
/**
@@ -379,18 +390,10 @@ class GeneratedFile extends GeneratedContent {
GeneratedFile(this.outputPath, this.computeContents);
- /**
- * Get a File object representing the output file.
- */
- File get outputFile => new File(joinAll(posix.split(outputPath)));
-
- /**
- * Check whether the file has the correct contents, and return true if it
- * does.
- */
@override
- bool check() {
- String expectedContents = computeContents();
+ bool check(String pkgPath) {
+ File outputFile = output(pkgPath);
+ String expectedContents = computeContents(pkgPath);
try {
String actualContents = outputFile.readAsStringSync();
// Normalize Windows line endings to Unix line endings so that the
@@ -405,14 +408,14 @@ class GeneratedFile extends GeneratedContent {
}
}
- /**
- * Replace the file with the correct contents. [spec] is the "tool/spec"
- * directory. If [spec] is unspecified, it is assumed to be the directory
- * containing Platform.executable.
- */
- void generate() {
- outputFile.writeAsStringSync(computeContents());
+ @override
+ void generate(String pkgPath) {
+ output(pkgPath).writeAsStringSync(computeContents(pkgPath));
}
+
+ @override
+ File output(String pkgPath) =>
+ new File(join(pkgPath, joinAll(posix.split(outputPath))));
}
/**
« no previous file with comments | « no previous file | pkg/analyzer/tool/task_dependency_graph/check_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698