@@ -16,6 +16,7 @@ import 'specs/field.dart';
1616import 'specs/file.dart' ;
1717import 'specs/method.dart' ;
1818import 'specs/reference.dart' ;
19+ import 'specs/type_function.dart' ;
1920import 'specs/type_reference.dart' ;
2021import 'visitors.dart' ;
2122
@@ -80,27 +81,38 @@ class DartEmitter extends Object
8081 output.write ('abstract ' );
8182 }
8283 output.write ('class ${spec .name }' );
83- visitTypeParameters (spec.types.map ((r) => r.toType () ), output);
84+ visitTypeParameters (spec.types.map ((r) => r.type ), output);
8485 if (spec.extend != null ) {
8586 output.write (' extends ' );
86- visitType (spec.extend.toType () , output);
87+ visitType (spec.extend.type , output);
8788 }
8889 if (spec.mixins.isNotEmpty) {
8990 output
9091 ..write (' with ' )
91- ..writeAll (
92- spec.mixins.map <StringSink >((m) => visitType (m.toType ())), ',' );
92+ ..writeAll (spec.mixins.map <StringSink >((m) => visitType (m.type)), ',' );
9393 }
9494 if (spec.implements .isNotEmpty) {
9595 output
9696 ..write (' implements ' )
9797 ..writeAll (
98- spec.implements .map <StringSink >((m) => visitType (m.toType () )), ',' );
98+ spec.implements .map <StringSink >((m) => visitType (m.type )), ',' );
9999 }
100100 output.write (' {' );
101- spec.constructors.forEach ((c) => visitConstructor (c, spec.name, output));
102- spec.fields.forEach ((f) => visitField (f, output));
103- spec.methods.forEach ((m) => visitMethod (m, output));
101+ spec.constructors.forEach ((c) {
102+ visitConstructor (c, spec.name, output);
103+ output.writeln ();
104+ });
105+ spec.fields.forEach ((f) {
106+ visitField (f, output);
107+ output.writeln ();
108+ });
109+ spec.methods.forEach ((m) {
110+ visitMethod (m, output);
111+ if (m.lambda) {
112+ output.write (';' );
113+ }
114+ output.writeln ();
115+ });
104116 output.writeln (' }' );
105117 return output;
106118 }
@@ -170,7 +182,7 @@ class DartEmitter extends Object
170182 }
171183 if (spec.redirect != null ) {
172184 output.write (' = ' );
173- visitType (spec.redirect.toType () , output);
185+ visitType (spec.redirect.type , output);
174186 output.write (';' );
175187 } else if (spec.body != null ) {
176188 if (spec.lambda) {
@@ -239,7 +251,7 @@ class DartEmitter extends Object
239251 break ;
240252 }
241253 if (spec.type != null ) {
242- visitType (spec.type.toType () , output);
254+ visitType (spec.type.type , output);
243255 output.write (' ' );
244256 }
245257 output.write (spec.name);
@@ -258,6 +270,9 @@ class DartEmitter extends Object
258270 final body = new StringBuffer ();
259271 for (final spec in spec.body) {
260272 body.write (visitSpec (spec));
273+ if (spec is Method && spec.lambda) {
274+ output.write (';' );
275+ }
261276 }
262277 // TODO: Allow some sort of logical ordering.
263278 for (final directive in spec.directives) {
@@ -270,6 +285,46 @@ class DartEmitter extends Object
270285 return output;
271286 }
272287
288+ @override
289+ visitFunctionType (FunctionType spec, [StringSink output]) {
290+ output ?? = new StringBuffer ();
291+ if (spec.returnType != null ) {
292+ spec.returnType.accept (this , output);
293+ output.write (' ' );
294+ }
295+ output.write ('Function' );
296+ if (spec.types.isNotEmpty) {
297+ output.write ('<' );
298+ visitAll <Reference >(spec.types, output, (spec) {
299+ spec.accept (this , output);
300+ });
301+ output.write ('>' );
302+ }
303+ output.write ('(' );
304+ visitAll <Reference >(spec.requiredParameters, output, (spec) {
305+ spec.accept (this , output);
306+ });
307+ if (spec.optionalParameters.isNotEmpty ||
308+ spec.namedParameters.isNotEmpty && spec.requiredParameters.isNotEmpty) {
309+ output.write (', ' );
310+ }
311+ if (spec.optionalParameters.isNotEmpty) {
312+ output.write ('[' );
313+ visitAll <Reference >(spec.optionalParameters, output, (spec) {
314+ spec.accept (this , output);
315+ });
316+ output.write (']' );
317+ } else if (spec.namedParameters.isNotEmpty) {
318+ output.write ('{' );
319+ visitAll <String >(spec.namedParameters.keys, output, (name) {
320+ spec.namedParameters[name].accept (this , output);
321+ output..write (' ' )..write (name);
322+ });
323+ output.write ('}' );
324+ }
325+ return output..write (')' );
326+ }
327+
273328 @override
274329 visitMethod (Method spec, [StringSink output]) {
275330 output ?? = new StringBuffer ();
@@ -282,7 +337,7 @@ class DartEmitter extends Object
282337 output.write ('static ' );
283338 }
284339 if (spec.returns != null ) {
285- visitType (spec.returns.toType () , output);
340+ visitType (spec.returns.type , output);
286341 output.write (' ' );
287342 }
288343 if (spec.type == MethodType .getter) {
@@ -291,8 +346,10 @@ class DartEmitter extends Object
291346 if (spec.type == MethodType .setter) {
292347 output.write ('set ' );
293348 }
294- output.write (spec.name);
295- visitTypeParameters (spec.types.map ((r) => r.toType ()), output);
349+ if (spec.name != null ) {
350+ output.write (spec.name);
351+ }
352+ visitTypeParameters (spec.types.map ((r) => r.type), output);
296353 output.write ('(' );
297354 if (spec.requiredParameters.isNotEmpty) {
298355 var count = 0 ;
@@ -348,15 +405,12 @@ class DartEmitter extends Object
348405 output.write (' { ' );
349406 }
350407 spec.body.accept (this , output);
351- if (spec.lambda) {
352- output.write (';' );
353- } else {
408+ if (! spec.lambda) {
354409 output.write (' } ' );
355410 }
356411 } else {
357412 output.write (';' );
358413 }
359- output.writeln ();
360414 return output;
361415 }
362416
@@ -370,7 +424,7 @@ class DartEmitter extends Object
370424 spec.docs.forEach (output.writeln);
371425 spec.annotations.forEach ((a) => visitAnnotation (a, output));
372426 if (spec.type != null ) {
373- visitType (spec.type.toType () , output);
427+ visitType (spec.type.type , output);
374428 output.write (' ' );
375429 }
376430 if (spec.toThis) {
@@ -401,9 +455,9 @@ class DartEmitter extends Object
401455 visitReference (spec, output);
402456 if (spec.bound != null ) {
403457 output.write (' extends ' );
404- visitType (spec.bound.toType () , output);
458+ visitType (spec.bound.type , output);
405459 }
406- visitTypeParameters (spec.types.map ((r) => r.toType () ), output);
460+ visitTypeParameters (spec.types.map ((r) => r.type ), output);
407461 return output;
408462 }
409463
0 commit comments