Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(55)

Unified Diff: lib/src/js/printer.dart

Issue 1676463002: Type annotations instead of closure comments. (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: lib/src/js/printer.dart
diff --git a/lib/src/js/printer.dart b/lib/src/js/printer.dart
index bd8de3b40aa49c9bae41dc8051df78f5f84e9465..23b3a15d144f8b0e35f1625ec271907d9ad85411 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 printTypes;
Jennifer Messerly 2016/02/09 01:21:33 this sounds like a method name. Maybe "shouldPrint
ochafik 2016/02/10 18:12:45 Thanks, went for 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.printTypes: false,
this.allowKeywordsInProperties: false,
this.allowSingleLineIfStatements: false});
}
@@ -52,7 +54,7 @@ class SimpleJavaScriptPrintingContext extends JavaScriptPrintingContext {
}
-class Printer implements NodeVisitor {
+class Printer extends TypeScriptTypePrinter implements NodeVisitor {
Jennifer Messerly 2016/02/09 01:21:34 Hmmm. I haven't seen the other class yet, but this
ochafik 2016/02/10 18:12:45 Good point, left a TODO for when/if we drop Closur
final JavaScriptPrintingOptions options;
final JavaScriptPrintingContext context;
final bool shouldCompressOutput;
@@ -541,12 +543,14 @@ class Printer implements NodeVisitor {
newInForInit: false, newAtStatementBegin: false);
}
localNamer.enterScope(fun);
+ outTypeArgs(fun.typeArgs);
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 +605,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);
}
@@ -630,6 +637,7 @@ class Printer implements NodeVisitor {
}
visit(node.structure);
}
+ outTypeAnnotation(node.type);
if (node.defaultValue != null) {
spaceOut();
out("=");
@@ -856,6 +864,7 @@ class Printer implements NodeVisitor {
visitIdentifier(Identifier node) {
out(localNamer.getName(node));
+ outTypeAnnotation(node.type);
}
visitRestParameter(RestParameter node) {
@@ -921,7 +930,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.printTypes)) {
visitNestedExpression(fun.params.single, SPREAD,
newInForInit: false, newAtStatementBegin: false);
} else {
@@ -930,6 +940,7 @@ class Printer implements NodeVisitor {
newInForInit: false, newAtStatementBegin: false);
out(")");
}
+ outTypeAnnotation(fun.returnType);
spaceOut();
out("=>");
if (fun.body is Expression) {
@@ -1068,9 +1079,23 @@ class Printer implements NodeVisitor {
lineOut();
}
+ outTypeArgs(List<Identifier> typeArgs) {
+ if (options.printTypes && typeArgs != null && typeArgs.isNotEmpty) {
Jennifer Messerly 2016/02/09 01:21:33 null check on variable/param is probably fastest,
ochafik 2016/02/10 18:12:45 Done.
+ out("<");
Jennifer Messerly 2016/02/09 01:21:33 does typescript have any cases where precedence co
ochafik 2016/02/10 18:12:45 It *looks* fine in TS (since the : would announce
+ var first = true;
+ for (var typeParam in typeArgs) {
+ if (!first) out(", ");
+ first = false;
+ visit(typeParam);
+ }
+ out(">");
+ }
+ }
+
visitClassExpression(ClassExpression node) {
out('class ');
visit(node.name);
+ outTypeArgs(node.typeArgs);
if (node.heritage != null) {
out(' extends ');
visit(node.heritage);
@@ -1080,6 +1105,14 @@ class Printer implements NodeVisitor {
out('{');
lineOut();
indentMore();
+ if (options.printTypes) {
+ for (var field in node.fields) {
+ indent();
+ visit(field);
+ out(";");
+ lineOut();
+ }
+ }
for (var method in node.methods) {
indent();
visit(method);
@@ -1311,6 +1344,18 @@ class Printer implements NodeVisitor {
out("await ");
visit(node.expression);
}
+
+ void outTypeAnnotation(TypeRef node) {
+ if (!options.printTypes || node == null || node.isUnknown) return;
Jennifer Messerly 2016/02/09 01:21:33 silly micro opt: check null first
ochafik 2016/02/10 18:12:45 Done.
+
+ 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

Powered by Google App Engine
This is Rietveld 408576698