OLD | NEW |
| (Empty) |
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 | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 /** | |
6 * A script for printing a JSON dump of HTML diff data. In particular, | |
7 * this lists a map of `dart:dom_deprecated` methods that have been | |
8 * renamed to `dart:html` methods without changing their semantics, | |
9 * and `dart:dom_deprecated` methods that have been removed in | |
10 * `dart:html`. As a heuristic, a `dart:html` method doesn't change | |
11 * the semantics of the corresponding `dart:dom_deprecated` method if | |
12 * it's the only corresponding HTML method and it has the | |
13 * corresponding return type. | |
14 * | |
15 * The format of the output is as follows: | |
16 * | |
17 * { | |
18 * "renamed": { domName: htmlName, ... }, | |
19 * "removed": [name, ...] | |
20 * } | |
21 * | |
22 * Note that the removed members are listed with the names they would have in | |
23 * HTML where possible; e.g. `HTMLMediaElement.get:textTracks` is listed as | |
24 * `MediaElement.get:textTracks`. | |
25 */ | |
26 #library('html_diff_dump'); | |
27 | |
28 #import('dart:json'); | |
29 #import('dart:io'); | |
30 #import('html_diff.dart'); | |
31 #import('../../pkg/dartdoc/mirrors/mirrors.dart'); | |
32 #import('../../pkg/dartdoc/mirrors/mirrors_util.dart'); | |
33 | |
34 HtmlDiff diff; | |
35 | |
36 /** Whether or not a domType represents the same type as an htmlType. */ | |
37 bool sameType(MemberMirror domMember, MemberMirror htmlMember) { | |
38 TypeMirror domType = domMember is FieldMirror | |
39 ? domMember.type | |
40 : domMember.returnType; | |
41 TypeMirror htmlType = htmlMember is FieldMirror | |
42 ? htmlMember.type | |
43 : htmlMember.returnType; | |
44 if (domType.isVoid || htmlType.isVoid) { | |
45 return domType.isVoid && htmlType.isVoid; | |
46 } | |
47 | |
48 final htmlTypes = diff.domTypesToHtml[domType.qualifiedName]; | |
49 return htmlTypes != null && htmlTypes.some((t) => t == htmlType); | |
50 } | |
51 | |
52 /** Returns the name of a member, including `get:` if it's a field. */ | |
53 String memberName(MemberMirror m) => m.simpleName; | |
54 | |
55 /** | |
56 * Returns a string describing the name of a member. If [type] is passed, it's | |
57 * used in place of the member's real type name. | |
58 */ | |
59 String memberDesc(MemberMirror m, [ObjectMirror type = null]) { | |
60 if (type == null) type = m.surroundingDeclaration; | |
61 return '${type.simpleName}.${memberName(m)}'; | |
62 } | |
63 | |
64 /** | |
65 * Same as [memberDesc], but if [m] is a `dart:dom_deprecated` type | |
66 * its `dart:html` typename is used instead. | |
67 */ | |
68 String htmlishMemberDesc(MemberMirror m) { | |
69 var type = m.surroundingDeclaration; | |
70 final htmlTypes = diff.domTypesToHtml[type.qualifiedName]; | |
71 if (htmlTypes != null && htmlTypes.length == 1) { | |
72 type = htmlTypes.iterator().next(); | |
73 } | |
74 return memberDesc(m, type); | |
75 } | |
76 | |
77 /** | |
78 * Add an entry to the map of `dart:dom_deprecated` names to | |
79 * `dart:html` names if [domMember] was renamed to [htmlMembers] with | |
80 * the same semantics. | |
81 */ | |
82 void maybeAddRename(Map<String, String> renamed, | |
83 MemberMirror domMember, | |
84 Collection<MemberMirror> htmlMembers) { | |
85 if (htmlMembers.length != 1) return; | |
86 final htmlMember = htmlMembers.iterator().next(); | |
87 if (memberName(domMember) != memberName(htmlMember) && | |
88 sameType(domMember, htmlMember)) { | |
89 renamed[memberDesc(domMember)] = memberDesc(htmlMember); | |
90 } | |
91 } | |
92 | |
93 void main() { | |
94 var libPath = const Path('../../'); | |
95 HtmlDiff.initialize(libPath); | |
96 diff = new HtmlDiff(); | |
97 diff.run(); | |
98 | |
99 final renamed = <String, String>{}; | |
100 diff.domToHtml.forEach((MemberMirror domMember, | |
101 Set<MemberMirror> htmlMembers) { | |
102 maybeAddRename(renamed, domMember, htmlMembers); | |
103 }); | |
104 | |
105 final removed = <String>[]; | |
106 | |
107 for (InterfaceMirror type in HtmlDiff.dom.types.getValues()) { | |
108 if (type.declaredMembers.getValues().every((m) => | |
109 !diff.domToHtml.containsKey(m))) { | |
110 removed.add('${type.simpleName}.*'); | |
111 } else { | |
112 for (MemberMirror member in type.declaredMembers.getValues()) { | |
113 if (!diff.domToHtml.containsKey(member)) { | |
114 removed.add(htmlishMemberDesc(member)); | |
115 } | |
116 } | |
117 } | |
118 } | |
119 | |
120 print(JSON.stringify({'renamed': renamed, 'removed': removed})); | |
121 } | |
OLD | NEW |