| Index: client/dom/scripts/idlrenderer.dart
|
| diff --git a/client/dom/scripts/idlrenderer.dart b/client/dom/scripts/idlrenderer.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..4b81f0e7db87d9f0f8b28d32d54cde602824ecff
|
| --- /dev/null
|
| +++ b/client/dom/scripts/idlrenderer.dart
|
| @@ -0,0 +1,181 @@
|
| +// Copyright (c) 2011, 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.
|
| +
|
| +List sorted(Iterable input, [compare, key]) {
|
| + comparator(compare, key) {
|
| + if (compare == null && key == null)
|
| + return (a, b) => a.compareTo(b);
|
| + if (compare == null)
|
| + return (a, b) => key(a).compareTo(key(b));
|
| + if (key == null)
|
| + return compare;
|
| + return (a, b) => compare(key(a), key(b));
|
| + }
|
| + List copy = new List.from(input);
|
| + copy.sort(comparator(compare, key));
|
| + return copy;
|
| +}
|
| +
|
| +render(idl_node, [indent_str=' ']) {
|
| + var output = [''];
|
| + var indent_stack = [];
|
| +
|
| + //indented(action()) {
|
| + indented(action) {
|
| + indent_stack.add(indent_str);
|
| + action();
|
| + indent_stack.removeLast();
|
| + }
|
| +
|
| + sort(nodes) => sorted(nodes, key: (a) => a.id);
|
| +
|
| + var w; // For some reason mutually recursive local functions don't work.
|
| +
|
| + wln([node=null]) {
|
| + w(node);
|
| + output.add('\n');
|
| + }
|
| +
|
| + w = (node, [list_separator]) {
|
| + /*
|
| + Writes the given node.
|
| +
|
| + Args:
|
| + node -- a string, IDLNode instance or a list of such.
|
| + list_separator -- if provided, and node is a list,
|
| + list_separator will be written between the list items.
|
| + */
|
| + if (node == null) {
|
| + return;
|
| + } else if (node is String) {
|
| + if (output.last().endsWith('\n'))
|
| + output.addAll(indent_stack);
|
| + output.add(node);
|
| + } else if (node is List) {
|
| + var separator = null;
|
| + for (var element in node) {
|
| + w(separator);
|
| + separator = list_separator;
|
| + w(element);
|
| + }
|
| + } else if (node is IDLFile) {
|
| + w(node.modules);
|
| + w(node.interfaces);
|
| + } else if (node is IDLModule) {
|
| + w(node.annotations);
|
| + w(node.extAttrs);
|
| + wln('module ${node.id} {');
|
| + indented(() {
|
| + w(node.interfaces);
|
| + w(node.typedefs);
|
| + });
|
| + wln('};');
|
| + } else if (node is IDLInterface) {
|
| + w(node.annotations);
|
| + w(node.extAttrs);
|
| + w('interface ${node.id}');
|
| + indented(() {
|
| + if (!node.parents.isEmpty()) {
|
| + wln(' :');
|
| + w(node.parents, ',\n');
|
| + }
|
| + wln(' {');
|
| + section(list, comment) {
|
| + if (list != null && !list.isEmpty()) {
|
| + wln();
|
| + wln(comment);
|
| + w(sort(list));
|
| + }
|
| + }
|
| + section(node.constants, '/* Constants */');
|
| + section(node.attributes, '/* Attributes */');
|
| + section(node.operations, '/* Operations */');
|
| + section(node.snippets, '/* Snippets */');
|
| + });
|
| + wln('};');
|
| + } else if (node is IDLParentInterface) {
|
| + w(node.annotations);
|
| + w(node.type.id);
|
| + } else if (node is IDLAnnotations) {
|
| + for (var name in sorted(node.map.getKeys())) {
|
| + IDLAnnotation annotation = node.map[name];
|
| + var args = annotation.map;
|
| + if (args.isEmpty()) {
|
| + w('@$name');
|
| + } else {
|
| + var formattedArgs = [];
|
| + for (var argName in sorted(args.getKeys())) {
|
| + var argValue = args[argName];
|
| + if (argValue == null)
|
| + formattedArgs.add(argName);
|
| + else
|
| + formattedArgs.add('$argName=$argValue');
|
| + }
|
| + w('@$name(${Strings.join(formattedArgs,',')})');
|
| + }
|
| + w(' ');
|
| + }
|
| + } else if (node is IDLExtAttrs) {
|
| + if(!node.map.isEmpty()) {
|
| + w('[');
|
| + var sep = null;
|
| + for (var name in sorted(node.map.getKeys())) {
|
| + w(sep);
|
| + sep = ', ';
|
| + w(name);
|
| + var value = node.map[name];
|
| + if (value != null) {
|
| + w('=');
|
| + w(value);
|
| + }
|
| + }
|
| + w('] ');
|
| + }
|
| + } else if (node is IDLAttribute) {
|
| + w(node.annotations);
|
| + w(node.extAttrs);
|
| + if (node.isFcGetter)
|
| + w('getter ');
|
| + if (node.isFcSetter)
|
| + w('setter ');
|
| + wln('attribute ${node.type.id} ${node.id};');
|
| + } else if (node is IDLConstant) {
|
| + w(node.annotations);
|
| + w(node.extAttrs);
|
| + wln('const ${node.type.id} ${node.id} = ${node.value};');
|
| + } else if (node is IDLSnippet) {
|
| + w(node.annotations);
|
| + wln('snippet {${node.text}};');
|
| + } else if (node is IDLOperation) {
|
| + w(node.annotations);
|
| + w(node.extAttrs);
|
| + if (node.specials != null && !node.specials.isEmpty()) {
|
| + w(node.specials, ' ');
|
| + w(' ');
|
| + }
|
| + w('${node.type.id} ${node.id}');
|
| + w('(');
|
| + w(node.arguments, ', ');
|
| + wln(');');
|
| + } else if (node is IDLArgument) {
|
| + w(node.extAttrs);
|
| + w('in ');
|
| + if (node.isOptional)
|
| + w('optional ');
|
| + w('${node.type.id} ${node.id}');
|
| + } else if (node is IDLExtAttrFunctionValue) {
|
| + w(node.name);
|
| + w('(');
|
| + w(node.arguments, ', ');
|
| + w(')');
|
| + } else if (node is IDLTypeDef) {
|
| + wln('typedef ${node.type.id} ${node.id};');
|
| + } else {
|
| + w('// $node\n');
|
| + }
|
| + };
|
| +
|
| + w(idl_node);
|
| + return Strings.concatAll(output);
|
| +}
|
|
|