| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 /** | 5 /** |
| 6 * A script to assist in documenting the difference between the dart:html API | 6 * A script to assist in documenting the difference between the dart:html API |
| 7 * and the old DOM API. | 7 * and the old DOM API. |
| 8 */ | 8 */ |
| 9 library html_diff; | 9 library html_diff; |
| 10 | 10 |
| 11 import 'dart:io'; | 11 import 'dart:io'; |
| 12 import 'dart:async'; | 12 import 'dart:async'; |
| 13 import '../../sdk/lib/html/html_common/metadata.dart'; | 13 import '../../sdk/lib/html/html_common/metadata.dart'; |
| 14 import 'lib/metadata.dart'; | 14 import 'lib/metadata.dart'; |
| 15 | 15 |
| 16 // TODO(rnystrom): Use "package:" URL (#4968). | 16 // TODO(rnystrom): Use "package:" URL (#4968). |
| 17 import '../../sdk/lib/_internal/dartdoc/lib/dartdoc.dart'; | 17 import '../../sdk/lib/_internal/dartdoc/lib/dartdoc.dart'; |
| 18 import '../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart'; | 18 import '../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart'; |
| 19 import '../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dar
t'; | 19 import '../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dar
t'; |
| 20 import '../../sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.d
art'; |
| 20 | 21 |
| 21 // TODO(amouravski): There is currently magic that looks at dart:* libraries | 22 // TODO(amouravski): There is currently magic that looks at dart:* libraries |
| 22 // rather than the declared library names. This changed due to recent syntax | 23 // rather than the declared library names. This changed due to recent syntax |
| 23 // changes. We should only need to look at the library 'html'. | 24 // changes. We should only need to look at the library 'html'. |
| 24 const List<String> HTML_LIBRARY_NAMES = const [ | 25 const List<String> HTML_LIBRARY_NAMES = const [ |
| 25 'dart:html', | 26 'dart:html', |
| 26 'dart:svg', | 27 'dart:svg', |
| 27 'dart:web_audio']; | 28 'dart:web_audio']; |
| 28 const List<String> HTML_DECLARED_NAMES = const [ | 29 const List<String> HTML_DECLARED_NAMES = const [ |
| 29 'dart.dom.html', | 30 'dart.dom.html', |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 * `@DomName` member(s). | 63 * `@DomName` member(s). |
| 63 */ | 64 */ |
| 64 final Map<String, Set<String>> htmlToDom; | 65 final Map<String, Set<String>> htmlToDom; |
| 65 | 66 |
| 66 /** A map from `dart:html` types to corresponding `@DomName` types. */ | 67 /** A map from `dart:html` types to corresponding `@DomName` types. */ |
| 67 final Map<String, Set<String>> htmlTypesToDom; | 68 final Map<String, Set<String>> htmlTypesToDom; |
| 68 | 69 |
| 69 /** If true, then print warning messages. */ | 70 /** If true, then print warning messages. */ |
| 70 final bool _printWarnings; | 71 final bool _printWarnings; |
| 71 | 72 |
| 72 static Compilation _compilation; | |
| 73 static MirrorSystem _mirrors; | |
| 74 static LibraryMirror dom; | 73 static LibraryMirror dom; |
| 75 | 74 |
| 76 /** | |
| 77 * Perform static initialization of [world]. This should be run before | |
| 78 * calling [HtmlDiff.run]. | |
| 79 */ | |
| 80 static void initialize(Path libDir) { | |
| 81 var paths = <Path>[]; | |
| 82 for (var libraryName in HTML_LIBRARY_NAMES) { | |
| 83 paths.add(new Path(libraryName)); | |
| 84 } | |
| 85 _compilation = new Compilation.library(paths, libDir); | |
| 86 _mirrors = _compilation.mirrors; | |
| 87 } | |
| 88 | |
| 89 HtmlDiff({bool printWarnings: false}) : | 75 HtmlDiff({bool printWarnings: false}) : |
| 90 _printWarnings = printWarnings, | 76 _printWarnings = printWarnings, |
| 91 htmlToDom = new Map<String, Set<String>>(), | 77 htmlToDom = new Map<String, Set<String>>(), |
| 92 htmlTypesToDom = new Map<String, Set<String>>(); | 78 htmlTypesToDom = new Map<String, Set<String>>(); |
| 93 | 79 |
| 94 void warn(String s) { | 80 void warn(String s) { |
| 95 if (_printWarnings) { | 81 if (_printWarnings) { |
| 96 print('Warning: $s'); | 82 print('Warning: $s'); |
| 97 } | 83 } |
| 98 } | 84 } |
| 99 | 85 |
| 100 /** | 86 /** |
| 101 * Computes the `@DomName` to `dart:html` mapping, and | 87 * Computes the `@DomName` to `dart:html` mapping, and |
| 102 * places it in [htmlToDom] and [htmlTypesToDom]. Before this is run, dart2js | 88 * places it in [htmlToDom] and [htmlTypesToDom]. Before this is run, dart2js |
| 103 * should be initialized (via [parseOptions] and [initializeWorld]) and | 89 * should be initialized (via [parseOptions] and [initializeWorld]) and |
| 104 * [HtmlDiff.initialize] should be called. | 90 * [HtmlDiff.initialize] should be called. |
| 105 */ | 91 */ |
| 106 void run() { | 92 Future run(Path libDir) { |
| 107 for (var libraryName in HTML_DECLARED_NAMES) { | 93 var result = new Completer(); |
| 108 var library = _mirrors.libraries[libraryName]; | 94 var paths = <Path>[]; |
| 109 if (library == null) { | 95 for (var libraryName in HTML_LIBRARY_NAMES) { |
| 110 warn('Could not find $libraryName'); | 96 paths.add(new Path(libraryName)); |
| 111 return; | 97 } |
| 98 analyze(paths, libDir).then((MirrorSystem mirrors) { |
| 99 for (var libraryName in HTML_DECLARED_NAMES) { |
| 100 var library = mirrors.libraries[libraryName]; |
| 101 if (library == null) { |
| 102 warn('Could not find $libraryName'); |
| 103 result.complete(false); |
| 104 } |
| 105 for (ClassMirror type in library.classes.values) { |
| 106 final domTypes = htmlToDomTypes(type); |
| 107 if (domTypes.isEmpty) continue; |
| 108 |
| 109 htmlTypesToDom.putIfAbsent(type.qualifiedName, |
| 110 () => new Set()).addAll(domTypes); |
| 111 |
| 112 type.members.forEach( |
| 113 (_, m) => _addMemberDiff(m, domTypes, library.simpleName)); |
| 114 } |
| 112 } | 115 } |
| 113 for (ClassMirror type in library.classes.values) { | 116 result.complete(true); |
| 114 final domTypes = htmlToDomTypes(type); | 117 }); |
| 115 if (domTypes.isEmpty) continue; | 118 return result.future; |
| 116 | |
| 117 htmlTypesToDom.putIfAbsent(type.qualifiedName, | |
| 118 () => new Set()).addAll(domTypes); | |
| 119 | |
| 120 type.members.forEach( | |
| 121 (_, m) => _addMemberDiff(m, domTypes, library.simpleName)); | |
| 122 } | |
| 123 } | |
| 124 } | 119 } |
| 125 | 120 |
| 126 /** | 121 /** |
| 127 * Records the `@DomName` to `dart:html` mapping for | 122 * Records the `@DomName` to `dart:html` mapping for |
| 128 * [htmlMember] (from `dart:html`). [domTypes] are the | 123 * [htmlMember] (from `dart:html`). [domTypes] are the |
| 129 * `@DomName` type values that correspond to [htmlMember]'s | 124 * `@DomName` type values that correspond to [htmlMember]'s |
| 130 * defining type. | 125 * defining type. |
| 131 */ | 126 */ |
| 132 void _addMemberDiff(MemberMirror htmlMember, List<String> domTypes, | 127 void _addMemberDiff(MemberMirror htmlMember, List<String> domTypes, |
| 133 String libraryName) { | 128 String libraryName) { |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 228 return members; | 223 return members; |
| 229 } | 224 } |
| 230 | 225 |
| 231 if (name.split('.').length != 2) { | 226 if (name.split('.').length != 2) { |
| 232 warn('invalid member name ${name}'); | 227 warn('invalid member name ${name}'); |
| 233 return new Set(); | 228 return new Set(); |
| 234 } | 229 } |
| 235 return new Set.from([name]); | 230 return new Set.from([name]); |
| 236 } | 231 } |
| 237 } | 232 } |
| OLD | NEW |