Chromium Code Reviews| Index: build/gen_html_setters.dart |
| diff --git a/build/gen_html_setters.dart b/build/gen_html_setters.dart |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..b992bc6a12c1a2954c786ed0167167a152f230eb |
| --- /dev/null |
| +++ b/build/gen_html_setters.dart |
| @@ -0,0 +1,119 @@ |
| +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| +// for details. All rights reserved. Use of this source code is governed by a |
| +// BSD-style license that can be found in the LICENSE file. |
| + |
| +import 'dart:io'; |
| + |
| +// 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.
|
| +// This is currently generated by the shell script. |
| +import 'compile_mirrors.dart'; |
| + |
| +// TODO(jmesserly): pub is not creating a "packages" for us. |
| +import '../lib/src/html5_utils.dart' show htmlElementNames; |
| + |
| +const MY_NAME = 'build/gen_html_setters.sh'; |
| +const OUTPUT_NAME = 'lib/src/html5_setters.g.dart'; |
| + |
| +/** |
| + * Given a field name in `dart:html` gets the HTML attribute name. |
| + */ |
| +const fieldToAttribute = const { |
| + 'acceptCharset': 'accept-charset', |
| + 'defaultValue': 'default', |
| + // Yuck. http://dartbug.com/4550 |
| + 'webkitdropzone': 'dropzone', |
| + 'htmlFor': 'for', |
| + 'httpEquiv': 'http-equiv', |
| +}; |
| + |
| + |
| +main() { |
| + print(''' |
| +This script uses compile time mirrors to get information from dart:html. |
| +The information is used to create "$OUTPUT_NAME". |
| +'''); |
| + |
| + var sdk = Platform.environment['DART_SDK']; |
| + if (sdk == null) { |
| + print('DART_SDK path must be set. Use gen_html_setters.sh.'); |
| + exit(1); |
| + } |
| + |
| + var htmlPath = new Path('dart:html'); |
| + var libPath = new Path(sdk).append('lib'); |
| + var pkgPath = new Path(sdk).append('pkg'); |
| + |
| + var mirrors = new Compilation.library([htmlPath], libPath, pkgPath).mirrors; |
| + var html = mirrors.libraries['html']; |
| + |
| + |
| + var extendsCode = new StringBuffer(); |
| + extendsCode.add('var htmlElementExtends = const {\n'); |
| + |
| + var code = new StringBuffer(); |
| + code.add('// This file is autogenerated by $MY_NAME. Do not edit.\n'); |
| + code.add('library html5_setters;\n'); |
| + |
| + var elemSet = new Set(); |
| + void addSuperInterfaces(ClassMirror cls) { |
| + var name = cls.displayName; |
| + if (name.endsWith('Element') && !elemSet.contains(name)) { |
| + elemSet.add(name); |
| + cls.superinterfaces.forEach(addSuperInterfaces); |
| + } |
| + } |
| + for (var name in htmlElementNames.values) { |
| + addSuperInterfaces(html.classes[name]); |
| + } |
| + addSuperInterfaces(html.classes['UnknownElement']); |
| + |
| + code.add('var htmlElementFields = const {\n'); |
| + var elements = new List.from(elemSet); |
| + elements.sort(); |
| + for (var element in elements) { |
| + var cls = html.classes[element]; |
| + var setters = []; |
| + |
| + var interfaces = cls.superinterfaces.filter( |
| + (i) => i.displayName.endsWith('Element')); |
| + |
| + if (interfaces.length > 1) { |
| + print('ERROR: $element has more than one Element superinterface:\n' |
| + ' $interfaces'); |
| + exit(2); |
| + } else if (interfaces.length > 0) { |
| + extendsCode.add(" '$element': '${interfaces[0].displayName}',\n"); |
| + } |
| + |
| + // TODO(jmesserly): using "cls.setters" does not seem to work |
| + for (var member in cls.members.values) { |
| + if (member.simpleName.startsWith(r'$')) continue; |
| + if (member is! VariableMirror) continue; |
| + if (member.isFinal || member.isConst) continue; |
| + setters.add(member.displayName); |
| + } |
| + |
| + if (setters.length == 0) continue; |
| + |
| + code.add(" '$element': const {\n"); |
| + for (var setter in setters) { |
| + var attr = fieldToAttribute[setter]; |
| + if (attr == null) attr = setter.toLowerCase(); |
| + code.add(" '$attr': '$setter',\n"); |
| + } |
| + code.add(' },\n'); |
| + } |
| + code.add('};\n\n'); |
| + extendsCode.add('};\n'); |
| + code.add(extendsCode.toString()); |
| + |
| + var outPath = new Path(new Options().script).directoryPath |
| + .append('..').append(OUTPUT_NAME); |
| + |
| + new File.fromPath(outPath) |
| + .openSync(FileMode.WRITE) |
| + ..writeStringSync(code.toString()) |
| + ..closeSync(); |
| + |
| + print('Wrote $outPath.'); |
| +} |