Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(501)

Side by Side Diff: utils/apidoc/html_diff_dump.dart

Issue 9385029: Add a script to parse and dump DOM -> HTML mapping information as JSON. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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 /**
44 * Returns a string describing the name of a member. If [type] is passed, it's
45 * used in place of the member's real type name.
46 */
47 String memberName(Member m, [Type type = null]) {
48 if (type == null) type = m.declaringType;
49 if (m is FieldMember) {
50 return '${type.name}.get:${m.name}';
51 } else {
52 return '${type.name}.${m.name}';
53 }
54 }
55
56 /**
57 * Same as [memberName], but if [m] is a `dart:dom` type its `dart:html`
58 * typename is used instead.
59 */
60 String htmlishMemberName(Member m) {
61 var type = m.declaringType;
62 final htmlTypes = diff.domTypesToHtml[type];
63 if (htmlTypes != null && htmlTypes.length == 1) {
64 type = htmlTypes.iterator().next();
65 }
66 return memberName(m, type);
67 }
68
69 bool isGetter(Member member) => member.name.startsWith('get:');
70 bool isSetter(Member member) => member.name.startsWith('set:');
71
72 /**
73 * Add an entry to the map of `dart:dom` names to `dart:html` names if
74 * [domMember] was renamed to [htmlMembers] with the same semantics.
75 */
76 void maybeAddRename(Map<String, String> renamed, Member domMember,
77 Collection<Member> htmlMembers) {
78 if (htmlMembers.length != 1) return;
79 final htmlMember = htmlMembers.iterator().next();
80 if (memberName(domMember) != memberName(htmlMember) &&
81 sameType(domMember.returnType, htmlMember.returnType)) {
82 renamed[memberName(domMember)] = memberName(htmlMember);
83 }
84 }
85
86 void main() {
87 var files = new NodeFileSystem();
88 parseOptions('../../frog', [] /* args */, files);
89 initializeWorld(files);
90
91 HtmlDiff.initialize();
92 diff = new HtmlDiff();
93 diff.run();
94
95 final renamed = <String>{};
96 diff.domToHtml.forEach((domMember, htmlMembers) {
97 if (domMember is PropertyMember) {
98 if (domMember.canGet) {
99 maybeAddRename(renamed, domMember.getter, htmlMembers.filter(isGetter));
100 }
101 if (domMember.canSet) {
102 maybeAddRename(renamed, domMember.setter, htmlMembers.filter(isSetter));
103 }
104 } else {
105 maybeAddRename(renamed, domMember, htmlMembers);
106 return;
107 }
108 });
109
110 final removed = <Set>[];
111 for (final type in world.libraries['dart:dom'].types.getValues()) {
112 if (type.members.getValues().every((m) =>
113 !diff.domToHtml.containsKey(m))) {
114 removed.add('${type.name}.*');
115 } else {
116 for (final member in type.members.getValues()) {
117 if (!diff.domToHtml.containsKey(member)) {
118 if (member is PropertyMember) {
119 if (member.canGet) removed.add(htmlishMemberName(member.getter));
120 if (member.canSet) removed.add(htmlishMemberName(member.setter));
121 } else {
122 removed.add(htmlishMemberName(member));
123 }
124 } else if (member is PropertyMember) {
125 final htmlMembers = diff.domToHtml[member];
126 if (member.canGet && !htmlMembers.some((m) => m.name.startsWith('get:' ))) {
127 removed.add(htmlishMemberName(member.getter));
128 }
129 if (member.canSet && !htmlMembers.some((m) => m.name.startsWith('set:' ))) {
130 removed.add(htmlishMemberName(member.setter));
131 }
132 }
133 }
134 }
135 }
136
137 print(JSON.stringify({'renamed': renamed, 'removed': removed}));
138 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698