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

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

Issue 10095017: added printWarnings option to HtmlDiff (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: add printWarnings option to HtmlDiff Created 8 years, 8 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
« utils/apidoc/apidoc.dart ('K') | « utils/apidoc/apidoc.dart ('k') | 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
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
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 final Map<Member, Set<Member>> htmlToDom; 44 final Map<Member, Set<Member>> htmlToDom;
45 45
46 /** A map from `dart:dom` types to corresponding `dart:html` types. */ 46 /** A map from `dart:dom` types to corresponding `dart:html` types. */
47 final Map<Type, Set<Type>> domTypesToHtml; 47 final Map<Type, Set<Type>> domTypesToHtml;
48 48
49 /** A map from `dart:html` types to corresponding `dart:dom` types. */ 49 /** A map from `dart:html` types to corresponding `dart:dom` types. */
50 final Map<Type, Set<Type>> htmlTypesToDom; 50 final Map<Type, Set<Type>> htmlTypesToDom;
51 51
52 final CommentMap comments; 52 final CommentMap comments;
53 53
54 /** If true, then print warning messages. */
55 final printWarnings;
56
54 static Library dom; 57 static Library dom;
55 58
56 /** 59 /**
57 * Perform static initialization of [world]. This should be run before 60 * Perform static initialization of [world]. This should be run before
58 * calling [HtmlDiff.run]. 61 * calling [HtmlDiff.run].
59 */ 62 */
60 static void initialize() { 63 static void initialize() {
61 world.getOrAddLibrary('dart:dom'); 64 world.getOrAddLibrary('dart:dom');
62 world.getOrAddLibrary('dart:html'); 65 world.getOrAddLibrary('dart:html');
63 world.process(); 66 world.process();
64 67
65 dom = world.libraries['dart:dom']; 68 dom = world.libraries['dart:dom'];
66 } 69 }
67 70
68 HtmlDiff() : 71 HtmlDiff(this.printWarnings) :
69 domToHtml = new Map<Member, Set<Member>>(), 72 domToHtml = new Map<Member, Set<Member>>(),
70 htmlToDom = new Map<Member, Set<Member>>(), 73 htmlToDom = new Map<Member, Set<Member>>(),
71 domTypesToHtml = new Map<Type, Set<Type>>(), 74 domTypesToHtml = new Map<Type, Set<Type>>(),
72 htmlTypesToDom = new Map<Type, Set<Type>>(), 75 htmlTypesToDom = new Map<Type, Set<Type>>(),
73 comments = new CommentMap(); 76 comments = new CommentMap();
74 77
78 void warn(String s) {
79 if (printWarnings) {
80 print('Warning: ' + s);
81 }
82 }
83
75 /** 84 /**
76 * Computes the `dart:dom` to `dart:html` mapping, and places it in 85 * Computes the `dart:dom` to `dart:html` mapping, and places it in
77 * [domToHtml], [htmlToDom], [domTypesToHtml], and [htmlTypesToDom]. Before 86 * [domToHtml], [htmlToDom], [domTypesToHtml], and [htmlTypesToDom]. Before
78 * this is run, Frog should be initialized (via [parseOptions] and 87 * this is run, Frog should be initialized (via [parseOptions] and
79 * [initializeWorld]) and [HtmlDiff.initialize] should be called. 88 * [initializeWorld]) and [HtmlDiff.initialize] should be called.
80 */ 89 */
81 void run() { 90 void run() {
82 final htmlLib = world.libraries['dart:html']; 91 final htmlLib = world.libraries['dart:html'];
83 for (Type htmlType in htmlLib.types.getValues()) { 92 for (Type htmlType in htmlLib.types.getValues()) {
84 final domTypes = htmlToDomTypes(htmlType); 93 final domTypes = htmlToDomTypes(htmlType);
(...skipping 17 matching lines...) Expand all
102 * [implMember]'s defining [Type]. 111 * [implMember]'s defining [Type].
103 */ 112 */
104 void _addMemberDiff(Member htmlMember, List<Type> domTypes) { 113 void _addMemberDiff(Member htmlMember, List<Type> domTypes) {
105 if (htmlMember.isProperty) { 114 if (htmlMember.isProperty) {
106 if (htmlMember.canGet) _addMemberDiff(htmlMember.getter, domTypes); 115 if (htmlMember.canGet) _addMemberDiff(htmlMember.getter, domTypes);
107 if (htmlMember.canSet) _addMemberDiff(htmlMember.setter, domTypes); 116 if (htmlMember.canSet) _addMemberDiff(htmlMember.setter, domTypes);
108 } 117 }
109 118
110 var domMembers = htmlToDomMembers(htmlMember, domTypes); 119 var domMembers = htmlToDomMembers(htmlMember, domTypes);
111 if (htmlMember == null && !domMembers.isEmpty()) { 120 if (htmlMember == null && !domMembers.isEmpty()) {
112 print('Warning: dart:html member ${htmlMember.declaringType.name}.' + 121 warn('dart:html member ${htmlMember.declaringType.name}.' +
113 '${htmlMember.name} has no corresponding dart:html member.'); 122 '${htmlMember.name} has no corresponding dart:html member.');
114 } 123 }
115 124
116 if (htmlMember == null) return; 125 if (htmlMember == null) return;
117 if (!domMembers.isEmpty()) htmlToDom[htmlMember] = domMembers; 126 if (!domMembers.isEmpty()) htmlToDom[htmlMember] = domMembers;
118 domMembers.forEach((m) => 127 domMembers.forEach((m) =>
119 domToHtml.putIfAbsent(m, () => new Set()).add(htmlMember)); 128 domToHtml.putIfAbsent(m, () => new Set()).add(htmlMember));
120 } 129 }
121 130
122 /** 131 /**
123 * Returns the `dart:dom` [Type]s that correspond to [htmlType] from 132 * Returns the `dart:dom` [Type]s that correspond to [htmlType] from
124 * `dart:html`. This can be the empty list if no correspondence is found. 133 * `dart:html`. This can be the empty list if no correspondence is found.
125 */ 134 */
126 List<Type> htmlToDomTypes(Type htmlType) { 135 List<Type> htmlToDomTypes(Type htmlType) {
127 if (htmlType.name == null) return []; 136 if (htmlType.name == null) return [];
128 final tags = _getTags(comments.find(htmlType.span)); 137 final tags = _getTags(comments.find(htmlType.span));
129 138
130 if (tags.containsKey('domName')) { 139 if (tags.containsKey('domName')) {
131 var domNames = map(tags['domName'].split(','), (s) => s.trim()); 140 var domNames = map(tags['domName'].split(','), (s) => s.trim());
132 if (domNames.length == 1 && domNames[0] == 'none') return []; 141 if (domNames.length == 1 && domNames[0] == 'none') return [];
133 return map(domNames, (domName) { 142 return map(domNames, (domName) {
134 final domType = dom.types[domName]; 143 final domType = dom.types[domName];
135 if (domType == null) print('Warning: no dart:dom type named $domName'); 144 if (domType == null) warn('no dart:dom type named $domName');
136 return domType; 145 return domType;
137 }); 146 });
138 } 147 }
139 return <Type>[]; 148 return <Type>[];
140 } 149 }
141 150
142 /** 151 /**
143 * Returns the `dart:dom` [Member]s that correspond to [htmlMember] from 152 * Returns the `dart:dom` [Member]s that correspond to [htmlMember] from
144 * `dart:html`. This can be the empty set if no correspondence is found. 153 * `dart:html`. This can be the empty set if no correspondence is found.
145 * [domTypes] are the `dart:dom` [Type]s that correspond to [implMember]'s 154 * [domTypes] are the `dart:dom` [Type]s that correspond to [implMember]'s
146 * defining [Type]. 155 * defining [Type].
147 */ 156 */
148 Set<Member> htmlToDomMembers(Member htmlMember, List<Type> domTypes) { 157 Set<Member> htmlToDomMembers(Member htmlMember, List<Type> domTypes) {
149 if (htmlMember.isPrivate) return new Set(); 158 if (htmlMember.isPrivate) return new Set();
150 final tags = _getTags(comments.find(htmlMember.span)); 159 final tags = _getTags(comments.find(htmlMember.span));
151 if (tags.containsKey('domName')) { 160 if (tags.containsKey('domName')) {
152 final domNames = map(tags['domName'].split(','), (s) => s.trim()); 161 final domNames = map(tags['domName'].split(','), (s) => s.trim());
153 if (domNames.length == 1 && domNames[0] == 'none') return new Set(); 162 if (domNames.length == 1 && domNames[0] == 'none') return new Set();
154 final members = new Set(); 163 final members = new Set();
155 domNames.forEach((name) { 164 domNames.forEach((name) {
156 var nameMembers = _membersFromName(name, domTypes); 165 var nameMembers = _membersFromName(name, domTypes);
157 if (nameMembers.isEmpty()) { 166 if (nameMembers.isEmpty()) {
158 if (name.contains('.')) { 167 if (name.contains('.')) {
159 print('Warning: no member $name'); 168 warn('no member $name');
160 } else { 169 } else {
161 final options = Strings.join( 170 final options = Strings.join(
162 map(domTypes, (t) => "${t.name}.$name"), ' or '); 171 map(domTypes, (t) => "${t.name}.$name"), ' or ');
163 print('Warning: no member $options'); 172 warn('no member $options');
164 } 173 }
165 } 174 }
166 members.addAll(nameMembers); 175 members.addAll(nameMembers);
167 }); 176 });
168 return members; 177 return members;
169 } 178 }
170 179
171 return new Set(); 180 return new Set();
172 } 181 }
173 182
174 /** 183 /**
175 * Returns the `dart:dom` [Member]s that are indicated by [name]. [name] can 184 * Returns the `dart:dom` [Member]s that are indicated by [name]. [name] can
176 * be either an unqualified member name (e.g. `createElement`), in which case 185 * be either an unqualified member name (e.g. `createElement`), in which case
177 * it's treated as the name of a member of one of [defaultTypes], or a 186 * it's treated as the name of a member of one of [defaultTypes], or a
178 * fully-qualified member name (e.g. `Document.createElement`), in which case 187 * fully-qualified member name (e.g. `Document.createElement`), in which case
179 * it's looked up in `dart:dom` and [defaultTypes] is ignored. 188 * it's looked up in `dart:dom` and [defaultTypes] is ignored.
180 */ 189 */
181 Set<Member> _membersFromName(String name, List<Type> defaultTypes) { 190 Set<Member> _membersFromName(String name, List<Type> defaultTypes) {
182 if (!name.contains('.', 0)) { 191 if (!name.contains('.', 0)) {
183 if (defaultTypes.isEmpty()) { 192 if (defaultTypes.isEmpty()) {
184 print('Warning: no default type for ${name}'); 193 warn('no default type for ${name}');
185 return new Set(); 194 return new Set();
186 } 195 }
187 final members = new Set<Member>(); 196 final members = new Set<Member>();
188 defaultTypes.forEach((t) { 197 defaultTypes.forEach((t) {
189 if (t.members.containsKey(name)) members.add(t.members[name]); 198 if (t.members.containsKey(name)) members.add(t.members[name]);
190 }); 199 });
191 return members; 200 return members;
192 } 201 }
193 202
194 final splitName = name.split('.'); 203 final splitName = name.split('.');
195 if (splitName.length != 2) { 204 if (splitName.length != 2) {
196 print('Warning: invalid member name ${name}'); 205 warn('invalid member name ${name}');
197 return new Set(); 206 return new Set();
198 } 207 }
199 208
200 var typeName = splitName[0]; 209 var typeName = splitName[0];
201 210
202 final type = dom.types[typeName]; 211 final type = dom.types[typeName];
203 if (type == null) return new Set(); 212 if (type == null) return new Set();
204 213
205 final member = type.members[splitName[1]]; 214 final member = type.members[splitName[1]];
206 if (member == null) return new Set(); 215 if (member == null) return new Set();
(...skipping 12 matching lines...) Expand all
219 Map<String, String> _getTags(String comment) { 228 Map<String, String> _getTags(String comment) {
220 if (comment == null) return const <String>{}; 229 if (comment == null) return const <String>{};
221 final re = const RegExp("@([a-zA-Z]+) ([^;]+)(?:;|\$)"); 230 final re = const RegExp("@([a-zA-Z]+) ([^;]+)(?:;|\$)");
222 final tags = <String>{}; 231 final tags = <String>{};
223 for (var m in re.allMatches(comment.trim())) { 232 for (var m in re.allMatches(comment.trim())) {
224 tags[m[1]] = m[2]; 233 tags[m[1]] = m[2];
225 } 234 }
226 return tags; 235 return tags;
227 } 236 }
228 } 237 }
OLDNEW
« utils/apidoc/apidoc.dart ('K') | « utils/apidoc/apidoc.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698