| Index: lib/src/js/printer.dart
|
| diff --git a/lib/src/js/printer.dart b/lib/src/js/printer.dart
|
| index 02bf379a74871a8b82bd27ef89827c59c42b1c54..cc347255cb69d824453503dc5aeac5ba30f5cda4 100644
|
| --- a/lib/src/js/printer.dart
|
| +++ b/lib/src/js/printer.dart
|
| @@ -9,6 +9,7 @@ class JavaScriptPrintingOptions {
|
| final bool shouldCompressOutput;
|
| final bool minifyLocalVariables;
|
| final bool preferSemicolonToNewlineInMinifiedOutput;
|
| + final bool shouldEmitTypes;
|
| final bool allowSingleLineIfStatements;
|
|
|
| /// True to allow keywords in properties, such as `obj.var` or `obj.function`
|
| @@ -19,6 +20,7 @@ class JavaScriptPrintingOptions {
|
| {this.shouldCompressOutput: false,
|
| this.minifyLocalVariables: false,
|
| this.preferSemicolonToNewlineInMinifiedOutput: false,
|
| + this.shouldEmitTypes: false,
|
| this.allowKeywordsInProperties: false,
|
| this.allowSingleLineIfStatements: false});
|
| }
|
| @@ -51,8 +53,9 @@ class SimpleJavaScriptPrintingContext extends JavaScriptPrintingContext {
|
| String getText() => buffer.toString();
|
| }
|
|
|
| -
|
| -class Printer implements NodeVisitor {
|
| +// TODO(ochafik): Inline the body of [TypeScriptTypePrinter] here if/when it no
|
| +// longer needs to share utils with [ClosureTypePrinter].
|
| +class Printer extends TypeScriptTypePrinter implements NodeVisitor {
|
| final JavaScriptPrintingOptions options;
|
| final JavaScriptPrintingContext context;
|
| final bool shouldCompressOutput;
|
| @@ -541,12 +544,14 @@ class Printer implements NodeVisitor {
|
| newInForInit: false, newAtStatementBegin: false);
|
| }
|
| localNamer.enterScope(fun);
|
| + outTypeParams(fun.typeParams);
|
| out("(");
|
| if (fun.params != null) {
|
| visitCommaSeparated(fun.params, PRIMARY,
|
| newInForInit: false, newAtStatementBegin: false);
|
| }
|
| out(")");
|
| + outTypeAnnotation(fun.returnType);
|
| switch (fun.asyncModifier) {
|
| case const AsyncModifier.sync():
|
| break;
|
| @@ -601,8 +606,11 @@ class Printer implements NodeVisitor {
|
|
|
| visitVariableDeclarationList(VariableDeclarationList list) {
|
| outClosureAnnotation(list);
|
| - out(list.keyword);
|
| - out(" ");
|
| + // Note: keyword can be null for non-static field declarations.
|
| + if (list.keyword != null) {
|
| + out(list.keyword);
|
| + out(" ");
|
| + }
|
| visitCommaSeparated(list.declarations, ASSIGNMENT,
|
| newInForInit: inForInit, newAtStatementBegin: false);
|
| }
|
| @@ -639,6 +647,7 @@ class Printer implements NodeVisitor {
|
| }
|
| visit(node.structure);
|
| }
|
| + outTypeAnnotation(node.type);
|
| if (node.defaultValue != null) {
|
| spaceOut();
|
| out("=");
|
| @@ -869,6 +878,7 @@ class Printer implements NodeVisitor {
|
|
|
| visitIdentifier(Identifier node) {
|
| out(localNamer.getName(node));
|
| + outTypeAnnotation(node.type);
|
| }
|
|
|
| visitRestParameter(RestParameter node) {
|
| @@ -934,7 +944,8 @@ class Printer implements NodeVisitor {
|
|
|
| visitArrowFun(ArrowFun fun) {
|
| localNamer.enterScope(fun);
|
| - if (fun.params.length == 1) {
|
| + if (fun.params.length == 1 &&
|
| + (fun.params.single.type == null || !options.shouldEmitTypes)) {
|
| visitNestedExpression(fun.params.single, SPREAD,
|
| newInForInit: false, newAtStatementBegin: false);
|
| } else {
|
| @@ -943,6 +954,7 @@ class Printer implements NodeVisitor {
|
| newInForInit: false, newAtStatementBegin: false);
|
| out(")");
|
| }
|
| + outTypeAnnotation(fun.returnType);
|
| spaceOut();
|
| out("=>");
|
| if (fun.body is Expression) {
|
| @@ -1081,9 +1093,23 @@ class Printer implements NodeVisitor {
|
| lineOut();
|
| }
|
|
|
| + void outTypeParams(Iterable<Identifier> typeParams) {
|
| + if (typeParams != null && options.shouldEmitTypes && typeParams.isNotEmpty) {
|
| + out("<");
|
| + var first = true;
|
| + for (var typeParam in typeParams) {
|
| + if (!first) out(", ");
|
| + first = false;
|
| + visit(typeParam);
|
| + }
|
| + out(">");
|
| + }
|
| + }
|
| +
|
| visitClassExpression(ClassExpression node) {
|
| out('class ');
|
| visit(node.name);
|
| + outTypeParams(node.typeParams);
|
| if (node.heritage != null) {
|
| out(' extends ');
|
| visit(node.heritage);
|
| @@ -1093,6 +1119,14 @@ class Printer implements NodeVisitor {
|
| out('{');
|
| lineOut();
|
| indentMore();
|
| + if (options.shouldEmitTypes && node.fields != null) {
|
| + for (var field in node.fields) {
|
| + indent();
|
| + visit(field);
|
| + out(";");
|
| + lineOut();
|
| + }
|
| + }
|
| for (var method in node.methods) {
|
| indent();
|
| visit(method);
|
| @@ -1324,6 +1358,18 @@ class Printer implements NodeVisitor {
|
| out("await ");
|
| visit(node.expression);
|
| }
|
| +
|
| + void outTypeAnnotation(TypeRef node) {
|
| + if (node == null || !options.shouldEmitTypes || node.isUnknown) return;
|
| +
|
| + if (node is OptionalTypeRef) {
|
| + out("?: ");
|
| + visit(node.type);
|
| + } else {
|
| + out(": ");
|
| + visit(node);
|
| + }
|
| + }
|
| }
|
|
|
| // Collects all the var declarations in the function. We need to do this in a
|
|
|