| Index: pkg/dev_compiler/tool/patch_sdk.dart
|
| diff --git a/pkg/dev_compiler/tool/patch_sdk.dart b/pkg/dev_compiler/tool/patch_sdk.dart
|
| index 00ec5db14fa36ade328ee1d31621239b0a7ff2f8..2b716403460ead755dff742122650cf14edd8810 100755
|
| --- a/pkg/dev_compiler/tool/patch_sdk.dart
|
| +++ b/pkg/dev_compiler/tool/patch_sdk.dart
|
| @@ -15,39 +15,42 @@ import 'package:path/path.dart' as path;
|
|
|
| void main(List<String> argv) {
|
| var self = path.relative(path.fromUri(Platform.script));
|
| - if (argv.length < 2) {
|
| + if (argv.length < 3) {
|
| var toolDir = path.relative(path.dirname(path.fromUri(Platform.script)));
|
|
|
| - var inputExample = path.join(toolDir, 'input_sdk');
|
| + var inputExample = path.join(toolDir, '..', '..', '..');
|
| + var patchExample = path.join(toolDir, 'input_sdk');
|
| var outExample =
|
| path.relative(path.normalize(path.join('gen', 'patched_sdk')));
|
|
|
| - print('Usage: $self INPUT_DIR OUTPUT_DIR');
|
| + print('Usage: $self INPUT_SDK_DIR PATCH_DIR OUTPUT_DIR');
|
| print('For example:');
|
| - print('\$ $self $inputExample $outExample');
|
| + print('\$ $self $inputExample $patchExample $outExample');
|
| exit(1);
|
| }
|
|
|
| var selfModifyTime = new File(self).lastModifiedSync().millisecondsSinceEpoch;
|
|
|
| - 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 inputDir = argv[0];
|
| + var patchDir = argv[1];
|
| + var sdkLibIn = path.join(inputDir, 'sdk', 'lib');
|
| + var patchIn = path.join(patchDir, 'patch');
|
| + var privateIn = path.join(patchDir, 'private');
|
| + var sdkOut = path.join(argv[2], 'lib');
|
|
|
| - var INTERNAL_PATH = '_internal/compiler/js_lib/';
|
| + var INTERNAL_PATH = '_internal/js_runtime/lib/';
|
|
|
| // Copy libraries.dart and version
|
| - var libContents = new File(path.join(sdkLibIn, '_internal', 'libraries.dart'))
|
| - .readAsStringSync();
|
| + var librariesDart = path.join(patchDir, 'libraries.dart');
|
| + var libContents = new File(librariesDart).readAsStringSync();
|
| + // TODO(jmesserly): can we remove this?
|
| _writeSync(path.join(sdkOut, '_internal', 'libraries.dart'), libContents);
|
| _writeSync(
|
| path.join(
|
| sdkOut, '_internal', 'sdk_library_metadata', 'lib', 'libraries.dart'),
|
| libContents);
|
| _writeSync(path.join(sdkOut, '..', 'version'),
|
| - new File(path.join(sdkLibIn, '..', 'version')).readAsStringSync());
|
| + new File(path.join(inputDir, 'tools', 'VERSION')).readAsStringSync());
|
|
|
| // Parse libraries.dart
|
| var sdkLibraries = _getSdkLibraries(libContents);
|
| @@ -60,10 +63,13 @@ void main(List<String> argv) {
|
| if (library.isVmLibrary) continue;
|
|
|
| var libraryOut = path.join(sdkLibIn, library.path);
|
| + var libraryOverride = path.join(patchDir, 'lib', library.path);
|
| var libraryIn;
|
| if (library.path.contains(INTERNAL_PATH)) {
|
| libraryIn =
|
| path.join(privateIn, library.path.replaceAll(INTERNAL_PATH, ''));
|
| + } else if (new File(libraryOverride).existsSync()) {
|
| + libraryIn = libraryOverride;
|
| } else {
|
| libraryIn = libraryOut;
|
| }
|
| @@ -124,8 +130,12 @@ void main(List<String> argv) {
|
| contents = _patchLibrary(contents, patchContents);
|
| }
|
|
|
| - for (var i = 0; i < outPaths.length; i++) {
|
| - _writeSync(outPaths[i], contents[i]);
|
| + if (contents != null) {
|
| + for (var i = 0; i < outPaths.length; i++) {
|
| + _writeSync(outPaths[i], contents[i]);
|
| + }
|
| + } else {
|
| + exitCode = 2;
|
| }
|
| }
|
| }
|
| @@ -167,12 +177,16 @@ List<String> _patchLibrary(List<String> partsContents, String patchContents) {
|
| var patchFinder = new PatchFinder.parseAndVisit(patchContents);
|
|
|
| // Merge `external` declarations with the corresponding `@patch` code.
|
| + bool failed = false;
|
| for (var partContent in partsContents) {
|
| var partEdits = new StringEditBuffer(partContent);
|
| var partUnit = parseCompilationUnit(partContent);
|
| - partUnit.accept(new PatchApplier(partEdits, patchFinder));
|
| + var patcher = new PatchApplier(partEdits, patchFinder);
|
| + partUnit.accept(patcher);
|
| + if (!failed) failed = patcher.patchWasMissing;
|
| results.add(partEdits);
|
| }
|
| + if (failed) return null;
|
| return new List<String>.from(results.map((e) => e.toString()));
|
| }
|
|
|
| @@ -182,6 +196,7 @@ class PatchApplier extends GeneralizingAstVisitor {
|
| final PatchFinder patch;
|
|
|
| bool _isLibrary = true; // until proven otherwise.
|
| + bool patchWasMissing = false;
|
|
|
| PatchApplier(this.edits, this.patch);
|
|
|
| @@ -258,6 +273,7 @@ class PatchApplier extends GeneralizingAstVisitor {
|
| var patchNode = patch.patches[name];
|
| if (patchNode == null) {
|
| print('warning: patch not found for $name: $node');
|
| + patchWasMissing = true;
|
| return;
|
| }
|
|
|
|
|