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

Side by Side Diff: build/gen_html_setters.dart

Issue 11315020: Add attribute information table so we generate correct setters. (Closed) Base URL: https://github.com/dart-lang/dart-web-components.git@master
Patch Set: Created 8 years, 1 month 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
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 import 'dart:io';
6
7 // TODO(jmesserly): should be importing packages.
Siggi Cherem (dart-lang) 2012/11/06 03:20:36 packages => a dartdoc package?
Jennifer Messerly 2012/11/06 03:51:57 Done.
8 // This is currently generated by the shell script.
9 import 'compile_mirrors.dart';
10
11 // TODO(jmesserly): pub is not creating a "packages" for us.
12 import '../lib/src/html5_utils.dart' show htmlElementNames;
13
14 const MY_NAME = 'build/gen_html_setters.sh';
15 const OUTPUT_NAME = 'lib/src/html5_setters.g.dart';
16
17 /**
18 * Given a field name in `dart:html` gets the HTML attribute name.
19 */
20 const fieldToAttribute = const {
21 'acceptCharset': 'accept-charset',
22 'defaultValue': 'default',
23 // Yuck. http://dartbug.com/4550
24 'webkitdropzone': 'dropzone',
25 'htmlFor': 'for',
26 'httpEquiv': 'http-equiv',
27 };
28
29
30 main() {
31 print('''
32 This script uses compile time mirrors to get information from dart:html.
33 The information is used to create "$OUTPUT_NAME".
34 ''');
35
36 var sdk = Platform.environment['DART_SDK'];
37 if (sdk == null) {
38 print('DART_SDK path must be set. Use gen_html_setters.sh.');
39 exit(1);
40 }
41
42 var htmlPath = new Path('dart:html');
43 var libPath = new Path(sdk).append('lib');
44 var pkgPath = new Path(sdk).append('pkg');
45
46 var mirrors = new Compilation.library([htmlPath], libPath, pkgPath).mirrors;
47 var html = mirrors.libraries['html'];
48
49
50 var extendsCode = new StringBuffer();
51 extendsCode.add('var htmlElementExtends = const {\n');
52
53 var code = new StringBuffer();
54 code.add('// This file is autogenerated by $MY_NAME. Do not edit.\n');
55 code.add('library html5_setters;\n');
56
57 var elemSet = new Set();
58 void addSuperInterfaces(ClassMirror cls) {
59 var name = cls.displayName;
60 if (name.endsWith('Element') && !elemSet.contains(name)) {
61 elemSet.add(name);
62 cls.superinterfaces.forEach(addSuperInterfaces);
63 }
64 }
65 for (var name in htmlElementNames.values) {
66 addSuperInterfaces(html.classes[name]);
67 }
68 addSuperInterfaces(html.classes['UnknownElement']);
69
70 code.add('var htmlElementFields = const {\n');
71 var elements = new List.from(elemSet);
72 elements.sort();
73 for (var element in elements) {
74 var cls = html.classes[element];
75 var setters = [];
76
77 var interfaces = cls.superinterfaces.filter(
78 (i) => i.displayName.endsWith('Element'));
79
80 if (interfaces.length > 1) {
81 print('ERROR: $element has more than one Element superinterface:\n'
82 ' $interfaces');
83 exit(2);
84 } else if (interfaces.length > 0) {
85 extendsCode.add(" '$element': '${interfaces[0].displayName}',\n");
86 }
87
88 // TODO(jmesserly): using "cls.setters" does not seem to work
89 for (var member in cls.members.values) {
90 if (member.simpleName.startsWith(r'$')) continue;
91 if (member is! VariableMirror) continue;
92 if (member.isFinal || member.isConst) continue;
93 setters.add(member.displayName);
94 }
95
96 if (setters.length == 0) continue;
97
98 code.add(" '$element': const {\n");
99 for (var setter in setters) {
100 var attr = fieldToAttribute[setter];
101 if (attr == null) attr = setter.toLowerCase();
102 code.add(" '$attr': '$setter',\n");
103 }
104 code.add(' },\n');
105 }
106 code.add('};\n\n');
107 extendsCode.add('};\n');
108 code.add(extendsCode.toString());
109
110 var outPath = new Path(new Options().script).directoryPath
111 .append('..').append(OUTPUT_NAME);
112
113 new File.fromPath(outPath)
114 .openSync(FileMode.WRITE)
115 ..writeStringSync(code.toString())
116 ..closeSync();
117
118 print('Wrote $outPath.');
119 }
OLDNEW
« no previous file with comments | « .gitignore ('k') | build/gen_html_setters.sh » ('j') | lib/src/emitters.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698