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, this | |
7 * lists a map of `dart:dom` methods that have been renamed to `dart:html` | |
8 * methods without changing their semantics, and `dart:dom` methods that have | |
9 * been removed in `dart:html`. As a heuristic, a `dart:html` method doesn't | |
10 * change the semantics of the corresponding `dart:dom` method if it's the only | |
11 * corresponding HTML method and it has the corresponding return type. | |
12 * | |
13 * The format of the output is as follows: | |
14 * | |
15 * { | |
16 * "renamed": { domName: htmlName, ... }, | |
17 * "removed": [name, ...] | |
18 * } | |
19 * | |
20 * Note that the removed members are listed with the names they would have in | |
21 * HTML where possible; e.g. `HTMLMediaElement.get:textTracks` is listed as | |
22 * `MediaElement.get:textTracks`. | |
23 */ | |
24 #library('html_diff_dump'); | |
25 | |
26 #import('dart:json'); | |
27 #import('html_diff.dart'); | |
28 #import('../../frog/lang.dart'); | |
29 #import('../../frog/file_system_node.dart'); | |
30 | |
31 HtmlDiff diff; | |
32 | |
33 /** Whether or not a domType represents the same type as an htmlType. */ | |
34 bool sameType(Type domType, Type htmlType) { | |
35 if (domType.isVoid || htmlType.isVoid) { | |
36 return domType.isVoid && htmlType.isVoid; | |
37 } | |
38 | |
39 final htmlTypes = diff.domTypesToHtml[domType]; | |
40 return htmlTypes != null && htmlTypes.some((t) => t == htmlType); | |
41 } | |
42 | |
43 /** Returns the name of a member, including `get:` if it's a field. */ | |
44 String memberName(Member m) => m is FieldMember ? 'get:${m.name}' : m.name; | |
45 | |
46 /** | |
47 * Returns a string describing the name of a member. If [type] is passed, it's | |
48 * used in place of the member's real type name. | |
49 */ | |
50 String memberDesc(Member m, [Type type = null]) { | |
51 if (type == null) type = m.declaringType; | |
52 return '${type.name}.${memberName(m)}'; | |
53 } | |
54 | |
55 /** | |
56 * Same as [memberDesc], but if [m] is a `dart:dom` type its `dart:html` | |
57 * typename is used instead. | |
58 */ | |
59 String htmlishMemberDesc(Member m) { | |
60 var type = m.declaringType; | |
61 final htmlTypes = diff.domTypesToHtml[type]; | |
62 if (htmlTypes != null && htmlTypes.length == 1) { | |
63 type = htmlTypes.iterator().next(); | |
64 } | |
65 return memberDesc(m, type); | |
66 } | |
67 | |
68 bool isGetter(Member member) => member.name.startsWith('get:'); | |
69 bool isSetter(Member member) => member.name.startsWith('set:'); | |
70 | |
71 /** | |
72 * Add an entry to the map of `dart:dom` names to `dart:html` names if | |
73 * [domMember] was renamed to [htmlMembers] with the same semantics. | |
74 */ | |
75 void maybeAddRename(Map<String, String> renamed, Member domMember, | |
76 Collection<Member> htmlMembers) { | |
77 if (htmlMembers.length != 1) return; | |
78 final htmlMember = htmlMembers.iterator().next(); | |
79 if (memberName(domMember) != memberName(htmlMember) && | |
80 sameType(domMember.returnType, htmlMember.returnType)) { | |
81 renamed[memberDesc(domMember)] = memberDesc(htmlMember); | |
82 } | |
83 } | |
84 | |
85 void main() { | |
86 var files = new NodeFileSystem(); | |
87 parseOptions('../../frog', [] /* args */, files); | |
88 initializeWorld(files); | |
89 | |
90 HtmlDiff.initialize(); | |
91 diff = new HtmlDiff(); | |
92 diff.run(); | |
93 | |
94 final renamed = <String>{}; | |
95 diff.domToHtml.forEach((domMember, htmlMembers) { | |
96 if (domMember is PropertyMember) { | |
97 if (domMember.canGet) { | |
98 maybeAddRename(renamed, domMember.getter, htmlMembers.filter(isGetter)); | |
99 } | |
100 if (domMember.canSet) { | |
101 maybeAddRename(renamed, domMember.setter, htmlMembers.filter(isSetter)); | |
102 } | |
103 } else { | |
104 maybeAddRename(renamed, domMember, htmlMembers); | |
105 return; | |
106 } | |
107 }); | |
108 | |
109 final removed = <Set>[]; | |
110 for (final type in world.libraries['dart:dom'].types.getValues()) { | |
111 if (type.members.getValues().every((m) => | |
112 !diff.domToHtml.containsKey(m))) { | |
113 removed.add('${type.name}.*'); | |
114 } else { | |
115 for (final member in type.members.getValues()) { | |
116 if (!diff.domToHtml.containsKey(member)) { | |
117 if (member is PropertyMember) { | |
118 if (member.canGet) removed.add(htmlishMemberDesc(member.getter)); | |
119 if (member.canSet) removed.add(htmlishMemberDesc(member.setter)); | |
120 } else { | |
121 removed.add(htmlishMemberDesc(member)); | |
122 } | |
123 } else if (member is PropertyMember) { | |
124 final htmlMembers = diff.domToHtml[member]; | |
125 if (member.canGet && !htmlMembers.some((m) => m.name.startsWith('get:'
))) { | |
126 removed.add(htmlishMemberDesc(member.getter)); | |
127 } | |
128 if (member.canSet && !htmlMembers.some((m) => m.name.startsWith('set:'
))) { | |
129 removed.add(htmlishMemberDesc(member.setter)); | |
130 } | |
131 } | |
132 } | |
133 } | |
134 } | |
135 | |
136 print(JSON.stringify({'renamed': renamed, 'removed': removed})); | |
137 } | |
OLD | NEW |