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

Unified Diff: lib/src/js/type_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/type_printer.dart
diff --git a/lib/src/js/type_printer.dart b/lib/src/js/type_printer.dart
new file mode 100644
index 0000000000000000000000000000000000000000..74cc6fd24e5f3f86bdbfe20ed71c7de204117650
--- /dev/null
+++ b/lib/src/js/type_printer.dart
@@ -0,0 +1,216 @@
+// 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.
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of js_ast;
+
+abstract class _TypePrinterBase implements TypeRefVisitor {
+ void out(String s);
+ void visit(Node node);
+
+ 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.
+ action ??= visit;
+ var first = true;
+ for (var item in items) {
+ if (first) {
+ first = false;
+ } else {
+ out(separator);
+ }
+ action(item);
+ }
+ }
+
+ outTypeParams(Iterable<TypeRef> typeParams) {
Jennifer Messerly 2016/02/09 16:41:58 void ?
ochafik 2016/02/10 18:12:45 Done.
+ if (typeParams.isNotEmpty) {
+ out('<');
+ outSeparated(", ", typeParams);
+ out('>');
+ }
+ }
+
+ @override
+ visitQualifiedTypeRef(QualifiedTypeRef node) {
+ outSeparated(".", node.path);
+ }
+}
+
+abstract class TypeScriptTypePrinter extends _TypePrinterBase {
+
+ void _outTypeAnnotation(TypeRef type) {
+ if (type is OptionalTypeRef) {
+ out("?: ");
+ visit(type.type);
+ } else {
+ out(": ");
+ visit(type);
+ }
+ }
+
+ @override
+ visitGenericTypeRef(GenericTypeRef node) {
+ if (node.rawType is FunctionTypeRef) {
+ outTypeParams(node.typeParams);
+ visit(node.rawType);
+ } else {
+ visit(node.rawType);
+ outTypeParams(node.typeParams);
+ }
+ }
+
+ @override
+ visitArrayTypeRef(ArrayTypeRef node) {
+ if (node.elementType == null) {
+ out("Array");
+ } else {
+ visit(node.elementType);
+ out("[]");
+ }
+ }
+
+ @override
+ visitOptionalTypeRef(OptionalTypeRef node) {
+ visit(node.type);
+ }
+
+ @override
+ visitRecordTypeRef(RecordTypeRef node) {
+ out('{');
+ outSeparated(", ", node.types.keys, (Identifier name) {
+ var type = node.types[name];
+ visit(name);
+ _outTypeAnnotation(type);
+ });
+ out('}');
+ }
+
+ @override
+ visitUnionTypeRef(UnionTypeRef node) {
+ outSeparated("|", node.types.where((t) => !t.isNull));
+ }
+
+ @override
+ visitFunctionTypeRef(FunctionTypeRef node) {
+ if (node.returnType == null) {
+ out('Function');
+ } else {
+ out('(');
+ outSeparated(", ", node.paramTypes.keys, (name) {
+ var paramType = node.paramTypes[name];
+ visit(name);
+ _outTypeAnnotation(paramType);
+ });
+ out(') => ');
+ visit(node.returnType);
+ }
+ }
+
+ @override
+ visitAnyTypeRef(AnyTypeRef node) {
+ out("any");
+ }
+
+ @override
+ visitUnknownTypeRef(UnknownTypeRef node) {
+ out("any");
+ }
+}
+
+class ClosureTypePrinter extends _TypePrinterBase implements NodeVisitor {
+ final _buffer = new StringBuffer();
+
+ @override
+ void out(String s) => _buffer.write(s);
+
+ @override
+ void visit(Node node) => node.accept(this);
+
+ noSuchMethod(Invocation i) => super.noSuchMethod(i);
+
+ @override
+ visitGenericTypeRef(GenericTypeRef node) {
+ visit(node.rawType);
+ outTypeParams(node.typeParams);
+ }
+
+ @override
+ visitIdentifier(Identifier node) {
+ //out(localNamer.getName(node));
+ out(node.name);
+ }
+
+ @override
+ visitAccess(PropertyAccess node) {
+ var selector = node.selector;
+ assert(selector is LiteralString);
+ if (selector is! LiteralString) {
+ out("?");
+ return;
+ }
+ visit(node.receiver);
+ out(".");
+ out(selector.valueWithoutQuotes);
+ }
+
+ @override toString() => _buffer.toString();
+
+ @override
+ visitArrayTypeRef(ArrayTypeRef node) {
+ out("Array");
+ if (node.elementType != null) {
+ out("<");
+ visit(node.elementType);
+ out(">");
+ }
+ }
+
+ @override
+ visitOptionalTypeRef(OptionalTypeRef node) {
+ visit(node.type);
+ out("=");
+ }
+
+ @override
+ visitRecordTypeRef(RecordTypeRef node) {
+ out('{');
+ outSeparated(", ", node.types.keys, (Identifier name) {
+ var type = node.types[name];
+ visit(name);
+ out(": ");
+ visit(type is OptionalTypeRef ? type.orUndefined() : type);
+ });
+ out('}');
+ }
+
+ @override
+ visitAnyTypeRef(AnyTypeRef node) {
+ out("*");
+ }
+
+ @override
+ visitUnknownTypeRef(UnknownTypeRef node) {
+ out("?");
+ }
+
+ @override
+ visitUnionTypeRef(UnionTypeRef node) {
+ out("(");
+ outSeparated("|", node.types);
+ out(")");
+ }
+
+ @override
+ visitFunctionTypeRef(FunctionTypeRef node) {
+ out('function(');
+ if (node.paramTypes == null) {
+ out("...*");
+ } else {
+ outSeparated(", ", node.paramTypes.values);
+ }
+ out(')');
+ if (node.returnType != null) {
+ out(":");
+ visit(node.returnType);
+ }
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698