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 da7181287fb0fd7f616199672d78a3e01680cd82..ff53db630540eb544030497dcdba56ec61e99d11 100644 |
--- a/pkg/analyzer/lib/src/codegen/tools.dart |
+++ b/pkg/analyzer/lib/src/codegen/tools.dart |
@@ -7,12 +7,9 @@ |
*/ |
library analyzer.src.codegen.tools; |
-import 'dart:io'; |
- |
import 'package:analyzer/src/codegen/html.dart'; |
import 'package:analyzer/src/codegen/text_formatter.dart'; |
import 'package:html/dom.dart' as dom; |
-import 'package:path/path.dart'; |
final RegExp trailingSpacesInLineRegExp = new RegExp(r' +$', multiLine: true); |
final RegExp trailingWhitespaceRegExp = new RegExp(r'[\n ]+$'); |
@@ -41,19 +38,6 @@ 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( |
- 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(String pkgPath); |
- |
-/** |
* Mixin class for generating code. |
*/ |
class CodeGenerator { |
@@ -266,207 +250,6 @@ class CodeGeneratorSettings { |
} |
/** |
- * Abstract base class representing behaviors common to generated files and |
- * generated directories. |
- */ |
-abstract class GeneratedContent { |
- /** |
- * 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); |
- |
- /** |
- * Check that all of the [targets] are up to date. If they are not, print |
- * out a message instructing the user to regenerate them, and exit with a |
- * nonzero error code. |
- * |
- * [pkgPath] is the path to the current package. [generatorRelPath] is the |
- * path to a .dart script the user may use to regenerate the targets. |
- * |
- * To avoid mistakes when run on Windows, [generatorRelPath] always uses |
- * POSIX directory separators. |
- */ |
- static void checkAll(String pkgPath, String generatorRelPath, |
- Iterable<GeneratedContent> targets) { |
- bool generateNeeded = false; |
- for (GeneratedContent target in targets) { |
- if (!target.check(pkgPath)) { |
- print( |
- '${target.output(pkgPath).absolute} does not have expected contents.'); |
- generateNeeded = true; |
- } |
- } |
- if (generateNeeded) { |
- print('Please regenerate using:'); |
- String executable = Platform.executable; |
- String packageRoot = ''; |
- if (Platform.packageRoot != null) { |
- packageRoot = ' --package-root=${Platform.packageRoot}'; |
- } |
- String generateScript = |
- join(pkgPath, joinAll(posix.split(generatorRelPath))); |
- print(' $executable$packageRoot $generateScript'); |
- exit(1); |
- } else { |
- print('All generated files up to date.'); |
- } |
- } |
- |
- /** |
- * Regenerate all of the [targets]. [pkgPath] is the path to the current |
- * package. |
- */ |
- static void generateAll(String pkgPath, Iterable<GeneratedContent> targets) { |
- for (GeneratedContent target in targets) { |
- target.generate(pkgPath); |
- } |
- } |
-} |
- |
-/** |
- * Class representing a single output directory (either generated code or |
- * generated HTML). No other content should exist in the directory. |
- */ |
-class GeneratedDirectory extends GeneratedContent { |
- /** |
- * The path to the directory that will have the generated content. |
- */ |
- final String outputDirPath; |
- |
- /** |
- * Callback function that computes the directory contents. |
- */ |
- final DirectoryContentsComputer directoryContentsComputer; |
- |
- GeneratedDirectory(this.outputDirPath, this.directoryContentsComputer); |
- |
- @override |
- 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(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. |
- actualContents = actualContents.replaceAll('\r\n', '\n'); |
- if (expectedContents != actualContents) { |
- return false; |
- } |
- } |
- int nonHiddenFileCount = 0; |
- outputDirectory |
- .listSync(recursive: false, followLinks: false) |
- .forEach((FileSystemEntity fileSystemEntity) { |
- if (fileSystemEntity is File && |
- !basename(fileSystemEntity.path).startsWith('.')) { |
- nonHiddenFileCount++; |
- } |
- }); |
- if (nonHiddenFileCount != map.length) { |
- // The number of files generated doesn't match the number we expected to |
- // generate. |
- return false; |
- } |
- } catch (e) { |
- // There was a problem reading the file (most likely because it didn't |
- // exist). Treat that the same as if the file doesn't have the expected |
- // contents. |
- return false; |
- } |
- return true; |
- } |
- |
- @override |
- void generate(String pkgPath) { |
- Directory outputDirectory = output(pkgPath); |
- try { |
- // delete the contents of the directory (and the directory itself) |
- 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 |
- outputDirectory.createSync(recursive: true); |
- |
- // generate all of the files in the directory |
- Map<String, FileContentsComputer> map = directoryContentsComputer(pkgPath); |
- map.forEach((String file, FileContentsComputer 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)))); |
-} |
- |
-/** |
- * Class representing a single output file (either generated code or generated |
- * HTML). |
- */ |
-class GeneratedFile extends GeneratedContent { |
- /** |
- * The output file to which generated output should be written, relative to |
- * the "tool/spec" directory. This filename uses the posix path separator |
- * ('/') regardless of the OS. |
- */ |
- final String outputPath; |
- |
- /** |
- * Callback function which computes the file. |
- */ |
- final FileContentsComputer computeContents; |
- |
- GeneratedFile(this.outputPath, this.computeContents); |
- |
- @override |
- 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 |
- // comparison doesn't fail on Windows. |
- actualContents = actualContents.replaceAll('\r\n', '\n'); |
- return expectedContents == actualContents; |
- } catch (e) { |
- // There was a problem reading the file (most likely because it didn't |
- // exist). Treat that the same as if the file doesn't have the expected |
- // contents. |
- return false; |
- } |
- } |
- |
- @override |
- void generate(String pkgPath) { |
- output(pkgPath).writeAsStringSync(computeContents(pkgPath)); |
- } |
- |
- @override |
- File output(String pkgPath) => |
- new File(join(pkgPath, joinAll(posix.split(outputPath)))); |
-} |
- |
-/** |
* Mixin class for generating HTML representations of code that are suitable |
* for enclosing inside a <pre> element. |
*/ |