| 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:async'; | 11 import 'dart:async'; |
| 12 import 'dart:io'; | |
| 13 | 12 |
| 14 import 'lib/metadata.dart'; | 13 import 'lib/metadata.dart'; |
| 15 | 14 |
| 16 // TODO(rnystrom): Use "package:" URL (#4968). | 15 // TODO(rnystrom): Use "package:" URL (#4968). |
| 17 import '../../sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.d
art'; | 16 import '../../sdk/lib/_internal/compiler/implementation/mirrors/analyze.dart'; |
| 18 import '../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart'; | 17 import '../../sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.d
art'; |
| 19 import '../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dar
t'; | 18 import '../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dar
t'; |
| 20 import '../../sdk/lib/_internal/compiler/implementation/source_file_provider.dar
t'; | 19 import '../../sdk/lib/_internal/compiler/implementation/source_file_provider.dar
t'; |
| 21 import '../../sdk/lib/_internal/dartdoc/lib/dartdoc.dart'; | |
| 22 import '../../sdk/lib/html/html_common/metadata.dart'; | |
| 23 | 20 |
| 24 // TODO(amouravski): There is currently magic that looks at dart:* libraries | 21 // TODO(amouravski): There is currently magic that looks at dart:* libraries |
| 25 // rather than the declared library names. This changed due to recent syntax | 22 // rather than the declared library names. This changed due to recent syntax |
| 26 // changes. We should only need to look at the library 'html'. | 23 // changes. We should only need to look at the library 'html'. |
| 27 final List<Uri> HTML_LIBRARY_URIS = [ | 24 final List<Uri> HTML_LIBRARY_URIS = [ |
| 28 new Uri(scheme: 'dart', path: 'html'), | 25 new Uri(scheme: 'dart', path: 'html'), |
| 29 new Uri(scheme: 'dart', path: 'indexed_db'), | 26 new Uri(scheme: 'dart', path: 'indexed_db'), |
| 30 new Uri(scheme: 'dart', path: 'svg'), | 27 new Uri(scheme: 'dart', path: 'svg'), |
| 31 new Uri(scheme: 'dart', path: 'web_audio')]; | 28 new Uri(scheme: 'dart', path: 'web_audio')]; |
| 32 | 29 |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 HTML_LIBRARY_URIS, libraryRoot, null, | 93 HTML_LIBRARY_URIS, libraryRoot, null, |
| 97 provider.readStringFromUri, | 94 provider.readStringFromUri, |
| 98 handler.diagnosticHandler); | 95 handler.diagnosticHandler); |
| 99 analysis.then((MirrorSystem mirrors) { | 96 analysis.then((MirrorSystem mirrors) { |
| 100 for (var libraryUri in HTML_LIBRARY_URIS) { | 97 for (var libraryUri in HTML_LIBRARY_URIS) { |
| 101 var library = mirrors.libraries[libraryUri]; | 98 var library = mirrors.libraries[libraryUri]; |
| 102 if (library == null) { | 99 if (library == null) { |
| 103 warn('Could not find $libraryUri'); | 100 warn('Could not find $libraryUri'); |
| 104 result.complete(false); | 101 result.complete(false); |
| 105 } | 102 } |
| 106 for (ClassMirror type in library.classes.values) { | 103 for (ClassMirror type in classesOf(library.declarations)) { |
| 107 final domTypes = htmlToDomTypes(type); | 104 final domTypes = htmlToDomTypes(type); |
| 108 if (domTypes.isEmpty) continue; | 105 if (domTypes.isEmpty) continue; |
| 109 | 106 |
| 110 htmlTypesToDom.putIfAbsent(type.qualifiedName, | 107 htmlTypesToDom.putIfAbsent(qualifiedNameOf(type), |
| 111 () => new Set()).addAll(domTypes); | 108 () => new Set()).addAll(domTypes); |
| 112 | 109 |
| 113 type.members.forEach( | 110 membersOf(type.declarations).forEach( |
| 114 (_, m) => _addMemberDiff(m, domTypes, library.simpleName)); | 111 (m) => _addMemberDiff(m, domTypes, nameOf(library))); |
| 115 } | 112 } |
| 116 } | 113 } |
| 117 result.complete(true); | 114 result.complete(true); |
| 118 }); | 115 }); |
| 119 return result.future; | 116 return result.future; |
| 120 } | 117 } |
| 121 | 118 |
| 122 /** | 119 /** |
| 123 * Records the `@DomName` to `dart:html` mapping for | 120 * Records the `@DomName` to `dart:html` mapping for |
| 124 * [htmlMember] (from `dart:html`). [domTypes] are the | 121 * [htmlMember] (from `dart:html`). [domTypes] are the |
| 125 * `@DomName` type values that correspond to [htmlMember]'s | 122 * `@DomName` type values that correspond to [htmlMember]'s |
| 126 * defining type. | 123 * defining type. |
| 127 */ | 124 */ |
| 128 void _addMemberDiff(MemberMirror htmlMember, List<String> domTypes, | 125 void _addMemberDiff(DeclarationMirror htmlMember, List<String> domTypes, |
| 129 String libraryName) { | 126 String libraryName) { |
| 130 var domMembers = htmlToDomMembers(htmlMember, domTypes); | 127 var domMembers = htmlToDomMembers(htmlMember, domTypes); |
| 131 if (htmlMember == null && !domMembers.isEmpty) { | 128 if (htmlMember == null && !domMembers.isEmpty) { |
| 132 warn('$libraryName member ' | 129 warn('$libraryName member ' |
| 133 '${htmlMember.owner.simpleName}.' | 130 '${htmlMember.owner.simpleName}.' |
| 134 '${htmlMember.simpleName} has no corresponding ' | 131 '${htmlMember.simpleName} has no corresponding ' |
| 135 '$libraryName member.'); | 132 '$libraryName member.'); |
| 136 } | 133 } |
| 137 | 134 |
| 138 if (htmlMember == null) return; | 135 if (htmlMember == null) return; |
| 139 if (!domMembers.isEmpty) { | 136 if (!domMembers.isEmpty) { |
| 140 htmlToDom[htmlMember.qualifiedName] = domMembers; | 137 htmlToDom[qualifiedNameOf(htmlMember)] = domMembers; |
| 141 } | 138 } |
| 142 } | 139 } |
| 143 | 140 |
| 144 /** | 141 /** |
| 145 * Returns the `@DomName` type values that correspond to | 142 * Returns the `@DomName` type values that correspond to |
| 146 * [htmlType] from `dart:html`. This can be the empty list if no | 143 * [htmlType] from `dart:html`. This can be the empty list if no |
| 147 * correspondence is found. | 144 * correspondence is found. |
| 148 */ | 145 */ |
| 149 List<String> htmlToDomTypes(ClassMirror htmlType) { | 146 List<String> htmlToDomTypes(ClassMirror htmlType) { |
| 150 if (htmlType.simpleName == null) return <String>[]; | 147 if (htmlType.simpleName == null) return <String>[]; |
| 151 | 148 |
| 152 final domNameMetadata = findMetadata(htmlType.metadata, 'DomName'); | 149 final domNameMetadata = findMetadata(htmlType.metadata, 'DomName'); |
| 153 if (domNameMetadata != null) { | 150 if (domNameMetadata != null) { |
| 154 var domNames = <String>[]; | 151 var domNames = <String>[]; |
| 155 var names = domNameMetadata.getField('name'); | 152 var names = domNameMetadata.getField(symbolOf('name')); |
| 156 for (var s in names.reflectee.split(',')) { | 153 for (var s in names.reflectee.split(',')) { |
| 157 domNames.add(s.trim()); | 154 domNames.add(s.trim()); |
| 158 } | 155 } |
| 159 | 156 |
| 160 if (domNames.length == 1 && domNames[0] == 'none') return <String>[]; | 157 if (domNames.length == 1 && domNames[0] == 'none') return <String>[]; |
| 161 return domNames; | 158 return domNames; |
| 162 } | 159 } |
| 163 return <String>[]; | 160 return <String>[]; |
| 164 } | 161 } |
| 165 | 162 |
| 166 /** | 163 /** |
| 167 * Returns the `@DomName` member values that correspond to | 164 * Returns the `@DomName` member values that correspond to |
| 168 * [htmlMember] from `dart:html`. This can be the empty set if no | 165 * [htmlMember] from `dart:html`. This can be the empty set if no |
| 169 * correspondence is found. [domTypes] are the | 166 * correspondence is found. [domTypes] are the |
| 170 * `@DomName` type values that correspond to [htmlMember]'s | 167 * `@DomName` type values that correspond to [htmlMember]'s |
| 171 * defining type. | 168 * defining type. |
| 172 */ | 169 */ |
| 173 Set<String> htmlToDomMembers(MemberMirror htmlMember, List<String> domTypes) { | 170 Set<String> htmlToDomMembers(DeclarationMirror htmlMember, |
| 171 List<String> domTypes) { |
| 174 if (htmlMember.isPrivate) return new Set(); | 172 if (htmlMember.isPrivate) return new Set(); |
| 175 | 173 |
| 176 final domNameMetadata = findMetadata(htmlMember.metadata, 'DomName'); | 174 final domNameMetadata = findMetadata(htmlMember.metadata, 'DomName'); |
| 177 if (domNameMetadata != null) { | 175 if (domNameMetadata != null) { |
| 178 var domNames = <String>[]; | 176 var domNames = <String>[]; |
| 179 var names = domNameMetadata.getField('name'); | 177 var names = domNameMetadata.getField(symbolOf('name')); |
| 180 for (var s in names.reflectee.split(',')) { | 178 for (var s in names.reflectee.split(',')) { |
| 181 domNames.add(s.trim()); | 179 domNames.add(s.trim()); |
| 182 } | 180 } |
| 183 | 181 |
| 184 if (domNames.length == 1 && domNames[0] == 'none') return new Set(); | 182 if (domNames.length == 1 && domNames[0] == 'none') return new Set(); |
| 185 final members = new Set(); | 183 final members = new Set(); |
| 186 domNames.forEach((name) { | 184 domNames.forEach((name) { |
| 187 var nameMembers = _membersFromName(name, domTypes); | 185 var nameMembers = _membersFromName(name, domTypes); |
| 188 if (nameMembers.isEmpty) { | 186 if (nameMembers.isEmpty) { |
| 189 if (name.contains('.')) { | 187 if (name.contains('.')) { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 224 return members; | 222 return members; |
| 225 } | 223 } |
| 226 | 224 |
| 227 if (name.split('.').length != 2) { | 225 if (name.split('.').length != 2) { |
| 228 warn('invalid member name ${name}'); | 226 warn('invalid member name ${name}'); |
| 229 return new Set(); | 227 return new Set(); |
| 230 } | 228 } |
| 231 return new Set.from([name]); | 229 return new Set.from([name]); |
| 232 } | 230 } |
| 233 } | 231 } |
| OLD | NEW |