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) { |
- 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; |
+} |