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

Side by Side Diff: lib/src/closure/closure_annotation.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 unified diff | Download patch
« no previous file with comments | « no previous file | lib/src/closure/closure_annotator.dart » ('j') | lib/src/js/js_types.dart » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 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. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 import 'closure_type.dart'; 5 import '../js/js_ast.dart' as JS show TypeRef, JsTypeRef, ClosureTypePrinter;
6 6
7 /// Set of closure annotations that can be [toString]ed to a single JsDoc commen t. 7 /// Set of closure annotations that can be [toString]ed to a single JsDoc commen t.
8 /// See https://developers.google.com/closure/compiler/docs/js-for-compiler 8 /// See https://developers.google.com/closure/compiler/docs/js-for-compiler
9 /// 9 ///
10 /// TODO(ochafik): Support inclusion of 'normal' comments (including @param comm ents). 10 /// TODO(ochafik): Support inclusion of 'normal' comments (including @param comm ents).
11 class ClosureAnnotation { 11 class ClosureAnnotation {
12 final String comment;
12 final bool isConst; 13 final bool isConst;
13 final bool isConstructor; 14 final bool isConstructor;
14 final bool isFinal; 15 final bool isFinal;
15 final bool isNoCollapse; 16 final bool isNoCollapse;
16 final bool isNoSideEffects; 17 final bool isNoSideEffects;
17 final bool isOverride; 18 final bool isOverride;
18 final bool isPrivate; 19 final bool isPrivate;
19 final bool isProtected; 20 final bool isProtected;
20 final bool isStruct; 21 final bool isStruct;
21 final bool isTypedef; 22 final bool isTypedef;
22 final ClosureType lendsToType; 23 final JS.TypeRef lendsToType;
23 final ClosureType returnType; 24 final JS.TypeRef returnType;
24 final ClosureType superType; 25 final JS.TypeRef superType;
25 final ClosureType thisType; 26 final JS.TypeRef thisType;
26 final ClosureType throwsType; 27 final JS.TypeRef throwsType;
27 final ClosureType type; 28 final JS.TypeRef type;
28 final List<ClosureType> interfaces; 29 final List<JS.TypeRef> interfaces;
29 final List<String> templates; 30 final List<String> templates;
30 final Map<String, ClosureType> paramTypes; 31 final Map<String, JS.TypeRef> paramTypes;
31 32
32 ClosureAnnotation( 33 ClosureAnnotation(
33 {this.interfaces: const [], 34 {this.comment,
35 this.interfaces: const [],
34 this.isConst: false, 36 this.isConst: false,
35 this.isConstructor: false, 37 this.isConstructor: false,
36 this.isFinal: false, 38 this.isFinal: false,
37 this.isNoCollapse: false, 39 this.isNoCollapse: false,
38 this.isNoSideEffects: false, 40 this.isNoSideEffects: false,
39 this.isOverride: false, 41 this.isOverride: false,
40 this.isPrivate: false, 42 this.isPrivate: false,
41 this.isProtected: false, 43 this.isProtected: false,
42 this.isStruct: false, 44 this.isStruct: false,
43 this.isTypedef: false, 45 this.isTypedef: false,
(...skipping 10 matching lines...) Expand all
54 int get hashCode => _cachedString.hashCode; 56 int get hashCode => _cachedString.hashCode;
55 57
56 @override 58 @override
57 bool operator ==(other) => 59 bool operator ==(other) =>
58 other is ClosureAnnotation && _cachedString == other._cachedString; 60 other is ClosureAnnotation && _cachedString == other._cachedString;
59 61
60 @override 62 @override
61 String toString([String indent = '']) => 63 String toString([String indent = '']) =>
62 _cachedString.replaceAll('\n', '\n$indent'); 64 _cachedString.replaceAll('\n', '\n$indent');
63 65
66 String _print(JS.TypeRef t) =>
67 (new JS.ClosureTypePrinter()..visit(t)).toString();
68
64 String __cachedString; 69 String __cachedString;
65 String get _cachedString { 70 String get _cachedString {
66 if (__cachedString == null) { 71 if (__cachedString == null) {
67 bool isNonWildcard(ClosureType t) => 72 bool isNonWildcard(JS.TypeRef t) => t != null && !t.isAny && !t.isUnknown;
68 t != null && !t.isAll && !t.isUnknown;
69 73
70 var lines = <String>[]; 74 var lines = <String>[];
75 if (comment != null) lines.addAll(comment.split('\n'));
71 if (templates != null && templates.isNotEmpty) { 76 if (templates != null && templates.isNotEmpty) {
72 lines.add('@template ${templates.join(', ')}'); 77 lines.add('@template ${templates.join(', ')}');
73 } 78 }
74 if (thisType != null) lines.add('@this {$thisType}'); 79 if (thisType != null) lines.add('@this {${_print(thisType)}}');
75 if (isOverride) lines.add('@override'); 80 if (isOverride) lines.add('@override');
76 if (isNoSideEffects) lines.add('@nosideeffects'); 81 if (isNoSideEffects) lines.add('@nosideeffects');
77 if (isNoCollapse) lines.add('@nocollapse'); 82 if (isNoCollapse) lines.add('@nocollapse');
78 if (lendsToType != null) lines.add('@lends {$lendsToType}'); 83 if (lendsToType != null) lines.add('@lends {${_print(lendsToType)}}');
79 84
80 { 85 {
81 var typeHolders = <String>[]; 86 var typeHolders = <String>[];
82 if (isPrivate) typeHolders.add('@private'); 87 if (isPrivate) typeHolders.add('@private');
83 if (isProtected) typeHolders.add('@protected'); 88 if (isProtected) typeHolders.add('@protected');
84 if (isFinal) typeHolders.add('@final'); 89 if (isFinal) typeHolders.add('@final');
85 if (isConst) typeHolders.add('@const'); 90 if (isConst) typeHolders.add('@const');
86 if (isTypedef) typeHolders.add('@typedef'); 91 if (isTypedef) typeHolders.add('@typedef');
87 if (isNonWildcard(type)) { 92 if (isNonWildcard(type)) {
88 if (typeHolders.isEmpty) typeHolders.add('@type'); 93 if (typeHolders.isEmpty) typeHolders.add('@type');
89 typeHolders.add('{$type}'); 94 typeHolders.add('{${_print(type)}}');
90 } 95 }
91 if (!typeHolders.isEmpty) lines.add(typeHolders.join(' ')); 96 if (!typeHolders.isEmpty) lines.add(typeHolders.join(' '));
92 } 97 }
93 98
94 { 99 {
95 List constructorLine = []; 100 List constructorLine = [];
96 if (isConstructor) constructorLine.add('@constructor'); 101 if (isConstructor) constructorLine.add('@constructor');
97 if (isStruct) constructorLine.add('@struct'); 102 if (isStruct) constructorLine.add('@struct');
98 if (isNonWildcard(superType)) { 103 if (isNonWildcard(superType)) {
99 constructorLine.add('@extends {$superType}'); 104 constructorLine.add('@extends {${_print(superType)}}');
100 } 105 }
101 106
102 if (constructorLine.isNotEmpty) lines.add(constructorLine.join(' ')); 107 if (constructorLine.isNotEmpty) lines.add(constructorLine.join(' '));
103 } 108 }
104 109
105 for (var interface in interfaces) { 110 if (interfaces != null) {
106 if (isNonWildcard(interface)) lines.add('@implements {$interface}'); 111 for (var interface in interfaces) {
112 if (isNonWildcard(interface))
113 lines.add('@implements {${_print(interface)}}');
114 }
107 } 115 }
108 116
109 paramTypes.forEach((String paramName, ClosureType paramType) { 117 if (paramTypes != null) {
110 // Must output params even with wildcard type. 118 paramTypes.forEach((String paramName, JS.TypeRef paramType) {
111 lines.add('@param {$paramType} $paramName'); 119 // Must output params even with wildcard type.
112 }); 120 lines.add('@param {${_print(paramType)}} $paramName');
113 if (isNonWildcard(returnType)) lines.add('@return {$returnType}'); 121 });
114 if (isNonWildcard(throwsType)) lines.add('@throws {$throwsType}'); 122 }
123 if (isNonWildcard(returnType))
124 lines.add('@return {${_print(returnType)}}');
125 if (isNonWildcard(throwsType))
126 lines.add('@throws {${_print(throwsType)}}');
115 127
116 if (lines.length == 0) return ''; 128 if (lines.length == 0) return '';
117 if (lines.length == 1) return '/** ${lines.single} */'; 129 if (lines.length == 1) return '/** ${lines.single} */';
118 __cachedString = '/**\n' + lines.map((l) => ' * $l').join('\n') + '\n */'; 130 __cachedString = '/**\n' + lines.map((l) => ' * $l').join('\n') + '\n */';
119 } 131 }
120 return __cachedString; 132 return __cachedString;
121 } 133 }
122 } 134 }
OLDNEW
« no previous file with comments | « no previous file | lib/src/closure/closure_annotator.dart » ('j') | lib/src/js/js_types.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698