OLD | NEW |
| (Empty) |
1 // Copyright (c) 2011, 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 List sorted(Iterable input, [compare, key]) { | |
6 comparator(compare, key) { | |
7 if (compare == null && key == null) | |
8 return (a, b) => a.compareTo(b); | |
9 if (compare == null) | |
10 return (a, b) => key(a).compareTo(key(b)); | |
11 if (key == null) | |
12 return compare; | |
13 return (a, b) => compare(key(a), key(b)); | |
14 } | |
15 List copy = new List.from(input); | |
16 copy.sort(comparator(compare, key)); | |
17 return copy; | |
18 } | |
19 | |
20 render(idl_node, [indent_str=' ']) { | |
21 var output = ['']; | |
22 var indent_stack = []; | |
23 | |
24 //indented(action()) { | |
25 indented(action) { | |
26 indent_stack.add(indent_str); | |
27 action(); | |
28 indent_stack.removeLast(); | |
29 } | |
30 | |
31 sort(nodes) => sorted(nodes, key: (a) => a.id); | |
32 | |
33 var w; // For some reason mutually recursive local functions don't work. | |
34 | |
35 wln([node=null]) { | |
36 w(node); | |
37 output.add('\n'); | |
38 } | |
39 | |
40 w = (node, [list_separator]) { | |
41 /* | |
42 Writes the given node. | |
43 | |
44 Args: | |
45 node -- a string, IDLNode instance or a list of such. | |
46 list_separator -- if provided, and node is a list, | |
47 list_separator will be written between the list items. | |
48 */ | |
49 if (node == null) { | |
50 return; | |
51 } else if (node is String) { | |
52 if (output.last().endsWith('\n')) | |
53 output.addAll(indent_stack); | |
54 output.add(node); | |
55 } else if (node is List) { | |
56 var separator = null; | |
57 for (var element in node) { | |
58 w(separator); | |
59 separator = list_separator; | |
60 w(element); | |
61 } | |
62 } else if (node is IDLFile) { | |
63 w(node.modules); | |
64 w(node.interfaces); | |
65 } else if (node is IDLModule) { | |
66 w(node.annotations); | |
67 w(node.extAttrs); | |
68 wln('module ${node.id} {'); | |
69 indented(() { | |
70 w(node.interfaces); | |
71 w(node.typedefs); | |
72 }); | |
73 wln('};'); | |
74 } else if (node is IDLInterface) { | |
75 w(node.annotations); | |
76 w(node.extAttrs); | |
77 w('interface ${node.id}'); | |
78 indented(() { | |
79 if (!node.parents.isEmpty()) { | |
80 wln(' :'); | |
81 w(node.parents, ',\n'); | |
82 } | |
83 wln(' {'); | |
84 section(list, comment) { | |
85 if (list != null && !list.isEmpty()) { | |
86 wln(); | |
87 wln(comment); | |
88 w(sort(list)); | |
89 } | |
90 } | |
91 section(node.constants, '/* Constants */'); | |
92 section(node.attributes, '/* Attributes */'); | |
93 section(node.operations, '/* Operations */'); | |
94 section(node.snippets, '/* Snippets */'); | |
95 }); | |
96 wln('};'); | |
97 } else if (node is IDLParentInterface) { | |
98 w(node.annotations); | |
99 w(node.type.id); | |
100 } else if (node is IDLAnnotations) { | |
101 for (var name in sorted(node.map.getKeys())) { | |
102 IDLAnnotation annotation = node.map[name]; | |
103 var args = annotation.map; | |
104 if (args.isEmpty()) { | |
105 w('@$name'); | |
106 } else { | |
107 var formattedArgs = []; | |
108 for (var argName in sorted(args.getKeys())) { | |
109 var argValue = args[argName]; | |
110 if (argValue == null) | |
111 formattedArgs.add(argName); | |
112 else | |
113 formattedArgs.add('$argName=$argValue'); | |
114 } | |
115 w('@$name(${Strings.join(formattedArgs,',')})'); | |
116 } | |
117 w(' '); | |
118 } | |
119 } else if (node is IDLExtAttrs) { | |
120 if(!node.map.isEmpty()) { | |
121 w('['); | |
122 var sep = null; | |
123 for (var name in sorted(node.map.getKeys())) { | |
124 w(sep); | |
125 sep = ', '; | |
126 w(name); | |
127 var value = node.map[name]; | |
128 if (value != null) { | |
129 w('='); | |
130 w(value); | |
131 } | |
132 } | |
133 w('] '); | |
134 } | |
135 } else if (node is IDLAttribute) { | |
136 w(node.annotations); | |
137 w(node.extAttrs); | |
138 if (node.isFcGetter) | |
139 w('getter '); | |
140 if (node.isFcSetter) | |
141 w('setter '); | |
142 wln('attribute ${node.type.id} ${node.id};'); | |
143 } else if (node is IDLConstant) { | |
144 w(node.annotations); | |
145 w(node.extAttrs); | |
146 wln('const ${node.type.id} ${node.id} = ${node.value};'); | |
147 } else if (node is IDLSnippet) { | |
148 w(node.annotations); | |
149 wln('snippet {${node.text}};'); | |
150 } else if (node is IDLOperation) { | |
151 w(node.annotations); | |
152 w(node.extAttrs); | |
153 if (node.specials != null && !node.specials.isEmpty()) { | |
154 w(node.specials, ' '); | |
155 w(' '); | |
156 } | |
157 w('${node.type.id} ${node.id}'); | |
158 w('('); | |
159 w(node.arguments, ', '); | |
160 wln(');'); | |
161 } else if (node is IDLArgument) { | |
162 w(node.extAttrs); | |
163 w('in '); | |
164 if (node.isOptional) | |
165 w('optional '); | |
166 w('${node.type.id} ${node.id}'); | |
167 } else if (node is IDLExtAttrFunctionValue) { | |
168 w(node.name); | |
169 w('('); | |
170 w(node.arguments, ', '); | |
171 w(')'); | |
172 } else if (node is IDLTypeDef) { | |
173 wln('typedef ${node.type.id} ${node.id};'); | |
174 } else { | |
175 w('// $node\n'); | |
176 } | |
177 }; | |
178 | |
179 w(idl_node); | |
180 return Strings.concatAll(output); | |
181 } | |
OLD | NEW |