OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | |
Jennifer Messerly
2016/02/09 16:41:57
2016? :)
ochafik
2016/02/10 18:12:45
Done.
| |
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 part of js_ast; | |
6 | |
7 abstract class _TypePrinterBase implements TypeRefVisitor { | |
8 void out(String s); | |
9 void visit(Node node); | |
10 | |
11 outSeparated(String separator, Iterable items, [action(dynamic item)]) { | |
Jennifer Messerly
2016/02/09 16:41:58
void ?
ochafik
2016/02/10 18:12:45
Done.
| |
12 action ??= visit; | |
13 var first = true; | |
14 for (var item in items) { | |
15 if (first) { | |
16 first = false; | |
17 } else { | |
18 out(separator); | |
19 } | |
20 action(item); | |
21 } | |
22 } | |
23 | |
24 outTypeParams(Iterable<TypeRef> typeParams) { | |
Jennifer Messerly
2016/02/09 16:41:58
void ?
ochafik
2016/02/10 18:12:45
Done.
| |
25 if (typeParams.isNotEmpty) { | |
26 out('<'); | |
27 outSeparated(", ", typeParams); | |
28 out('>'); | |
29 } | |
30 } | |
31 | |
32 @override | |
33 visitQualifiedTypeRef(QualifiedTypeRef node) { | |
34 outSeparated(".", node.path); | |
35 } | |
36 } | |
37 | |
38 abstract class TypeScriptTypePrinter extends _TypePrinterBase { | |
39 | |
40 void _outTypeAnnotation(TypeRef type) { | |
41 if (type is OptionalTypeRef) { | |
42 out("?: "); | |
43 visit(type.type); | |
44 } else { | |
45 out(": "); | |
46 visit(type); | |
47 } | |
48 } | |
49 | |
50 @override | |
51 visitGenericTypeRef(GenericTypeRef node) { | |
52 if (node.rawType is FunctionTypeRef) { | |
53 outTypeParams(node.typeParams); | |
54 visit(node.rawType); | |
55 } else { | |
56 visit(node.rawType); | |
57 outTypeParams(node.typeParams); | |
58 } | |
59 } | |
60 | |
61 @override | |
62 visitArrayTypeRef(ArrayTypeRef node) { | |
63 if (node.elementType == null) { | |
64 out("Array"); | |
65 } else { | |
66 visit(node.elementType); | |
67 out("[]"); | |
68 } | |
69 } | |
70 | |
71 @override | |
72 visitOptionalTypeRef(OptionalTypeRef node) { | |
73 visit(node.type); | |
74 } | |
75 | |
76 @override | |
77 visitRecordTypeRef(RecordTypeRef node) { | |
78 out('{'); | |
79 outSeparated(", ", node.types.keys, (Identifier name) { | |
80 var type = node.types[name]; | |
81 visit(name); | |
82 _outTypeAnnotation(type); | |
83 }); | |
84 out('}'); | |
85 } | |
86 | |
87 @override | |
88 visitUnionTypeRef(UnionTypeRef node) { | |
89 outSeparated("|", node.types.where((t) => !t.isNull)); | |
90 } | |
91 | |
92 @override | |
93 visitFunctionTypeRef(FunctionTypeRef node) { | |
94 if (node.returnType == null) { | |
95 out('Function'); | |
96 } else { | |
97 out('('); | |
98 outSeparated(", ", node.paramTypes.keys, (name) { | |
99 var paramType = node.paramTypes[name]; | |
100 visit(name); | |
101 _outTypeAnnotation(paramType); | |
102 }); | |
103 out(') => '); | |
104 visit(node.returnType); | |
105 } | |
106 } | |
107 | |
108 @override | |
109 visitAnyTypeRef(AnyTypeRef node) { | |
110 out("any"); | |
111 } | |
112 | |
113 @override | |
114 visitUnknownTypeRef(UnknownTypeRef node) { | |
115 out("any"); | |
116 } | |
117 } | |
118 | |
119 class ClosureTypePrinter extends _TypePrinterBase implements NodeVisitor { | |
120 final _buffer = new StringBuffer(); | |
121 | |
122 @override | |
123 void out(String s) => _buffer.write(s); | |
124 | |
125 @override | |
126 void visit(Node node) => node.accept(this); | |
127 | |
128 noSuchMethod(Invocation i) => super.noSuchMethod(i); | |
129 | |
130 @override | |
131 visitGenericTypeRef(GenericTypeRef node) { | |
132 visit(node.rawType); | |
133 outTypeParams(node.typeParams); | |
134 } | |
135 | |
136 @override | |
137 visitIdentifier(Identifier node) { | |
138 //out(localNamer.getName(node)); | |
139 out(node.name); | |
140 } | |
141 | |
142 @override | |
143 visitAccess(PropertyAccess node) { | |
144 var selector = node.selector; | |
145 assert(selector is LiteralString); | |
146 if (selector is! LiteralString) { | |
147 out("?"); | |
148 return; | |
149 } | |
150 visit(node.receiver); | |
151 out("."); | |
152 out(selector.valueWithoutQuotes); | |
153 } | |
154 | |
155 @override toString() => _buffer.toString(); | |
156 | |
157 @override | |
158 visitArrayTypeRef(ArrayTypeRef node) { | |
159 out("Array"); | |
160 if (node.elementType != null) { | |
161 out("<"); | |
162 visit(node.elementType); | |
163 out(">"); | |
164 } | |
165 } | |
166 | |
167 @override | |
168 visitOptionalTypeRef(OptionalTypeRef node) { | |
169 visit(node.type); | |
170 out("="); | |
171 } | |
172 | |
173 @override | |
174 visitRecordTypeRef(RecordTypeRef node) { | |
175 out('{'); | |
176 outSeparated(", ", node.types.keys, (Identifier name) { | |
177 var type = node.types[name]; | |
178 visit(name); | |
179 out(": "); | |
180 visit(type is OptionalTypeRef ? type.orUndefined() : type); | |
181 }); | |
182 out('}'); | |
183 } | |
184 | |
185 @override | |
186 visitAnyTypeRef(AnyTypeRef node) { | |
187 out("*"); | |
188 } | |
189 | |
190 @override | |
191 visitUnknownTypeRef(UnknownTypeRef node) { | |
192 out("?"); | |
193 } | |
194 | |
195 @override | |
196 visitUnionTypeRef(UnionTypeRef node) { | |
197 out("("); | |
198 outSeparated("|", node.types); | |
199 out(")"); | |
200 } | |
201 | |
202 @override | |
203 visitFunctionTypeRef(FunctionTypeRef node) { | |
204 out('function('); | |
205 if (node.paramTypes == null) { | |
206 out("...*"); | |
207 } else { | |
208 outSeparated(", ", node.paramTypes.values); | |
209 } | |
210 out(')'); | |
211 if (node.returnType != null) { | |
212 out(":"); | |
213 visit(node.returnType); | |
214 } | |
215 } | |
216 } | |
OLD | NEW |