Chromium Code Reviews| Index: tool/patch_sdk.dart |
| diff --git a/tool/patch_sdk.dart b/tool/patch_sdk.dart |
| index ae1a1abc1f0a2b6de607a5854be21e4dc40736b4..d3c507b58f3b09472060c722c6579fd1e73ed4b4 100755 |
| --- a/tool/patch_sdk.dart |
| +++ b/tool/patch_sdk.dart |
| @@ -10,42 +10,54 @@ library dev_compiler.tool.patch_sdk; |
| import 'dart:io'; |
| import 'package:analyzer/analyzer.dart'; |
| +import 'package:analyzer/src/generated/sdk.dart'; |
| import 'package:path/path.dart' as path; |
| -import 'input_sdk/lib/_internal/libraries.dart' as sdk; |
| - |
| void main(List<String> argv) { |
|
Jennifer Messerly
2015/03/19 22:57:34
These changes aren't really needed, but they let p
|
| - var toolDir = path.relative(path.dirname(Platform.script.path)); |
| - var sdkLibIn = path.join(toolDir, 'input_sdk', 'lib'); |
| - var patchIn = path.join(toolDir, 'input_sdk', 'patch'); |
| - var privateIn = path.join(toolDir, 'input_sdk', 'private'); |
| - var sdkOut = |
| - path.normalize(path.join(toolDir, '..', 'test', 'generated_sdk', 'lib')); |
| - var privateLibOut = |
| - path.normalize(path.join(sdkOut, '_internal', 'compiler', 'js_lib')); |
| + if (argv.length < 2) { |
| + var self = path.relative(Platform.script.path); |
| + var toolDir = path.relative(path.dirname(Platform.script.path)); |
| - var INTERNAL_PATH = '_internal/compiler/js_lib/'; |
| + var inputExample = path.join(toolDir, 'input_sdk'); |
| + var outExample = path.relative( |
| + path.normalize(path.join(toolDir, '..', 'test', 'generated_sdk'))); |
| + |
| + print('Usage: $self INPUT_DIR OUTPUT_DIR'); |
| + print('For example:'); |
| + print('\$ $self $inputExample $outExample'); |
| - if (argv.isNotEmpty) { |
| - print('Usage: ${path.relative(Platform.script.path)}\n'); |
| - print('input SDK directory: $sdkLibIn'); |
| - // We can freely make changes to these two. |
| - print('input private libs directory: $privateIn'); |
| - print('input patch directory: $patchIn'); |
| - print('output SDK directory: $sdkOut'); |
| + inputExample = path.join(toolDir, 'min_sdk'); |
| + outExample = path.join(toolDir, 'out', 'min_sdk'); |
| + print('\$ $self $inputExample $outExample'); |
| exit(1); |
| } |
| + var input = argv[0]; |
| + var sdkLibIn = path.join(input, 'lib'); |
| + var patchIn = path.join(input, 'patch'); |
| + var privateIn = path.join(input, 'private'); |
| + var sdkOut = path.join(argv[1], 'lib'); |
| + var privateLibOut = |
| + path.normalize(path.join(sdkOut, '_internal', 'compiler', 'js_lib')); |
| + |
| + var INTERNAL_PATH = '_internal/compiler/js_lib/'; |
| + |
| // Copy libraries.dart and version |
| - _writeSync(path.join(sdkOut, '_internal', 'libraries.dart'), |
| - new File(path.join(sdkLibIn, '_internal', 'libraries.dart')) |
| - .readAsStringSync()); |
| + var libContents = new File(path.join(sdkLibIn, '_internal', 'libraries.dart')) |
| + .readAsStringSync(); |
| + _writeSync(path.join(sdkOut, '_internal', 'libraries.dart'), libContents); |
| _writeSync(path.join(sdkOut, '..', 'version'), |
| new File(path.join(sdkLibIn, '..', 'version')).readAsStringSync()); |
| + // Parse libraries.dart |
| + var sdkLibraries = _getSdkLibraries(libContents); |
| + |
| // Enumerate core libraries and apply patches |
| - for (var library in sdk.LIBRARIES.values) { |
| - if (library.platforms & sdk.DART2JS_PLATFORM == 0) continue; |
| + for (SdkLibrary library in sdkLibraries) { |
| + // TODO(jmesserly): analyzer does not handle the default case of |
| + // "both platforms" correctly, and treats it as being supported on neither. |
| + // So instead we skip explicitly marked as VM libs. |
| + if (library.isVmLibrary) continue; |
| var libraryOut = path.join(sdkLibIn, library.path); |
| var libraryIn; |
| @@ -72,11 +84,12 @@ void main(List<String> argv) { |
| } |
| } |
| - if (library.dart2jsPatchPath != null) { |
| - var patchPath = path.join( |
| - patchIn, library.dart2jsPatchPath.replaceAll(INTERNAL_PATH, '')); |
| - var patchContents = new File(patchPath).readAsStringSync(); |
| + // See if we can find a patch file. |
| + var patchPath = path.join( |
| + patchIn, path.basenameWithoutExtension(libraryIn) + '_patch.dart'); |
| + if (new File(patchPath).existsSync()) { |
| + var patchContents = new File(patchPath).readAsStringSync(); |
| contents = _patchLibrary(contents, patchContents); |
| } |
| for (var i = 0; i < paths.length; i++) { |
| @@ -90,8 +103,6 @@ void main(List<String> argv) { |
| /// Writes a file, creating the directory if needed. |
| void _writeSync(String filePath, String contents) { |
| - print('Writing $filePath'); |
| - |
| var outDir = new Directory(path.dirname(filePath)); |
| if (!outDir.existsSync()) outDir.createSync(recursive: true); |
| @@ -197,7 +208,10 @@ class PatchApplier extends GeneralizingAstVisitor { |
| var name = _qualifiedName(node); |
| var patchNode = patch.patches[name]; |
| - if (patchNode == null) throw 'patch not found for $name: $node'; |
| + if (patchNode == null) { |
| + print('warning: patch not found for $name: $node'); |
| + return; |
| + } |
| Annotation patchMeta = patchNode.metadata.lastWhere(_isPatchAnnotation); |
| int start = patchMeta.endToken.next.offset; |
| @@ -258,10 +272,6 @@ class PatchFinder extends GeneralizingAstVisitor { |
| } |
| String _qualifiedName(Declaration node) { |
| - assert(node is MethodDeclaration || |
| - node is FunctionDeclaration || |
| - node is ConstructorDeclaration); |
| - |
| var parent = node.parent; |
| var className = ''; |
| if (parent is ClassDeclaration) { |
| @@ -368,3 +378,9 @@ class _StringEdit implements Comparable<_StringEdit> { |
| return end - other.end; |
| } |
| } |
| + |
| +List<SdkLibrary> _getSdkLibraries(String contents) { |
| + var libraryBuilder = new SdkLibrariesReader_LibraryBuilder(true); |
| + parseCompilationUnit(contents).accept(libraryBuilder); |
| + return libraryBuilder.librariesMap.sdkLibraries; |
| +} |