OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 library analyzer.test.dart.element.builder_test; | 5 library analyzer.test.dart.element.builder_test; |
6 | 6 |
7 import 'package:analyzer/dart/ast/ast.dart'; | 7 import 'package:analyzer/dart/ast/ast.dart'; |
8 import 'package:analyzer/dart/ast/token.dart'; | 8 import 'package:analyzer/dart/ast/token.dart'; |
9 import 'package:analyzer/dart/element/element.dart'; | 9 import 'package:analyzer/dart/element/element.dart'; |
10 import 'package:analyzer/src/dart/ast/ast.dart'; | 10 import 'package:analyzer/src/dart/ast/ast.dart'; |
11 import 'package:analyzer/src/dart/element/builder.dart'; | 11 import 'package:analyzer/src/dart/element/builder.dart'; |
12 import 'package:analyzer/src/dart/element/element.dart'; | 12 import 'package:analyzer/src/dart/element/element.dart'; |
13 import 'package:analyzer/src/generated/engine.dart'; | 13 import 'package:analyzer/src/generated/engine.dart'; |
14 import 'package:analyzer/src/generated/resolver.dart'; | 14 import 'package:analyzer/src/generated/resolver.dart'; |
15 import 'package:analyzer/src/generated/source.dart'; | 15 import 'package:analyzer/src/generated/source.dart'; |
16 import 'package:analyzer/src/generated/testing/ast_factory.dart'; | 16 import 'package:analyzer/src/generated/testing/ast_factory.dart'; |
17 import 'package:analyzer/src/generated/testing/element_factory.dart'; | 17 import 'package:analyzer/src/generated/testing/element_factory.dart'; |
18 import 'package:analyzer/src/generated/testing/token_factory.dart'; | 18 import 'package:analyzer/src/generated/testing/token_factory.dart'; |
19 import 'package:analyzer/src/generated/utilities_dart.dart'; | 19 import 'package:analyzer/src/generated/utilities_dart.dart'; |
20 import 'package:test/test.dart'; | 20 import 'package:test/test.dart'; |
21 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 21 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
22 | 22 |
23 import '../../generated/parser_test.dart'; | 23 import '../../generated/parser_test.dart'; |
24 import '../../generated/test_support.dart'; | 24 import '../../generated/test_support.dart'; |
25 | 25 |
26 main() { | 26 main() { |
27 defineReflectiveSuite(() { | 27 defineReflectiveSuite(() { |
| 28 defineReflectiveTests(ApiElementBuilderTest); |
28 defineReflectiveTests(ElementBuilderTest); | 29 defineReflectiveTests(ElementBuilderTest); |
29 }); | 30 }); |
30 } | 31 } |
31 | 32 |
32 @reflectiveTest | 33 @reflectiveTest |
33 class ElementBuilderTest extends ParserTestCase { | 34 class ApiElementBuilderTest extends _BaseTest with _ApiElementBuilderTestMixin { |
34 CompilationUnitElement compilationUnitElement; | 35 @override |
35 CompilationUnit compilationUnit; | 36 AstVisitor createElementBuilder(ElementHolder holder) { |
| 37 return new ApiElementBuilder(holder, compilationUnitElement); |
| 38 } |
36 | 39 |
| 40 void test_api_class_field() { |
| 41 List<FieldElement> fields = buildElementsForText(r''' |
| 42 class C { |
| 43 var a = 42; |
| 44 var b = () { |
| 45 int v = 0; |
| 46 localFunction() {} |
| 47 }; |
| 48 } |
| 49 ''').types[0].fields; |
| 50 expect(fields, hasLength(2)); |
| 51 { |
| 52 FieldElement a = fields[0]; |
| 53 expect(a.displayName, 'a'); |
| 54 expect(a.initializer, isNull); |
| 55 } |
| 56 { |
| 57 FieldElement b = fields[1]; |
| 58 expect(b.displayName, 'b'); |
| 59 expect(b.initializer, isNull); |
| 60 } |
| 61 } |
| 62 |
| 63 void test_api_class_method_blockBody() { |
| 64 MethodElement method = buildElementsForText(r''' |
| 65 class C { |
| 66 void m(int a, {int b: 42}) { |
| 67 int v = 0; |
| 68 localFunction() {} |
| 69 } |
| 70 } |
| 71 ''').types[0].methods[0]; |
| 72 { |
| 73 expect(method.parameters, hasLength(2)); |
| 74 expect(method.parameters[0].displayName, 'a'); |
| 75 expect(method.parameters[0].initializer, isNull); |
| 76 expect(method.parameters[1].displayName, 'b'); |
| 77 expect(method.parameters[1].initializer, isNull); |
| 78 } |
| 79 expect(method.localVariables, isEmpty); |
| 80 expect(method.functions, isEmpty); |
| 81 } |
| 82 |
| 83 void test_api_topLevelFunction_blockBody() { |
| 84 FunctionElement function = buildElementsForText(r''' |
| 85 void topLevelFunction() { |
| 86 int v = 0; |
| 87 localFunction() {} |
| 88 } |
| 89 ''').functions[0]; |
| 90 expect(function.localVariables, isEmpty); |
| 91 expect(function.functions, isEmpty); |
| 92 } |
| 93 |
| 94 void test_api_topLevelFunction_expressionBody() { |
| 95 FunctionElement function = buildElementsForText(r''' |
| 96 topLevelFunction() => () { |
| 97 int localVar = 0; |
| 98 }; |
| 99 ''').functions[0]; |
| 100 expect(function.localVariables, isEmpty); |
| 101 expect(function.functions, isEmpty); |
| 102 } |
| 103 |
| 104 void test_api_topLevelFunction_parameters() { |
| 105 FunctionElement function = buildElementsForText(r''' |
| 106 void topLevelFunction(int a, int b(double b2), {c: () {int c2; c3() {} }}) { |
| 107 } |
| 108 ''').functions[0]; |
| 109 List<ParameterElement> parameters = function.parameters; |
| 110 expect(parameters, hasLength(3)); |
| 111 { |
| 112 ParameterElement a = parameters[0]; |
| 113 expect(a.displayName, 'a'); |
| 114 expect(a.initializer, isNull); |
| 115 } |
| 116 { |
| 117 ParameterElement b = parameters[1]; |
| 118 expect(b.displayName, 'b'); |
| 119 expect(b.initializer, isNull); |
| 120 expect(b.parameters, hasLength(1)); |
| 121 expect(b.parameters[0].displayName, 'b2'); |
| 122 } |
| 123 { |
| 124 var c = parameters[2] as DefaultParameterElementImpl; |
| 125 expect(c.displayName, 'c'); |
| 126 expect(c.initializer, isNull); |
| 127 } |
| 128 } |
| 129 |
| 130 void test_api_topLevelVariable() { |
| 131 List<TopLevelVariableElement> variables = buildElementsForText(r''' |
| 132 var A = 42; |
| 133 var B = () { |
| 134 int v = 0; |
| 135 localFunction(int _) {} |
| 136 }; |
| 137 ''').topLevelVariables; |
| 138 expect(variables, hasLength(2)); |
| 139 { |
| 140 TopLevelVariableElement a = variables[0]; |
| 141 expect(a.displayName, 'A'); |
| 142 expect(a.initializer, isNull); |
| 143 } |
| 144 { |
| 145 TopLevelVariableElement b = variables[1]; |
| 146 expect(b.displayName, 'B'); |
| 147 expect(b.initializer, isNull); |
| 148 } |
| 149 } |
| 150 } |
| 151 |
| 152 @reflectiveTest |
| 153 class ElementBuilderTest extends _BaseTest with _ApiElementBuilderTestMixin { |
37 /** | 154 /** |
38 * Parse the given [code], pass it through [ElementBuilder], and return the | 155 * Parse the given [code], pass it through [ElementBuilder], and return the |
39 * resulting [ElementHolder]. | 156 * resulting [ElementHolder]. |
40 */ | 157 */ |
41 ElementHolder buildElementsForText(String code) { | 158 ElementHolder buildElementsForText(String code) { |
42 TestLogger logger = new TestLogger(); | 159 ElementHolder holder = new ElementHolder(); |
43 AnalysisEngine.instance.logger = logger; | 160 ElementBuilder builder = new ElementBuilder(holder, compilationUnitElement); |
44 try { | 161 _visitAstOfCode(code, builder); |
45 compilationUnit = ParserTestCase.parseCompilationUnit(code); | 162 return holder; |
46 ElementHolder holder = new ElementHolder(); | |
47 ElementBuilder builder = | |
48 new ElementBuilder(holder, compilationUnitElement); | |
49 compilationUnit.accept(builder); | |
50 return holder; | |
51 } finally { | |
52 expect(logger.log, hasLength(0)); | |
53 AnalysisEngine.instance.logger = Logger.NULL; | |
54 } | |
55 } | 163 } |
56 | 164 |
57 /** | 165 AstVisitor createElementBuilder(ElementHolder holder) { |
58 * Verify that the given [metadata] has exactly one annotation, and that its | 166 return new ElementBuilder(holder, compilationUnitElement); |
59 * [ElementAnnotationImpl] is unresolved. | |
60 */ | |
61 void checkAnnotation(NodeList<Annotation> metadata) { | |
62 expect(metadata, hasLength(1)); | |
63 expect(metadata[0], new isInstanceOf<AnnotationImpl>()); | |
64 AnnotationImpl annotation = metadata[0]; | |
65 expect(annotation.elementAnnotation, | |
66 new isInstanceOf<ElementAnnotationImpl>()); | |
67 ElementAnnotationImpl elementAnnotation = annotation.elementAnnotation; | |
68 expect(elementAnnotation.element, isNull); // Not yet resolved | |
69 expect(elementAnnotation.compilationUnit, isNotNull); | |
70 expect(elementAnnotation.compilationUnit, compilationUnitElement); | |
71 } | |
72 | |
73 /** | |
74 * Verify that the given [element] has exactly one annotation, and that its | |
75 * [ElementAnnotationImpl] is unresolved. | |
76 */ | |
77 void checkMetadata(Element element) { | |
78 expect(element.metadata, hasLength(1)); | |
79 expect(element.metadata[0], new isInstanceOf<ElementAnnotationImpl>()); | |
80 ElementAnnotationImpl elementAnnotation = element.metadata[0]; | |
81 expect(elementAnnotation.element, isNull); // Not yet resolved | |
82 expect(elementAnnotation.compilationUnit, isNotNull); | |
83 expect(elementAnnotation.compilationUnit, compilationUnitElement); | |
84 } | 167 } |
85 | 168 |
86 void fail_visitMethodDeclaration_setter_duplicate() { | 169 void fail_visitMethodDeclaration_setter_duplicate() { |
87 // https://github.com/dart-lang/sdk/issues/25601 | 170 // https://github.com/dart-lang/sdk/issues/25601 |
88 String code = r''' | 171 String code = r''' |
89 class C { | 172 class C { |
90 set zzz(x) {} | 173 set zzz(x) {} |
91 set zzz(y) {} | 174 set zzz(y) {} |
92 } | 175 } |
93 '''; | 176 '''; |
94 ClassElement classElement = buildElementsForText(code).types[0]; | 177 ClassElement classElement = buildElementsForText(code).types[0]; |
95 for (PropertyAccessorElement accessor in classElement.accessors) { | 178 for (PropertyAccessorElement accessor in classElement.accessors) { |
96 expect(accessor.variable.setter, same(accessor)); | 179 expect(accessor.variable.setter, same(accessor)); |
97 } | 180 } |
98 } | 181 } |
99 | 182 |
100 @override | 183 @override |
101 void setUp() { | 184 void setUp() { |
102 super.setUp(); | 185 super.setUp(); |
103 compilationUnitElement = new CompilationUnitElementImpl('test.dart'); | 186 compilationUnitElement = new CompilationUnitElementImpl('test.dart'); |
104 } | 187 } |
105 | 188 |
106 void test_metadata_fieldDeclaration() { | 189 void test_visitDefaultFormalParameter_noType() { |
107 List<FieldElement> fields = | 190 // p = 0 |
108 buildElementsForText('class C { @a int x, y; }').types[0].fields; | 191 String parameterName = 'p'; |
109 checkMetadata(fields[0]); | 192 DefaultFormalParameter formalParameter = |
110 checkMetadata(fields[1]); | 193 AstFactory.positionalFormalParameter( |
111 expect(fields[0].metadata, same(fields[1].metadata)); | 194 AstFactory.simpleFormalParameter3(parameterName), |
| 195 AstFactory.integer(0)); |
| 196 formalParameter.beginToken.offset = 50; |
| 197 formalParameter.endToken.offset = 80; |
| 198 |
| 199 ElementHolder holder = buildElementsForAst(formalParameter); |
| 200 List<ParameterElement> parameters = holder.parameters; |
| 201 expect(parameters, hasLength(1)); |
| 202 ParameterElement parameter = parameters[0]; |
| 203 assertHasCodeRange(parameter, 50, 31); |
| 204 expect(parameter.hasImplicitType, isTrue); |
| 205 expect(parameter.initializer, isNotNull); |
| 206 expect(parameter.initializer.type, isNotNull); |
| 207 expect(parameter.initializer.hasImplicitReturnType, isTrue); |
| 208 expect(parameter.isConst, isFalse); |
| 209 expect(parameter.isDeprecated, isFalse); |
| 210 expect(parameter.isFinal, isFalse); |
| 211 expect(parameter.isInitializingFormal, isFalse); |
| 212 expect(parameter.isOverride, isFalse); |
| 213 expect(parameter.isPrivate, isFalse); |
| 214 expect(parameter.isPublic, isTrue); |
| 215 expect(parameter.isSynthetic, isFalse); |
| 216 expect(parameter.name, parameterName); |
| 217 } |
| 218 |
| 219 void test_visitDefaultFormalParameter_type() { |
| 220 // E p = 0 |
| 221 String parameterName = 'p'; |
| 222 DefaultFormalParameter formalParameter = AstFactory.namedFormalParameter( |
| 223 AstFactory.simpleFormalParameter4( |
| 224 AstFactory.typeName4('E'), parameterName), |
| 225 AstFactory.integer(0)); |
| 226 |
| 227 ElementHolder holder = buildElementsForAst(formalParameter); |
| 228 List<ParameterElement> parameters = holder.parameters; |
| 229 expect(parameters, hasLength(1)); |
| 230 ParameterElement parameter = parameters[0]; |
| 231 expect(parameter.hasImplicitType, isFalse); |
| 232 expect(parameter.initializer, isNotNull); |
| 233 expect(parameter.initializer.type, isNotNull); |
| 234 expect(parameter.initializer.hasImplicitReturnType, isTrue); |
| 235 expect(parameter.isConst, isFalse); |
| 236 expect(parameter.isDeprecated, isFalse); |
| 237 expect(parameter.isFinal, isFalse); |
| 238 expect(parameter.isInitializingFormal, isFalse); |
| 239 expect(parameter.isOverride, isFalse); |
| 240 expect(parameter.isPrivate, isFalse); |
| 241 expect(parameter.isPublic, isTrue); |
| 242 expect(parameter.isSynthetic, isFalse); |
| 243 expect(parameter.name, parameterName); |
112 } | 244 } |
113 | 245 |
114 void test_metadata_localVariableDeclaration() { | 246 void test_metadata_localVariableDeclaration() { |
115 List<LocalVariableElement> localVariables = | 247 List<LocalVariableElement> localVariables = |
116 buildElementsForText('f() { @a int x, y; }') | 248 buildElementsForText('f() { @a int x, y; }') |
117 .functions[0] | 249 .functions[0] |
118 .localVariables; | 250 .localVariables; |
119 checkMetadata(localVariables[0]); | 251 checkMetadata(localVariables[0]); |
120 checkMetadata(localVariables[1]); | 252 checkMetadata(localVariables[1]); |
121 expect(localVariables[0].metadata, same(localVariables[1].metadata)); | 253 expect(localVariables[0].metadata, same(localVariables[1].metadata)); |
122 } | 254 } |
123 | 255 |
124 void test_metadata_topLevelVariableDeclaration() { | |
125 List<TopLevelVariableElement> topLevelVariables = | |
126 buildElementsForText('@a int x, y;').topLevelVariables; | |
127 checkMetadata(topLevelVariables[0]); | |
128 checkMetadata(topLevelVariables[1]); | |
129 expect(topLevelVariables[0].metadata, same(topLevelVariables[1].metadata)); | |
130 } | |
131 | |
132 void test_metadata_visitClassDeclaration() { | |
133 ClassElement classElement = buildElementsForText('@a class C {}').types[0]; | |
134 checkMetadata(classElement); | |
135 } | |
136 | |
137 void test_metadata_visitClassTypeAlias() { | |
138 ClassElement classElement = | |
139 buildElementsForText('@a class C = D with E;').types[0]; | |
140 checkMetadata(classElement); | |
141 } | |
142 | |
143 void test_metadata_visitConstructorDeclaration() { | |
144 ConstructorElement constructorElement = | |
145 buildElementsForText('class C { @a C(); }').types[0].constructors[0]; | |
146 checkMetadata(constructorElement); | |
147 } | |
148 | |
149 void test_metadata_visitDeclaredIdentifier() { | 256 void test_metadata_visitDeclaredIdentifier() { |
150 LocalVariableElement localVariableElement = | 257 LocalVariableElement localVariableElement = |
151 buildElementsForText('f() { for (@a var x in y) {} }') | 258 buildElementsForText('f() { for (@a var x in y) {} }') |
152 .functions[0] | 259 .functions[0] |
153 .localVariables[0]; | 260 .localVariables[0]; |
154 checkMetadata(localVariableElement); | 261 checkMetadata(localVariableElement); |
155 } | 262 } |
156 | 263 |
157 void test_metadata_visitDefaultFormalParameter_fieldFormalParameter() { | |
158 ParameterElement parameterElement = | |
159 buildElementsForText('class C { var x; C([@a this.x = null]); }') | |
160 .types[0] | |
161 .constructors[0] | |
162 .parameters[0]; | |
163 checkMetadata(parameterElement); | |
164 } | |
165 | |
166 void | |
167 test_metadata_visitDefaultFormalParameter_functionTypedFormalParameter() { | |
168 ParameterElement parameterElement = | |
169 buildElementsForText('f([@a g() = null]) {}').functions[0].parameters[ | |
170 0]; | |
171 checkMetadata(parameterElement); | |
172 } | |
173 | |
174 void test_metadata_visitDefaultFormalParameter_simpleFormalParameter() { | |
175 ParameterElement parameterElement = | |
176 buildElementsForText('f([@a gx = null]) {}').functions[0].parameters[0]; | |
177 checkMetadata(parameterElement); | |
178 } | |
179 | |
180 void test_metadata_visitEnumDeclaration() { | |
181 ClassElement classElement = | |
182 buildElementsForText('@a enum E { v }').enums[0]; | |
183 checkMetadata(classElement); | |
184 } | |
185 | |
186 void test_metadata_visitExportDirective() { | |
187 buildElementsForText('@a export "foo.dart";'); | |
188 expect(compilationUnit.directives[0], new isInstanceOf<ExportDirective>()); | |
189 ExportDirective exportDirective = compilationUnit.directives[0]; | |
190 checkAnnotation(exportDirective.metadata); | |
191 } | |
192 | |
193 void test_metadata_visitFieldFormalParameter() { | |
194 ParameterElement parameterElement = | |
195 buildElementsForText('class C { var x; C(@a this.x); }') | |
196 .types[0] | |
197 .constructors[0] | |
198 .parameters[0]; | |
199 checkMetadata(parameterElement); | |
200 } | |
201 | |
202 void test_metadata_visitFunctionDeclaration_function() { | |
203 FunctionElement functionElement = | |
204 buildElementsForText('@a f() {}').functions[0]; | |
205 checkMetadata(functionElement); | |
206 } | |
207 | |
208 void test_metadata_visitFunctionDeclaration_getter() { | |
209 PropertyAccessorElement propertyAccessorElement = | |
210 buildElementsForText('@a get f => null;').accessors[0]; | |
211 checkMetadata(propertyAccessorElement); | |
212 } | |
213 | |
214 void test_metadata_visitFunctionDeclaration_setter() { | |
215 PropertyAccessorElement propertyAccessorElement = | |
216 buildElementsForText('@a set f(value) {}').accessors[0]; | |
217 checkMetadata(propertyAccessorElement); | |
218 } | |
219 | |
220 void test_metadata_visitFunctionTypeAlias() { | |
221 FunctionTypeAliasElement functionTypeAliasElement = | |
222 buildElementsForText('@a typedef F();').typeAliases[0]; | |
223 checkMetadata(functionTypeAliasElement); | |
224 } | |
225 | |
226 void test_metadata_visitFunctionTypedFormalParameter() { | |
227 ParameterElement parameterElement = | |
228 buildElementsForText('f(@a g()) {}').functions[0].parameters[0]; | |
229 checkMetadata(parameterElement); | |
230 } | |
231 | |
232 void test_metadata_visitImportDirective() { | |
233 buildElementsForText('@a import "foo.dart";'); | |
234 expect(compilationUnit.directives[0], new isInstanceOf<ImportDirective>()); | |
235 ImportDirective importDirective = compilationUnit.directives[0]; | |
236 checkAnnotation(importDirective.metadata); | |
237 } | |
238 | |
239 void test_metadata_visitLibraryDirective() { | |
240 buildElementsForText('@a library L;'); | |
241 expect(compilationUnit.directives[0], new isInstanceOf<LibraryDirective>()); | |
242 LibraryDirective libraryDirective = compilationUnit.directives[0]; | |
243 checkAnnotation(libraryDirective.metadata); | |
244 } | |
245 | |
246 void test_metadata_visitMethodDeclaration_getter() { | |
247 PropertyAccessorElement propertyAccessorElement = | |
248 buildElementsForText('class C { @a get m => null; }') | |
249 .types[0] | |
250 .accessors[0]; | |
251 checkMetadata(propertyAccessorElement); | |
252 } | |
253 | |
254 void test_metadata_visitMethodDeclaration_method() { | |
255 MethodElement methodElement = | |
256 buildElementsForText('class C { @a m() {} }').types[0].methods[0]; | |
257 checkMetadata(methodElement); | |
258 } | |
259 | |
260 void test_metadata_visitMethodDeclaration_setter() { | |
261 PropertyAccessorElement propertyAccessorElement = | |
262 buildElementsForText('class C { @a set f(value) {} }') | |
263 .types[0] | |
264 .accessors[0]; | |
265 checkMetadata(propertyAccessorElement); | |
266 } | |
267 | |
268 void test_metadata_visitPartDirective() { | |
269 buildElementsForText('@a part "foo.dart";'); | |
270 expect(compilationUnit.directives[0], new isInstanceOf<PartDirective>()); | |
271 PartDirective partDirective = compilationUnit.directives[0]; | |
272 checkAnnotation(partDirective.metadata); | |
273 } | |
274 | |
275 void test_metadata_visitPartOfDirective() { | |
276 // We don't build ElementAnnotation objects for `part of` directives, since | |
277 // analyzer ignores them in favor of annotations on the library directive. | |
278 buildElementsForText('@a part of L;'); | |
279 expect(compilationUnit.directives[0], new isInstanceOf<PartOfDirective>()); | |
280 PartOfDirective partOfDirective = compilationUnit.directives[0]; | |
281 expect(partOfDirective.metadata, hasLength(1)); | |
282 expect(partOfDirective.metadata[0].elementAnnotation, isNull); | |
283 } | |
284 | |
285 void test_metadata_visitSimpleFormalParameter() { | |
286 ParameterElement parameterElement = | |
287 buildElementsForText('f(@a x) {}').functions[0].parameters[0]; | |
288 checkMetadata(parameterElement); | |
289 } | |
290 | |
291 void test_metadata_visitTypeParameter() { | |
292 TypeParameterElement typeParameterElement = | |
293 buildElementsForText('class C<@a T> {}').types[0].typeParameters[0]; | |
294 checkMetadata(typeParameterElement); | |
295 } | |
296 | |
297 void test_visitCatchClause() { | 264 void test_visitCatchClause() { |
298 List<LocalVariableElement> variables = | 265 List<LocalVariableElement> variables = |
299 buildElementsForText('f() { try {} catch (e, s) {} }') | 266 buildElementsForText('f() { try {} catch (e, s) {} }') |
300 .functions[0] | 267 .functions[0] |
301 .localVariables; | 268 .localVariables; |
302 String exceptionParameterName = "e"; | 269 String exceptionParameterName = "e"; |
303 String stackParameterName = "s"; | 270 String stackParameterName = "s"; |
304 expect(variables, hasLength(2)); | 271 expect(variables, hasLength(2)); |
305 | 272 |
306 LocalVariableElement exceptionVariable = variables[0]; | 273 LocalVariableElement exceptionVariable = variables[0]; |
(...skipping 22 matching lines...) Expand all Loading... |
329 .functions[0] | 296 .functions[0] |
330 .localVariables; | 297 .localVariables; |
331 String exceptionParameterName = "e"; | 298 String exceptionParameterName = "e"; |
332 expect(variables, hasLength(1)); | 299 expect(variables, hasLength(1)); |
333 VariableElement exceptionVariable = variables[0]; | 300 VariableElement exceptionVariable = variables[0]; |
334 expect(exceptionVariable, isNotNull); | 301 expect(exceptionVariable, isNotNull); |
335 expect(exceptionVariable.name, exceptionParameterName); | 302 expect(exceptionVariable.name, exceptionParameterName); |
336 expect(exceptionVariable.hasImplicitType, isFalse); | 303 expect(exceptionVariable.hasImplicitType, isFalse); |
337 } | 304 } |
338 | 305 |
| 306 void test_visitCompilationUnit_codeRange() { |
| 307 TopLevelVariableDeclaration topLevelVariableDeclaration = AstFactory |
| 308 .topLevelVariableDeclaration(null, AstFactory.typeName4('int'), |
| 309 [AstFactory.variableDeclaration('V')]); |
| 310 CompilationUnit unit = new CompilationUnit( |
| 311 topLevelVariableDeclaration.beginToken, |
| 312 null, |
| 313 [], |
| 314 [topLevelVariableDeclaration], |
| 315 topLevelVariableDeclaration.endToken); |
| 316 ElementHolder holder = new ElementHolder(); |
| 317 ElementBuilder builder = _makeBuilder(holder); |
| 318 unit.beginToken.offset = 10; |
| 319 unit.endToken.offset = 40; |
| 320 unit.accept(builder); |
| 321 |
| 322 assertHasCodeRange(compilationUnitElement, 0, 41); |
| 323 } |
| 324 |
| 325 void test_visitDeclaredIdentifier_noType() { |
| 326 LocalVariableElement variable = |
| 327 buildElementsForText('f() { for (var i in []) {} }') |
| 328 .functions[0] |
| 329 .localVariables[0]; |
| 330 assertHasCodeRange(variable, 11, 5); |
| 331 expect(variable, isNotNull); |
| 332 expect(variable.hasImplicitType, isTrue); |
| 333 expect(variable.isConst, isFalse); |
| 334 expect(variable.isDeprecated, isFalse); |
| 335 expect(variable.isFinal, isFalse); |
| 336 expect(variable.isOverride, isFalse); |
| 337 expect(variable.isPrivate, isFalse); |
| 338 expect(variable.isPublic, isTrue); |
| 339 expect(variable.isSynthetic, isFalse); |
| 340 expect(variable.name, 'i'); |
| 341 } |
| 342 |
| 343 void test_visitDeclaredIdentifier_type() { |
| 344 LocalVariableElement variable = |
| 345 buildElementsForText('f() { for (int i in []) {} }') |
| 346 .functions[0] |
| 347 .localVariables[0]; |
| 348 assertHasCodeRange(variable, 11, 5); |
| 349 expect(variable.hasImplicitType, isFalse); |
| 350 expect(variable.isConst, isFalse); |
| 351 expect(variable.isDeprecated, isFalse); |
| 352 expect(variable.isFinal, isFalse); |
| 353 expect(variable.isOverride, isFalse); |
| 354 expect(variable.isPrivate, isFalse); |
| 355 expect(variable.isPublic, isTrue); |
| 356 expect(variable.isSynthetic, isFalse); |
| 357 expect(variable.name, 'i'); |
| 358 } |
| 359 |
| 360 void test_visitFunctionExpression() { |
| 361 ElementHolder holder = new ElementHolder(); |
| 362 ElementBuilder builder = _makeBuilder(holder); |
| 363 FunctionExpression expression = AstFactory.functionExpression2( |
| 364 AstFactory.formalParameterList(), AstFactory.blockFunctionBody2()); |
| 365 expression.accept(builder); |
| 366 List<FunctionElement> functions = holder.functions; |
| 367 expect(functions, hasLength(1)); |
| 368 FunctionElement function = functions[0]; |
| 369 expect(function, isNotNull); |
| 370 expect(expression.element, same(function)); |
| 371 expect(function.hasImplicitReturnType, isTrue); |
| 372 expect(function.isSynthetic, isFalse); |
| 373 expect(function.typeParameters, hasLength(0)); |
| 374 } |
| 375 |
| 376 void test_visitFunctionExpression_inBlockBody() { |
| 377 List<FunctionElement> functions = |
| 378 buildElementsForText('f() { return () => 42; }').functions[0].functions; |
| 379 expect(functions, hasLength(1)); |
| 380 FunctionElement function = functions[0]; |
| 381 expect(function, isNotNull); |
| 382 expect(function.hasImplicitReturnType, isTrue); |
| 383 expect(function.isSynthetic, isFalse); |
| 384 expect(function.typeParameters, hasLength(0)); |
| 385 } |
| 386 |
| 387 void test_visitFunctionExpression_inExpressionBody() { |
| 388 List<FunctionElement> functions = |
| 389 buildElementsForText('f() => () => 42;').functions[0].functions; |
| 390 expect(functions, hasLength(1)); |
| 391 FunctionElement function = functions[0]; |
| 392 expect(function, isNotNull); |
| 393 expect(function.hasImplicitReturnType, isTrue); |
| 394 expect(function.isSynthetic, isFalse); |
| 395 expect(function.typeParameters, hasLength(0)); |
| 396 } |
| 397 |
| 398 void test_visitFunctionTypeAlias() { |
| 399 ElementHolder holder = new ElementHolder(); |
| 400 ElementBuilder builder = _makeBuilder(holder); |
| 401 String aliasName = "F"; |
| 402 String parameterName = "E"; |
| 403 FunctionTypeAlias aliasNode = AstFactory.typeAlias( |
| 404 null, aliasName, AstFactory.typeParameterList([parameterName]), null); |
| 405 aliasNode.documentationComment = AstFactory.documentationComment( |
| 406 [TokenFactory.tokenFromString('/// aaa')..offset = 50], []); |
| 407 aliasNode.endToken.offset = 80; |
| 408 aliasNode.accept(builder); |
| 409 |
| 410 List<FunctionTypeAliasElement> aliases = holder.typeAliases; |
| 411 expect(aliases, hasLength(1)); |
| 412 FunctionTypeAliasElement alias = aliases[0]; |
| 413 expect(alias, isNotNull); |
| 414 assertHasCodeRange(alias, 50, 31); |
| 415 expect(alias.documentationComment, '/// aaa'); |
| 416 expect(alias.name, aliasName); |
| 417 expect(alias.parameters, hasLength(0)); |
| 418 List<TypeParameterElement> typeParameters = alias.typeParameters; |
| 419 expect(typeParameters, hasLength(1)); |
| 420 TypeParameterElement typeParameter = typeParameters[0]; |
| 421 expect(typeParameter, isNotNull); |
| 422 expect(typeParameter.name, parameterName); |
| 423 } |
| 424 |
| 425 void test_visitFunctionTypedFormalParameter() { |
| 426 ElementHolder holder = new ElementHolder(); |
| 427 ElementBuilder builder = _makeBuilder(holder); |
| 428 String parameterName = "p"; |
| 429 FunctionTypedFormalParameter formalParameter = |
| 430 AstFactory.functionTypedFormalParameter(null, parameterName); |
| 431 _useParameterInMethod(formalParameter, 100, 110); |
| 432 formalParameter.accept(builder); |
| 433 List<ParameterElement> parameters = holder.parameters; |
| 434 expect(parameters, hasLength(1)); |
| 435 ParameterElement parameter = parameters[0]; |
| 436 expect(parameter, isNotNull); |
| 437 expect(parameter.name, parameterName); |
| 438 expect(parameter.initializer, isNull); |
| 439 expect(parameter.isConst, isFalse); |
| 440 expect(parameter.isFinal, isFalse); |
| 441 expect(parameter.isSynthetic, isFalse); |
| 442 expect(parameter.parameterKind, ParameterKind.REQUIRED); |
| 443 _assertVisibleRange(parameter, 100, 110); |
| 444 } |
| 445 |
| 446 void test_visitFunctionTypedFormalParameter_withTypeParameters() { |
| 447 ElementHolder holder = new ElementHolder(); |
| 448 ElementBuilder builder = _makeBuilder(holder); |
| 449 String parameterName = "p"; |
| 450 FunctionTypedFormalParameter formalParameter = |
| 451 AstFactory.functionTypedFormalParameter(null, parameterName); |
| 452 formalParameter.typeParameters = AstFactory.typeParameterList(['F']); |
| 453 _useParameterInMethod(formalParameter, 100, 110); |
| 454 formalParameter.accept(builder); |
| 455 List<ParameterElement> parameters = holder.parameters; |
| 456 expect(parameters, hasLength(1)); |
| 457 ParameterElement parameter = parameters[0]; |
| 458 expect(parameter, isNotNull); |
| 459 expect(parameter.name, parameterName); |
| 460 expect(parameter.initializer, isNull); |
| 461 expect(parameter.isConst, isFalse); |
| 462 expect(parameter.isFinal, isFalse); |
| 463 expect(parameter.isSynthetic, isFalse); |
| 464 expect(parameter.parameterKind, ParameterKind.REQUIRED); |
| 465 expect(parameter.typeParameters, hasLength(1)); |
| 466 _assertVisibleRange(parameter, 100, 110); |
| 467 } |
| 468 |
| 469 void test_visitLabeledStatement() { |
| 470 List<LabelElement> labels = |
| 471 buildElementsForText('f() { l: print(42); }').functions[0].labels; |
| 472 expect(labels, hasLength(1)); |
| 473 LabelElement label = labels[0]; |
| 474 expect(label, isNotNull); |
| 475 expect(label.name, 'l'); |
| 476 expect(label.isSynthetic, isFalse); |
| 477 } |
| 478 |
| 479 void test_visitMethodDeclaration_withMembers() { |
| 480 MethodElement method = buildElementsForText( |
| 481 'class C { m(p) { var v; try { l: return; } catch (e) {} } }') |
| 482 .types[0] |
| 483 .methods[0]; |
| 484 String methodName = "m"; |
| 485 String parameterName = "p"; |
| 486 String localVariableName = "v"; |
| 487 String labelName = "l"; |
| 488 String exceptionParameterName = "e"; |
| 489 expect(method, isNotNull); |
| 490 expect(method.hasImplicitReturnType, isTrue); |
| 491 expect(method.name, methodName); |
| 492 expect(method.typeParameters, hasLength(0)); |
| 493 expect(method.isAbstract, isFalse); |
| 494 expect(method.isExternal, isFalse); |
| 495 expect(method.isStatic, isFalse); |
| 496 expect(method.isSynthetic, isFalse); |
| 497 List<VariableElement> parameters = method.parameters; |
| 498 expect(parameters, hasLength(1)); |
| 499 VariableElement parameter = parameters[0]; |
| 500 expect(parameter, isNotNull); |
| 501 expect(parameter.name, parameterName); |
| 502 List<VariableElement> localVariables = method.localVariables; |
| 503 expect(localVariables, hasLength(2)); |
| 504 VariableElement firstVariable = localVariables[0]; |
| 505 VariableElement secondVariable = localVariables[1]; |
| 506 expect(firstVariable, isNotNull); |
| 507 expect(secondVariable, isNotNull); |
| 508 expect( |
| 509 (firstVariable.name == localVariableName && |
| 510 secondVariable.name == exceptionParameterName) || |
| 511 (firstVariable.name == exceptionParameterName && |
| 512 secondVariable.name == localVariableName), |
| 513 isTrue); |
| 514 List<LabelElement> labels = method.labels; |
| 515 expect(labels, hasLength(1)); |
| 516 LabelElement label = labels[0]; |
| 517 expect(label, isNotNull); |
| 518 expect(label.name, labelName); |
| 519 } |
| 520 |
| 521 void test_visitNamedFormalParameter() { |
| 522 ElementHolder holder = new ElementHolder(); |
| 523 ElementBuilder builder = _makeBuilder(holder); |
| 524 String parameterName = "p"; |
| 525 DefaultFormalParameter formalParameter = AstFactory.namedFormalParameter( |
| 526 AstFactory.simpleFormalParameter3(parameterName), |
| 527 AstFactory.identifier3("42")); |
| 528 _useParameterInMethod(formalParameter, 100, 110); |
| 529 formalParameter.beginToken.offset = 50; |
| 530 formalParameter.endToken.offset = 80; |
| 531 formalParameter.accept(builder); |
| 532 List<ParameterElement> parameters = holder.parameters; |
| 533 expect(parameters, hasLength(1)); |
| 534 ParameterElement parameter = parameters[0]; |
| 535 expect(parameter, isNotNull); |
| 536 assertHasCodeRange(parameter, 50, 32); |
| 537 expect(parameter.name, parameterName); |
| 538 expect(parameter.isConst, isFalse); |
| 539 expect(parameter.isFinal, isFalse); |
| 540 expect(parameter.isSynthetic, isFalse); |
| 541 expect(parameter.parameterKind, ParameterKind.NAMED); |
| 542 _assertVisibleRange(parameter, 100, 110); |
| 543 expect(parameter.defaultValueCode, "42"); |
| 544 FunctionElement initializer = parameter.initializer; |
| 545 expect(initializer, isNotNull); |
| 546 expect(initializer.isSynthetic, isTrue); |
| 547 expect(initializer.hasImplicitReturnType, isTrue); |
| 548 } |
| 549 |
| 550 void test_visitSimpleFormalParameter_noType() { |
| 551 // p |
| 552 ElementHolder holder = new ElementHolder(); |
| 553 ElementBuilder builder = _makeBuilder(holder); |
| 554 String parameterName = "p"; |
| 555 SimpleFormalParameter formalParameter = |
| 556 AstFactory.simpleFormalParameter3(parameterName); |
| 557 _useParameterInMethod(formalParameter, 100, 110); |
| 558 formalParameter.accept(builder); |
| 559 List<ParameterElement> parameters = holder.parameters; |
| 560 expect(parameters, hasLength(1)); |
| 561 ParameterElement parameter = parameters[0]; |
| 562 expect(parameter, isNotNull); |
| 563 expect(parameter.hasImplicitType, isTrue); |
| 564 expect(parameter.initializer, isNull); |
| 565 expect(parameter.isConst, isFalse); |
| 566 expect(parameter.isFinal, isFalse); |
| 567 expect(parameter.isSynthetic, isFalse); |
| 568 expect(parameter.name, parameterName); |
| 569 expect(parameter.parameterKind, ParameterKind.REQUIRED); |
| 570 _assertVisibleRange(parameter, 100, 110); |
| 571 } |
| 572 |
| 573 void test_visitSimpleFormalParameter_type() { |
| 574 // T p |
| 575 ElementHolder holder = new ElementHolder(); |
| 576 ElementBuilder builder = _makeBuilder(holder); |
| 577 String parameterName = "p"; |
| 578 SimpleFormalParameter formalParameter = AstFactory.simpleFormalParameter4( |
| 579 AstFactory.typeName4('T'), parameterName); |
| 580 _useParameterInMethod(formalParameter, 100, 110); |
| 581 formalParameter.accept(builder); |
| 582 List<ParameterElement> parameters = holder.parameters; |
| 583 expect(parameters, hasLength(1)); |
| 584 ParameterElement parameter = parameters[0]; |
| 585 expect(parameter, isNotNull); |
| 586 expect(parameter.hasImplicitType, isFalse); |
| 587 expect(parameter.initializer, isNull); |
| 588 expect(parameter.isConst, isFalse); |
| 589 expect(parameter.isFinal, isFalse); |
| 590 expect(parameter.isSynthetic, isFalse); |
| 591 expect(parameter.name, parameterName); |
| 592 expect(parameter.parameterKind, ParameterKind.REQUIRED); |
| 593 _assertVisibleRange(parameter, 100, 110); |
| 594 } |
| 595 |
| 596 void test_visitVariableDeclaration_inConstructor() { |
| 597 List<ConstructorElement> constructors = |
| 598 buildElementsForText('class C { C() { var v = 1; } }') |
| 599 .types[0] |
| 600 .constructors; |
| 601 expect(constructors, hasLength(1)); |
| 602 List<LocalVariableElement> variableElements = |
| 603 constructors[0].localVariables; |
| 604 expect(variableElements, hasLength(1)); |
| 605 LocalVariableElement variableElement = variableElements[0]; |
| 606 assertHasCodeRange(variableElement, 16, 10); |
| 607 expect(variableElement.hasImplicitType, isTrue); |
| 608 expect(variableElement.name, 'v'); |
| 609 _assertVisibleRange(variableElement, 14, 28); |
| 610 } |
| 611 |
| 612 void test_visitVariableDeclaration_inForEachStatement() { |
| 613 ElementHolder holder = new ElementHolder(); |
| 614 ElementBuilder builder = _makeBuilder(holder); |
| 615 // |
| 616 // m() { for (var v in []) } |
| 617 // |
| 618 String variableName = "v"; |
| 619 Statement statement = AstFactory.forEachStatement( |
| 620 AstFactory.declaredIdentifier3('v'), |
| 621 AstFactory.listLiteral(), |
| 622 AstFactory.block()); |
| 623 _setNodeSourceRange(statement, 100, 110); |
| 624 MethodDeclaration method = AstFactory.methodDeclaration2( |
| 625 null, |
| 626 null, |
| 627 null, |
| 628 null, |
| 629 AstFactory.identifier3("m"), |
| 630 AstFactory.formalParameterList(), |
| 631 AstFactory.blockFunctionBody2([statement])); |
| 632 _setBlockBodySourceRange(method.body, 200, 220); |
| 633 method.accept(builder); |
| 634 |
| 635 List<MethodElement> methods = holder.methods; |
| 636 expect(methods, hasLength(1)); |
| 637 List<LocalVariableElement> variableElements = methods[0].localVariables; |
| 638 expect(variableElements, hasLength(1)); |
| 639 LocalVariableElement variableElement = variableElements[0]; |
| 640 expect(variableElement.name, variableName); |
| 641 _assertVisibleRange(variableElement, 100, 110); |
| 642 } |
| 643 |
| 644 void test_visitVariableDeclaration_inForStatement() { |
| 645 ElementHolder holder = new ElementHolder(); |
| 646 ElementBuilder builder = _makeBuilder(holder); |
| 647 // |
| 648 // m() { for (T v;;) } |
| 649 // |
| 650 String variableName = "v"; |
| 651 ForStatement statement = AstFactory.forStatement2( |
| 652 AstFactory.variableDeclarationList(null, AstFactory.typeName4('T'), |
| 653 [AstFactory.variableDeclaration('v')]), |
| 654 null, |
| 655 null, |
| 656 AstFactory.block()); |
| 657 _setNodeSourceRange(statement, 100, 110); |
| 658 MethodDeclaration method = AstFactory.methodDeclaration2( |
| 659 null, |
| 660 null, |
| 661 null, |
| 662 null, |
| 663 AstFactory.identifier3("m"), |
| 664 AstFactory.formalParameterList(), |
| 665 AstFactory.blockFunctionBody2([statement])); |
| 666 _setBlockBodySourceRange(method.body, 200, 220); |
| 667 method.accept(builder); |
| 668 |
| 669 List<MethodElement> methods = holder.methods; |
| 670 expect(methods, hasLength(1)); |
| 671 List<LocalVariableElement> variableElements = methods[0].localVariables; |
| 672 expect(variableElements, hasLength(1)); |
| 673 LocalVariableElement variableElement = variableElements[0]; |
| 674 expect(variableElement.name, variableName); |
| 675 _assertVisibleRange(variableElement, 100, 110); |
| 676 } |
| 677 |
| 678 void test_visitVariableDeclaration_inMethod() { |
| 679 ElementHolder holder = new ElementHolder(); |
| 680 ElementBuilder builder = _makeBuilder(holder); |
| 681 // |
| 682 // m() {T v;} |
| 683 // |
| 684 String variableName = "v"; |
| 685 VariableDeclaration variable = |
| 686 AstFactory.variableDeclaration2(variableName, null); |
| 687 Statement statement = AstFactory.variableDeclarationStatement( |
| 688 null, AstFactory.typeName4('T'), [variable]); |
| 689 MethodDeclaration method = AstFactory.methodDeclaration2( |
| 690 null, |
| 691 null, |
| 692 null, |
| 693 null, |
| 694 AstFactory.identifier3("m"), |
| 695 AstFactory.formalParameterList(), |
| 696 AstFactory.blockFunctionBody2([statement])); |
| 697 _setBlockBodySourceRange(method.body, 100, 110); |
| 698 method.accept(builder); |
| 699 |
| 700 List<MethodElement> methods = holder.methods; |
| 701 expect(methods, hasLength(1)); |
| 702 List<LocalVariableElement> variableElements = methods[0].localVariables; |
| 703 expect(variableElements, hasLength(1)); |
| 704 LocalVariableElement variableElement = variableElements[0]; |
| 705 expect(variableElement.hasImplicitType, isFalse); |
| 706 expect(variableElement.name, variableName); |
| 707 _assertVisibleRange(variableElement, 100, 110); |
| 708 } |
| 709 |
| 710 void test_visitVariableDeclaration_localNestedInFunction() { |
| 711 ElementHolder holder = new ElementHolder(); |
| 712 ElementBuilder builder = _makeBuilder(holder); |
| 713 // |
| 714 // var f = () {var v;}; |
| 715 // |
| 716 String variableName = "v"; |
| 717 VariableDeclaration variable = |
| 718 AstFactory.variableDeclaration2(variableName, null); |
| 719 Statement statement = |
| 720 AstFactory.variableDeclarationStatement2(null, [variable]); |
| 721 Expression initializer = AstFactory.functionExpression2( |
| 722 AstFactory.formalParameterList(), |
| 723 AstFactory.blockFunctionBody2([statement])); |
| 724 String fieldName = "f"; |
| 725 VariableDeclaration field = |
| 726 AstFactory.variableDeclaration2(fieldName, initializer); |
| 727 FieldDeclaration fieldDeclaration = |
| 728 AstFactory.fieldDeclaration2(false, null, [field]); |
| 729 fieldDeclaration.accept(builder); |
| 730 |
| 731 List<FieldElement> variables = holder.fields; |
| 732 expect(variables, hasLength(1)); |
| 733 FieldElement fieldElement = variables[0]; |
| 734 expect(fieldElement, isNotNull); |
| 735 FunctionElement initializerElement = fieldElement.initializer; |
| 736 expect(initializerElement, isNotNull); |
| 737 expect(initializerElement.hasImplicitReturnType, isTrue); |
| 738 List<FunctionElement> functionElements = initializerElement.functions; |
| 739 expect(functionElements, hasLength(1)); |
| 740 List<LocalVariableElement> variableElements = |
| 741 functionElements[0].localVariables; |
| 742 expect(variableElements, hasLength(1)); |
| 743 LocalVariableElement variableElement = variableElements[0]; |
| 744 expect(variableElement.hasImplicitType, isTrue); |
| 745 expect(variableElement.isConst, isFalse); |
| 746 expect(variableElement.isFinal, isFalse); |
| 747 expect(variableElement.isSynthetic, isFalse); |
| 748 expect(variableElement.name, variableName); |
| 749 } |
| 750 |
| 751 void test_visitVariableDeclaration_noInitializer() { |
| 752 // var v; |
| 753 ElementHolder holder = new ElementHolder(); |
| 754 ElementBuilder builder = _makeBuilder(holder); |
| 755 String variableName = "v"; |
| 756 VariableDeclaration variableDeclaration = |
| 757 AstFactory.variableDeclaration2(variableName, null); |
| 758 AstFactory.variableDeclarationList2(null, [variableDeclaration]); |
| 759 variableDeclaration.accept(builder); |
| 760 |
| 761 List<TopLevelVariableElement> variables = holder.topLevelVariables; |
| 762 expect(variables, hasLength(1)); |
| 763 TopLevelVariableElement variable = variables[0]; |
| 764 expect(variable, isNotNull); |
| 765 expect(variable.hasImplicitType, isTrue); |
| 766 expect(variable.initializer, isNull); |
| 767 expect(variable.name, variableName); |
| 768 expect(variable.isConst, isFalse); |
| 769 expect(variable.isFinal, isFalse); |
| 770 expect(variable.isSynthetic, isFalse); |
| 771 expect(variable.getter, isNotNull); |
| 772 expect(variable.setter, isNotNull); |
| 773 } |
| 774 |
| 775 void test_visitVariableDeclaration_top() { |
| 776 // final a, b; |
| 777 ElementHolder holder = new ElementHolder(); |
| 778 ElementBuilder builder = _makeBuilder(holder); |
| 779 VariableDeclaration variableDeclaration1 = |
| 780 AstFactory.variableDeclaration('a'); |
| 781 VariableDeclaration variableDeclaration2 = |
| 782 AstFactory.variableDeclaration('b'); |
| 783 TopLevelVariableDeclaration topLevelVariableDeclaration = AstFactory |
| 784 .topLevelVariableDeclaration( |
| 785 Keyword.FINAL, null, [variableDeclaration1, variableDeclaration2]); |
| 786 topLevelVariableDeclaration.documentationComment = AstFactory |
| 787 .documentationComment( |
| 788 [TokenFactory.tokenFromString('/// aaa')..offset = 50], []); |
| 789 |
| 790 topLevelVariableDeclaration.accept(builder); |
| 791 List<TopLevelVariableElement> variables = holder.topLevelVariables; |
| 792 expect(variables, hasLength(2)); |
| 793 |
| 794 TopLevelVariableElement variable1 = variables[0]; |
| 795 expect(variable1, isNotNull); |
| 796 expect(variable1.documentationComment, '/// aaa'); |
| 797 |
| 798 TopLevelVariableElement variable2 = variables[1]; |
| 799 expect(variable2, isNotNull); |
| 800 expect(variable2.documentationComment, '/// aaa'); |
| 801 } |
| 802 |
| 803 void test_visitVariableDeclaration_top_const_hasInitializer() { |
| 804 // const v = 42; |
| 805 ElementHolder holder = new ElementHolder(); |
| 806 ElementBuilder builder = _makeBuilder(holder); |
| 807 String variableName = "v"; |
| 808 VariableDeclaration variableDeclaration = |
| 809 AstFactory.variableDeclaration2(variableName, AstFactory.integer(42)); |
| 810 AstFactory.variableDeclarationList2(Keyword.CONST, [variableDeclaration]); |
| 811 variableDeclaration.accept(builder); |
| 812 |
| 813 List<TopLevelVariableElement> variables = holder.topLevelVariables; |
| 814 expect(variables, hasLength(1)); |
| 815 TopLevelVariableElement variable = variables[0]; |
| 816 expect(variable, new isInstanceOf<ConstTopLevelVariableElementImpl>()); |
| 817 expect(variable.initializer, isNotNull); |
| 818 expect(variable.initializer.type, isNotNull); |
| 819 expect(variable.initializer.hasImplicitReturnType, isTrue); |
| 820 expect(variable.name, variableName); |
| 821 expect(variable.hasImplicitType, isTrue); |
| 822 expect(variable.isConst, isTrue); |
| 823 expect(variable.isFinal, isFalse); |
| 824 expect(variable.isSynthetic, isFalse); |
| 825 expect(variable.getter, isNotNull); |
| 826 expect(variable.setter, isNull); |
| 827 } |
| 828 |
| 829 void test_visitVariableDeclaration_top_final() { |
| 830 // final v; |
| 831 ElementHolder holder = new ElementHolder(); |
| 832 ElementBuilder builder = _makeBuilder(holder); |
| 833 String variableName = "v"; |
| 834 VariableDeclaration variableDeclaration = |
| 835 AstFactory.variableDeclaration2(variableName, null); |
| 836 AstFactory.variableDeclarationList2(Keyword.FINAL, [variableDeclaration]); |
| 837 variableDeclaration.accept(builder); |
| 838 List<TopLevelVariableElement> variables = holder.topLevelVariables; |
| 839 expect(variables, hasLength(1)); |
| 840 TopLevelVariableElement variable = variables[0]; |
| 841 expect(variable, isNotNull); |
| 842 expect(variable.hasImplicitType, isTrue); |
| 843 expect(variable.initializer, isNull); |
| 844 expect(variable.name, variableName); |
| 845 expect(variable.isConst, isFalse); |
| 846 expect(variable.isFinal, isTrue); |
| 847 expect(variable.isSynthetic, isFalse); |
| 848 expect(variable.getter, isNotNull); |
| 849 expect(variable.setter, isNull); |
| 850 } |
| 851 |
| 852 ElementBuilder _makeBuilder(ElementHolder holder) => |
| 853 new ElementBuilder(holder, compilationUnitElement); |
| 854 |
| 855 void _setBlockBodySourceRange(BlockFunctionBody body, int offset, int end) { |
| 856 _setNodeSourceRange(body.block, offset, end); |
| 857 } |
| 858 |
| 859 void _setNodeSourceRange(AstNode node, int offset, int end) { |
| 860 node.beginToken.offset = offset; |
| 861 Token endToken = node.endToken; |
| 862 endToken.offset = end - endToken.length; |
| 863 } |
| 864 |
| 865 void _useParameterInMethod( |
| 866 FormalParameter formalParameter, int blockOffset, int blockEnd) { |
| 867 Block block = AstFactory.block(); |
| 868 block.leftBracket.offset = blockOffset; |
| 869 block.rightBracket.offset = blockEnd - 1; |
| 870 BlockFunctionBody body = AstFactory.blockFunctionBody(block); |
| 871 AstFactory.methodDeclaration2( |
| 872 null, |
| 873 null, |
| 874 null, |
| 875 null, |
| 876 AstFactory.identifier3("main"), |
| 877 AstFactory.formalParameterList([formalParameter]), |
| 878 body); |
| 879 } |
| 880 } |
| 881 |
| 882 /** |
| 883 * Mixin with test methods for testing element building in [ApiElementBuilder]. |
| 884 * It is used to test the [ApiElementBuilder] itself, and its usage by |
| 885 * [ElementBuilder]. |
| 886 */ |
| 887 abstract class _ApiElementBuilderTestMixin { |
| 888 CompilationUnit get compilationUnit; |
| 889 |
| 890 void assertHasCodeRange(Element element, int offset, int length); |
| 891 |
| 892 /** |
| 893 * Build elements using [ApiElementBuilder]. |
| 894 */ |
| 895 ElementHolder buildElementsForAst(AstNode node); |
| 896 |
| 897 /** |
| 898 * Parse the given [code], and build elements using [ApiElementBuilder]. |
| 899 */ |
| 900 ElementHolder buildElementsForText(String code); |
| 901 |
| 902 /** |
| 903 * Verify that the given [metadata] has exactly one annotation, and that its |
| 904 * [ElementAnnotationImpl] is unresolved. |
| 905 */ |
| 906 void checkAnnotation(NodeList<Annotation> metadata); |
| 907 |
| 908 /** |
| 909 * Verify that the given [element] has exactly one annotation, and that its |
| 910 * [ElementAnnotationImpl] is unresolved. |
| 911 */ |
| 912 void checkMetadata(Element element); |
| 913 |
| 914 void test_metadata_fieldDeclaration() { |
| 915 List<FieldElement> fields = |
| 916 buildElementsForText('class C { @a int x, y; }').types[0].fields; |
| 917 checkMetadata(fields[0]); |
| 918 checkMetadata(fields[1]); |
| 919 expect(fields[0].metadata, same(fields[1].metadata)); |
| 920 } |
| 921 |
| 922 void test_metadata_topLevelVariableDeclaration() { |
| 923 List<TopLevelVariableElement> topLevelVariables = |
| 924 buildElementsForText('@a int x, y;').topLevelVariables; |
| 925 checkMetadata(topLevelVariables[0]); |
| 926 checkMetadata(topLevelVariables[1]); |
| 927 expect(topLevelVariables[0].metadata, same(topLevelVariables[1].metadata)); |
| 928 } |
| 929 |
| 930 void test_metadata_visitClassDeclaration() { |
| 931 ClassElement classElement = buildElementsForText('@a class C {}').types[0]; |
| 932 checkMetadata(classElement); |
| 933 } |
| 934 |
| 935 void test_metadata_visitClassTypeAlias() { |
| 936 ClassElement classElement = |
| 937 buildElementsForText('@a class C = D with E;').types[0]; |
| 938 checkMetadata(classElement); |
| 939 } |
| 940 |
| 941 void test_metadata_visitConstructorDeclaration() { |
| 942 ConstructorElement constructorElement = |
| 943 buildElementsForText('class C { @a C(); }').types[0].constructors[0]; |
| 944 checkMetadata(constructorElement); |
| 945 } |
| 946 |
| 947 void test_metadata_visitDefaultFormalParameter_fieldFormalParameter() { |
| 948 ParameterElement parameterElement = |
| 949 buildElementsForText('class C { var x; C([@a this.x = null]); }') |
| 950 .types[0] |
| 951 .constructors[0] |
| 952 .parameters[0]; |
| 953 checkMetadata(parameterElement); |
| 954 } |
| 955 |
| 956 void |
| 957 test_metadata_visitDefaultFormalParameter_functionTypedFormalParameter() { |
| 958 ParameterElement parameterElement = |
| 959 buildElementsForText('f([@a g() = null]) {}').functions[0].parameters[ |
| 960 0]; |
| 961 checkMetadata(parameterElement); |
| 962 } |
| 963 |
| 964 void test_metadata_visitDefaultFormalParameter_simpleFormalParameter() { |
| 965 ParameterElement parameterElement = |
| 966 buildElementsForText('f([@a gx = null]) {}').functions[0].parameters[0]; |
| 967 checkMetadata(parameterElement); |
| 968 } |
| 969 |
| 970 void test_metadata_visitEnumDeclaration() { |
| 971 ClassElement classElement = |
| 972 buildElementsForText('@a enum E { v }').enums[0]; |
| 973 checkMetadata(classElement); |
| 974 } |
| 975 |
| 976 void test_metadata_visitExportDirective() { |
| 977 buildElementsForText('@a export "foo.dart";'); |
| 978 expect(compilationUnit.directives[0], new isInstanceOf<ExportDirective>()); |
| 979 ExportDirective exportDirective = compilationUnit.directives[0]; |
| 980 checkAnnotation(exportDirective.metadata); |
| 981 } |
| 982 |
| 983 void test_metadata_visitFieldFormalParameter() { |
| 984 ParameterElement parameterElement = |
| 985 buildElementsForText('class C { var x; C(@a this.x); }') |
| 986 .types[0] |
| 987 .constructors[0] |
| 988 .parameters[0]; |
| 989 checkMetadata(parameterElement); |
| 990 } |
| 991 |
| 992 void test_metadata_visitFunctionDeclaration_function() { |
| 993 FunctionElement functionElement = |
| 994 buildElementsForText('@a f() {}').functions[0]; |
| 995 checkMetadata(functionElement); |
| 996 } |
| 997 |
| 998 void test_metadata_visitFunctionDeclaration_getter() { |
| 999 PropertyAccessorElement propertyAccessorElement = |
| 1000 buildElementsForText('@a get f => null;').accessors[0]; |
| 1001 checkMetadata(propertyAccessorElement); |
| 1002 } |
| 1003 |
| 1004 void test_metadata_visitFunctionDeclaration_setter() { |
| 1005 PropertyAccessorElement propertyAccessorElement = |
| 1006 buildElementsForText('@a set f(value) {}').accessors[0]; |
| 1007 checkMetadata(propertyAccessorElement); |
| 1008 } |
| 1009 |
| 1010 void test_metadata_visitFunctionTypeAlias() { |
| 1011 FunctionTypeAliasElement functionTypeAliasElement = |
| 1012 buildElementsForText('@a typedef F();').typeAliases[0]; |
| 1013 checkMetadata(functionTypeAliasElement); |
| 1014 } |
| 1015 |
| 1016 void test_metadata_visitFunctionTypedFormalParameter() { |
| 1017 ParameterElement parameterElement = |
| 1018 buildElementsForText('f(@a g()) {}').functions[0].parameters[0]; |
| 1019 checkMetadata(parameterElement); |
| 1020 } |
| 1021 |
| 1022 void test_metadata_visitImportDirective() { |
| 1023 buildElementsForText('@a import "foo.dart";'); |
| 1024 expect(compilationUnit.directives[0], new isInstanceOf<ImportDirective>()); |
| 1025 ImportDirective importDirective = compilationUnit.directives[0]; |
| 1026 checkAnnotation(importDirective.metadata); |
| 1027 } |
| 1028 |
| 1029 void test_metadata_visitLibraryDirective() { |
| 1030 buildElementsForText('@a library L;'); |
| 1031 expect(compilationUnit.directives[0], new isInstanceOf<LibraryDirective>()); |
| 1032 LibraryDirective libraryDirective = compilationUnit.directives[0]; |
| 1033 checkAnnotation(libraryDirective.metadata); |
| 1034 } |
| 1035 |
| 1036 void test_metadata_visitMethodDeclaration_getter() { |
| 1037 PropertyAccessorElement propertyAccessorElement = |
| 1038 buildElementsForText('class C { @a get m => null; }') |
| 1039 .types[0] |
| 1040 .accessors[0]; |
| 1041 checkMetadata(propertyAccessorElement); |
| 1042 } |
| 1043 |
| 1044 void test_metadata_visitMethodDeclaration_method() { |
| 1045 MethodElement methodElement = |
| 1046 buildElementsForText('class C { @a m() {} }').types[0].methods[0]; |
| 1047 checkMetadata(methodElement); |
| 1048 } |
| 1049 |
| 1050 void test_metadata_visitMethodDeclaration_setter() { |
| 1051 PropertyAccessorElement propertyAccessorElement = |
| 1052 buildElementsForText('class C { @a set f(value) {} }') |
| 1053 .types[0] |
| 1054 .accessors[0]; |
| 1055 checkMetadata(propertyAccessorElement); |
| 1056 } |
| 1057 |
| 1058 void test_metadata_visitPartDirective() { |
| 1059 buildElementsForText('@a part "foo.dart";'); |
| 1060 expect(compilationUnit.directives[0], new isInstanceOf<PartDirective>()); |
| 1061 PartDirective partDirective = compilationUnit.directives[0]; |
| 1062 checkAnnotation(partDirective.metadata); |
| 1063 } |
| 1064 |
| 1065 void test_metadata_visitPartOfDirective() { |
| 1066 // We don't build ElementAnnotation objects for `part of` directives, since |
| 1067 // analyzer ignores them in favor of annotations on the library directive. |
| 1068 buildElementsForText('@a part of L;'); |
| 1069 expect(compilationUnit.directives[0], new isInstanceOf<PartOfDirective>()); |
| 1070 PartOfDirective partOfDirective = compilationUnit.directives[0]; |
| 1071 expect(partOfDirective.metadata, hasLength(1)); |
| 1072 expect(partOfDirective.metadata[0].elementAnnotation, isNull); |
| 1073 } |
| 1074 |
| 1075 void test_metadata_visitSimpleFormalParameter() { |
| 1076 ParameterElement parameterElement = |
| 1077 buildElementsForText('f(@a x) {}').functions[0].parameters[0]; |
| 1078 checkMetadata(parameterElement); |
| 1079 } |
| 1080 |
| 1081 void test_metadata_visitTypeParameter() { |
| 1082 TypeParameterElement typeParameterElement = |
| 1083 buildElementsForText('class C<@a T> {}').types[0].typeParameters[0]; |
| 1084 checkMetadata(typeParameterElement); |
| 1085 } |
| 1086 |
339 void test_visitClassDeclaration_abstract() { | 1087 void test_visitClassDeclaration_abstract() { |
340 ElementHolder holder = new ElementHolder(); | 1088 List<ClassElement> types = |
341 ElementBuilder builder = _makeBuilder(holder); | 1089 buildElementsForText('abstract class C {}').types; |
342 String className = "C"; | |
343 ClassDeclaration classDeclaration = AstFactory.classDeclaration( | |
344 Keyword.ABSTRACT, className, null, null, null, null); | |
345 classDeclaration.accept(builder); | |
346 List<ClassElement> types = holder.types; | |
347 expect(types, hasLength(1)); | 1090 expect(types, hasLength(1)); |
348 ClassElement type = types[0]; | 1091 ClassElement type = types[0]; |
349 expect(type, isNotNull); | 1092 expect(type, isNotNull); |
350 expect(type.name, className); | 1093 expect(type.name, 'C'); |
351 List<TypeParameterElement> typeParameters = type.typeParameters; | 1094 List<TypeParameterElement> typeParameters = type.typeParameters; |
352 expect(typeParameters, hasLength(0)); | 1095 expect(typeParameters, hasLength(0)); |
353 expect(type.isAbstract, isTrue); | 1096 expect(type.isAbstract, isTrue); |
354 expect(type.isMixinApplication, isFalse); | 1097 expect(type.isMixinApplication, isFalse); |
355 expect(type.isSynthetic, isFalse); | 1098 expect(type.isSynthetic, isFalse); |
356 } | 1099 } |
357 | 1100 |
358 void test_visitClassDeclaration_invalidFunctionInAnnotation_class() { | 1101 void test_visitClassDeclaration_invalidFunctionInAnnotation_class() { |
359 // https://github.com/dart-lang/sdk/issues/25696 | 1102 // https://github.com/dart-lang/sdk/issues/25696 |
360 String code = r''' | 1103 String code = r''' |
(...skipping 20 matching lines...) Expand all Loading... |
381 '''; | 1124 '''; |
382 ElementHolder holder = buildElementsForText(code); | 1125 ElementHolder holder = buildElementsForText(code); |
383 ClassElement elementC = holder.types[1]; | 1126 ClassElement elementC = holder.types[1]; |
384 expect(elementC, isNotNull); | 1127 expect(elementC, isNotNull); |
385 MethodElement methodM = elementC.methods[0]; | 1128 MethodElement methodM = elementC.methods[0]; |
386 expect(methodM, isNotNull); | 1129 expect(methodM, isNotNull); |
387 expect(methodM.functions, isEmpty); | 1130 expect(methodM.functions, isEmpty); |
388 } | 1131 } |
389 | 1132 |
390 void test_visitClassDeclaration_minimal() { | 1133 void test_visitClassDeclaration_minimal() { |
391 ElementHolder holder = new ElementHolder(); | |
392 ElementBuilder builder = _makeBuilder(holder); | |
393 String className = "C"; | 1134 String className = "C"; |
394 ClassDeclaration classDeclaration = | 1135 ClassDeclaration classDeclaration = |
395 AstFactory.classDeclaration(null, className, null, null, null, null); | 1136 AstFactory.classDeclaration(null, className, null, null, null, null); |
396 classDeclaration.documentationComment = AstFactory.documentationComment( | 1137 classDeclaration.documentationComment = AstFactory.documentationComment( |
397 [TokenFactory.tokenFromString('/// aaa')..offset = 50], []); | 1138 [TokenFactory.tokenFromString('/// aaa')..offset = 50], []); |
398 classDeclaration.endToken.offset = 80; | 1139 classDeclaration.endToken.offset = 80; |
399 classDeclaration.accept(builder); | 1140 |
| 1141 ElementHolder holder = buildElementsForAst(classDeclaration); |
400 List<ClassElement> types = holder.types; | 1142 List<ClassElement> types = holder.types; |
401 expect(types, hasLength(1)); | 1143 expect(types, hasLength(1)); |
402 ClassElement type = types[0]; | 1144 ClassElement type = types[0]; |
403 expect(type, isNotNull); | 1145 expect(type, isNotNull); |
404 expect(type.name, className); | 1146 expect(type.name, className); |
405 List<TypeParameterElement> typeParameters = type.typeParameters; | 1147 List<TypeParameterElement> typeParameters = type.typeParameters; |
406 expect(typeParameters, hasLength(0)); | 1148 expect(typeParameters, hasLength(0)); |
407 expect(type.isAbstract, isFalse); | 1149 expect(type.isAbstract, isFalse); |
408 expect(type.isMixinApplication, isFalse); | 1150 expect(type.isMixinApplication, isFalse); |
409 expect(type.isSynthetic, isFalse); | 1151 expect(type.isSynthetic, isFalse); |
410 expect(type.documentationComment, '/// aaa'); | 1152 expect(type.documentationComment, '/// aaa'); |
411 _assertHasCodeRange(type, 50, 31); | 1153 assertHasCodeRange(type, 50, 31); |
412 } | 1154 } |
413 | 1155 |
414 void test_visitClassDeclaration_parameterized() { | 1156 void test_visitClassDeclaration_parameterized() { |
415 ElementHolder holder = new ElementHolder(); | |
416 ElementBuilder builder = _makeBuilder(holder); | |
417 String className = "C"; | 1157 String className = "C"; |
418 String firstVariableName = "E"; | 1158 String firstVariableName = "E"; |
419 String secondVariableName = "F"; | 1159 String secondVariableName = "F"; |
420 ClassDeclaration classDeclaration = AstFactory.classDeclaration( | 1160 ClassDeclaration classDeclaration = AstFactory.classDeclaration( |
421 null, | 1161 null, |
422 className, | 1162 className, |
423 AstFactory.typeParameterList([firstVariableName, secondVariableName]), | 1163 AstFactory.typeParameterList([firstVariableName, secondVariableName]), |
424 null, | 1164 null, |
425 null, | 1165 null, |
426 null); | 1166 null); |
427 classDeclaration.accept(builder); | 1167 |
| 1168 ElementHolder holder = buildElementsForAst(classDeclaration); |
428 List<ClassElement> types = holder.types; | 1169 List<ClassElement> types = holder.types; |
429 expect(types, hasLength(1)); | 1170 expect(types, hasLength(1)); |
430 ClassElement type = types[0]; | 1171 ClassElement type = types[0]; |
431 expect(type, isNotNull); | 1172 expect(type, isNotNull); |
432 expect(type.name, className); | 1173 expect(type.name, className); |
433 List<TypeParameterElement> typeParameters = type.typeParameters; | 1174 List<TypeParameterElement> typeParameters = type.typeParameters; |
434 expect(typeParameters, hasLength(2)); | 1175 expect(typeParameters, hasLength(2)); |
435 expect(typeParameters[0].name, firstVariableName); | 1176 expect(typeParameters[0].name, firstVariableName); |
436 expect(typeParameters[1].name, secondVariableName); | 1177 expect(typeParameters[1].name, secondVariableName); |
437 expect(type.isAbstract, isFalse); | 1178 expect(type.isAbstract, isFalse); |
438 expect(type.isMixinApplication, isFalse); | 1179 expect(type.isMixinApplication, isFalse); |
439 expect(type.isSynthetic, isFalse); | 1180 expect(type.isSynthetic, isFalse); |
440 } | 1181 } |
441 | 1182 |
442 void test_visitClassDeclaration_withMembers() { | 1183 void test_visitClassDeclaration_withMembers() { |
443 ElementHolder holder = new ElementHolder(); | |
444 ElementBuilder builder = _makeBuilder(holder); | |
445 String className = "C"; | 1184 String className = "C"; |
446 String typeParameterName = "E"; | 1185 String typeParameterName = "E"; |
447 String fieldName = "f"; | 1186 String fieldName = "f"; |
448 String methodName = "m"; | 1187 String methodName = "m"; |
449 ClassDeclaration classDeclaration = AstFactory.classDeclaration( | 1188 ClassDeclaration classDeclaration = AstFactory.classDeclaration( |
450 null, | 1189 null, |
451 className, | 1190 className, |
452 AstFactory.typeParameterList([typeParameterName]), | 1191 AstFactory.typeParameterList([typeParameterName]), |
453 null, | 1192 null, |
454 null, | 1193 null, |
455 null, [ | 1194 null, [ |
456 AstFactory.fieldDeclaration2( | 1195 AstFactory.fieldDeclaration2( |
457 false, null, [AstFactory.variableDeclaration(fieldName)]), | 1196 false, null, [AstFactory.variableDeclaration(fieldName)]), |
458 AstFactory.methodDeclaration2( | 1197 AstFactory.methodDeclaration2( |
459 null, | 1198 null, |
460 null, | 1199 null, |
461 null, | 1200 null, |
462 null, | 1201 null, |
463 AstFactory.identifier3(methodName), | 1202 AstFactory.identifier3(methodName), |
464 AstFactory.formalParameterList(), | 1203 AstFactory.formalParameterList(), |
465 AstFactory.blockFunctionBody2()) | 1204 AstFactory.blockFunctionBody2()) |
466 ]); | 1205 ]); |
467 classDeclaration.accept(builder); | 1206 |
| 1207 ElementHolder holder = buildElementsForAst(classDeclaration); |
468 List<ClassElement> types = holder.types; | 1208 List<ClassElement> types = holder.types; |
469 expect(types, hasLength(1)); | 1209 expect(types, hasLength(1)); |
470 ClassElement type = types[0]; | 1210 ClassElement type = types[0]; |
471 expect(type, isNotNull); | 1211 expect(type, isNotNull); |
472 expect(type.name, className); | 1212 expect(type.name, className); |
473 expect(type.isAbstract, isFalse); | 1213 expect(type.isAbstract, isFalse); |
474 expect(type.isMixinApplication, isFalse); | 1214 expect(type.isMixinApplication, isFalse); |
475 expect(type.isSynthetic, isFalse); | 1215 expect(type.isSynthetic, isFalse); |
476 List<TypeParameterElement> typeParameters = type.typeParameters; | 1216 List<TypeParameterElement> typeParameters = type.typeParameters; |
477 expect(typeParameters, hasLength(1)); | 1217 expect(typeParameters, hasLength(1)); |
478 TypeParameterElement typeParameter = typeParameters[0]; | 1218 TypeParameterElement typeParameter = typeParameters[0]; |
479 expect(typeParameter, isNotNull); | 1219 expect(typeParameter, isNotNull); |
480 expect(typeParameter.name, typeParameterName); | 1220 expect(typeParameter.name, typeParameterName); |
481 List<FieldElement> fields = type.fields; | 1221 List<FieldElement> fields = type.fields; |
482 expect(fields, hasLength(1)); | 1222 expect(fields, hasLength(1)); |
483 FieldElement field = fields[0]; | 1223 FieldElement field = fields[0]; |
484 expect(field, isNotNull); | 1224 expect(field, isNotNull); |
485 expect(field.name, fieldName); | 1225 expect(field.name, fieldName); |
486 List<MethodElement> methods = type.methods; | 1226 List<MethodElement> methods = type.methods; |
487 expect(methods, hasLength(1)); | 1227 expect(methods, hasLength(1)); |
488 MethodElement method = methods[0]; | 1228 MethodElement method = methods[0]; |
489 expect(method, isNotNull); | 1229 expect(method, isNotNull); |
490 expect(method.name, methodName); | 1230 expect(method.name, methodName); |
491 } | 1231 } |
492 | 1232 |
493 void test_visitClassTypeAlias() { | 1233 void test_visitClassTypeAlias() { |
494 // class B {} | 1234 // class B {} |
495 // class M {} | 1235 // class M {} |
496 // class C = B with M | 1236 // class C = B with M |
497 ElementHolder holder = new ElementHolder(); | |
498 ElementBuilder builder = _makeBuilder(holder); | |
499 ClassElementImpl classB = ElementFactory.classElement2('B', []); | 1237 ClassElementImpl classB = ElementFactory.classElement2('B', []); |
500 ConstructorElementImpl constructorB = | 1238 ConstructorElementImpl constructorB = |
501 ElementFactory.constructorElement2(classB, '', []); | 1239 ElementFactory.constructorElement2(classB, '', []); |
502 constructorB.setModifier(Modifier.SYNTHETIC, true); | 1240 constructorB.setModifier(Modifier.SYNTHETIC, true); |
503 classB.constructors = [constructorB]; | 1241 classB.constructors = [constructorB]; |
504 ClassElement classM = ElementFactory.classElement2('M', []); | 1242 ClassElement classM = ElementFactory.classElement2('M', []); |
505 WithClause withClause = | 1243 WithClause withClause = |
506 AstFactory.withClause([AstFactory.typeName(classM, [])]); | 1244 AstFactory.withClause([AstFactory.typeName(classM, [])]); |
507 ClassTypeAlias alias = AstFactory.classTypeAlias( | 1245 ClassTypeAlias alias = AstFactory.classTypeAlias( |
508 'C', null, null, AstFactory.typeName(classB, []), withClause, null); | 1246 'C', null, null, AstFactory.typeName(classB, []), withClause, null); |
509 alias.accept(builder); | 1247 |
| 1248 ElementHolder holder = buildElementsForAst(alias); |
510 List<ClassElement> types = holder.types; | 1249 List<ClassElement> types = holder.types; |
511 expect(types, hasLength(1)); | 1250 expect(types, hasLength(1)); |
512 ClassElement type = types[0]; | 1251 ClassElement type = types[0]; |
513 expect(alias.element, same(type)); | 1252 expect(alias.element, same(type)); |
514 expect(type.name, equals('C')); | 1253 expect(type.name, equals('C')); |
515 expect(type.isAbstract, isFalse); | 1254 expect(type.isAbstract, isFalse); |
516 expect(type.isMixinApplication, isTrue); | 1255 expect(type.isMixinApplication, isTrue); |
517 expect(type.isSynthetic, isFalse); | 1256 expect(type.isSynthetic, isFalse); |
518 expect(type.typeParameters, isEmpty); | 1257 expect(type.typeParameters, isEmpty); |
519 expect(type.fields, isEmpty); | 1258 expect(type.fields, isEmpty); |
520 expect(type.methods, isEmpty); | 1259 expect(type.methods, isEmpty); |
521 } | 1260 } |
522 | 1261 |
523 void test_visitClassTypeAlias_abstract() { | 1262 void test_visitClassTypeAlias_abstract() { |
524 // class B {} | 1263 // class B {} |
525 // class M {} | 1264 // class M {} |
526 // abstract class C = B with M | 1265 // abstract class C = B with M |
527 ElementHolder holder = new ElementHolder(); | |
528 ElementBuilder builder = _makeBuilder(holder); | |
529 ClassElementImpl classB = ElementFactory.classElement2('B', []); | 1266 ClassElementImpl classB = ElementFactory.classElement2('B', []); |
530 ConstructorElementImpl constructorB = | 1267 ConstructorElementImpl constructorB = |
531 ElementFactory.constructorElement2(classB, '', []); | 1268 ElementFactory.constructorElement2(classB, '', []); |
532 constructorB.setModifier(Modifier.SYNTHETIC, true); | 1269 constructorB.setModifier(Modifier.SYNTHETIC, true); |
533 classB.constructors = [constructorB]; | 1270 classB.constructors = [constructorB]; |
534 ClassElement classM = ElementFactory.classElement2('M', []); | 1271 ClassElement classM = ElementFactory.classElement2('M', []); |
535 WithClause withClause = | 1272 WithClause withClause = |
536 AstFactory.withClause([AstFactory.typeName(classM, [])]); | 1273 AstFactory.withClause([AstFactory.typeName(classM, [])]); |
537 ClassTypeAlias classCAst = AstFactory.classTypeAlias('C', null, | 1274 ClassTypeAlias alias = AstFactory.classTypeAlias('C', null, |
538 Keyword.ABSTRACT, AstFactory.typeName(classB, []), withClause, null); | 1275 Keyword.ABSTRACT, AstFactory.typeName(classB, []), withClause, null); |
539 classCAst.accept(builder); | 1276 |
| 1277 ElementHolder holder = buildElementsForAst(alias); |
540 List<ClassElement> types = holder.types; | 1278 List<ClassElement> types = holder.types; |
541 expect(types, hasLength(1)); | 1279 expect(types, hasLength(1)); |
542 ClassElement type = types[0]; | 1280 ClassElement type = types[0]; |
543 expect(type.isAbstract, isTrue); | 1281 expect(type.isAbstract, isTrue); |
544 expect(type.isMixinApplication, isTrue); | 1282 expect(type.isMixinApplication, isTrue); |
545 } | 1283 } |
546 | 1284 |
547 void test_visitClassTypeAlias_typeParams() { | 1285 void test_visitClassTypeAlias_typeParams() { |
548 // class B {} | 1286 // class B {} |
549 // class M {} | 1287 // class M {} |
550 // class C<T> = B with M | 1288 // class C<T> = B with M |
551 ElementHolder holder = new ElementHolder(); | |
552 ElementBuilder builder = _makeBuilder(holder); | |
553 ClassElementImpl classB = ElementFactory.classElement2('B', []); | 1289 ClassElementImpl classB = ElementFactory.classElement2('B', []); |
554 ConstructorElementImpl constructorB = | 1290 ConstructorElementImpl constructorB = |
555 ElementFactory.constructorElement2(classB, '', []); | 1291 ElementFactory.constructorElement2(classB, '', []); |
556 constructorB.setModifier(Modifier.SYNTHETIC, true); | 1292 constructorB.setModifier(Modifier.SYNTHETIC, true); |
557 classB.constructors = [constructorB]; | 1293 classB.constructors = [constructorB]; |
558 ClassElementImpl classM = ElementFactory.classElement2('M', []); | 1294 ClassElementImpl classM = ElementFactory.classElement2('M', []); |
559 WithClause withClause = | 1295 WithClause withClause = |
560 AstFactory.withClause([AstFactory.typeName(classM, [])]); | 1296 AstFactory.withClause([AstFactory.typeName(classM, [])]); |
561 ClassTypeAlias classCAst = AstFactory.classTypeAlias( | 1297 ClassTypeAlias alias = AstFactory.classTypeAlias( |
562 'C', | 1298 'C', |
563 AstFactory.typeParameterList(['T']), | 1299 AstFactory.typeParameterList(['T']), |
564 null, | 1300 null, |
565 AstFactory.typeName(classB, []), | 1301 AstFactory.typeName(classB, []), |
566 withClause, | 1302 withClause, |
567 null); | 1303 null); |
568 classCAst.accept(builder); | 1304 |
| 1305 ElementHolder holder = buildElementsForAst(alias); |
569 List<ClassElement> types = holder.types; | 1306 List<ClassElement> types = holder.types; |
570 expect(types, hasLength(1)); | 1307 expect(types, hasLength(1)); |
571 ClassElement type = types[0]; | 1308 ClassElement type = types[0]; |
572 expect(type.typeParameters, hasLength(1)); | 1309 expect(type.typeParameters, hasLength(1)); |
573 expect(type.typeParameters[0].name, equals('T')); | 1310 expect(type.typeParameters[0].name, equals('T')); |
574 } | 1311 } |
575 | 1312 |
576 void test_visitCompilationUnit_codeRange() { | |
577 TopLevelVariableDeclaration topLevelVariableDeclaration = AstFactory | |
578 .topLevelVariableDeclaration(null, AstFactory.typeName4('int'), | |
579 [AstFactory.variableDeclaration('V')]); | |
580 CompilationUnit unit = new CompilationUnit( | |
581 topLevelVariableDeclaration.beginToken, | |
582 null, | |
583 [], | |
584 [topLevelVariableDeclaration], | |
585 topLevelVariableDeclaration.endToken); | |
586 ElementHolder holder = new ElementHolder(); | |
587 ElementBuilder builder = _makeBuilder(holder); | |
588 unit.beginToken.offset = 10; | |
589 unit.endToken.offset = 40; | |
590 unit.accept(builder); | |
591 | |
592 CompilationUnitElement element = builder.compilationUnitElement; | |
593 _assertHasCodeRange(element, 0, 41); | |
594 } | |
595 | |
596 void test_visitConstructorDeclaration_external() { | 1313 void test_visitConstructorDeclaration_external() { |
597 ElementHolder holder = new ElementHolder(); | |
598 ElementBuilder builder = _makeBuilder(holder); | |
599 String className = "A"; | 1314 String className = "A"; |
600 ConstructorDeclaration constructorDeclaration = | 1315 ConstructorDeclaration constructorDeclaration = |
601 AstFactory.constructorDeclaration2( | 1316 AstFactory.constructorDeclaration2( |
602 null, | 1317 null, |
603 null, | 1318 null, |
604 AstFactory.identifier3(className), | 1319 AstFactory.identifier3(className), |
605 null, | 1320 null, |
606 AstFactory.formalParameterList(), | 1321 AstFactory.formalParameterList(), |
607 null, | 1322 null, |
608 AstFactory.blockFunctionBody2()); | 1323 AstFactory.blockFunctionBody2()); |
609 constructorDeclaration.externalKeyword = | 1324 constructorDeclaration.externalKeyword = |
610 TokenFactory.tokenFromKeyword(Keyword.EXTERNAL); | 1325 TokenFactory.tokenFromKeyword(Keyword.EXTERNAL); |
611 constructorDeclaration.accept(builder); | 1326 |
| 1327 ElementHolder holder = buildElementsForAst(constructorDeclaration); |
612 List<ConstructorElement> constructors = holder.constructors; | 1328 List<ConstructorElement> constructors = holder.constructors; |
613 expect(constructors, hasLength(1)); | 1329 expect(constructors, hasLength(1)); |
614 ConstructorElement constructor = constructors[0]; | 1330 ConstructorElement constructor = constructors[0]; |
615 expect(constructor, isNotNull); | 1331 expect(constructor, isNotNull); |
616 expect(constructor.isExternal, isTrue); | 1332 expect(constructor.isExternal, isTrue); |
617 expect(constructor.isFactory, isFalse); | 1333 expect(constructor.isFactory, isFalse); |
618 expect(constructor.name, ""); | 1334 expect(constructor.name, ""); |
619 expect(constructor.functions, hasLength(0)); | 1335 expect(constructor.functions, hasLength(0)); |
620 expect(constructor.labels, hasLength(0)); | 1336 expect(constructor.labels, hasLength(0)); |
621 expect(constructor.localVariables, hasLength(0)); | 1337 expect(constructor.localVariables, hasLength(0)); |
622 expect(constructor.parameters, hasLength(0)); | 1338 expect(constructor.parameters, hasLength(0)); |
623 } | 1339 } |
624 | 1340 |
625 void test_visitConstructorDeclaration_factory() { | 1341 void test_visitConstructorDeclaration_factory() { |
626 ElementHolder holder = new ElementHolder(); | |
627 ElementBuilder builder = _makeBuilder(holder); | |
628 String className = "A"; | 1342 String className = "A"; |
629 ConstructorDeclaration constructorDeclaration = | 1343 ConstructorDeclaration constructorDeclaration = |
630 AstFactory.constructorDeclaration2( | 1344 AstFactory.constructorDeclaration2( |
631 null, | 1345 null, |
632 Keyword.FACTORY, | 1346 Keyword.FACTORY, |
633 AstFactory.identifier3(className), | 1347 AstFactory.identifier3(className), |
634 null, | 1348 null, |
635 AstFactory.formalParameterList(), | 1349 AstFactory.formalParameterList(), |
636 null, | 1350 null, |
637 AstFactory.blockFunctionBody2()); | 1351 AstFactory.blockFunctionBody2()); |
638 constructorDeclaration.accept(builder); | 1352 |
| 1353 ElementHolder holder = buildElementsForAst(constructorDeclaration); |
639 List<ConstructorElement> constructors = holder.constructors; | 1354 List<ConstructorElement> constructors = holder.constructors; |
640 expect(constructors, hasLength(1)); | 1355 expect(constructors, hasLength(1)); |
641 ConstructorElement constructor = constructors[0]; | 1356 ConstructorElement constructor = constructors[0]; |
642 expect(constructor, isNotNull); | 1357 expect(constructor, isNotNull); |
643 expect(constructor.isExternal, isFalse); | 1358 expect(constructor.isExternal, isFalse); |
644 expect(constructor.isFactory, isTrue); | 1359 expect(constructor.isFactory, isTrue); |
645 expect(constructor.name, ""); | 1360 expect(constructor.name, ""); |
646 expect(constructor.functions, hasLength(0)); | 1361 expect(constructor.functions, hasLength(0)); |
647 expect(constructor.labels, hasLength(0)); | 1362 expect(constructor.labels, hasLength(0)); |
648 expect(constructor.localVariables, hasLength(0)); | 1363 expect(constructor.localVariables, hasLength(0)); |
649 expect(constructor.parameters, hasLength(0)); | 1364 expect(constructor.parameters, hasLength(0)); |
650 } | 1365 } |
651 | 1366 |
652 void test_visitConstructorDeclaration_minimal() { | 1367 void test_visitConstructorDeclaration_minimal() { |
653 ElementHolder holder = new ElementHolder(); | |
654 ElementBuilder builder = _makeBuilder(holder); | |
655 String className = "A"; | 1368 String className = "A"; |
656 ConstructorDeclaration constructorDeclaration = | 1369 ConstructorDeclaration constructorDeclaration = |
657 AstFactory.constructorDeclaration2( | 1370 AstFactory.constructorDeclaration2( |
658 null, | 1371 null, |
659 null, | 1372 null, |
660 AstFactory.identifier3(className), | 1373 AstFactory.identifier3(className), |
661 null, | 1374 null, |
662 AstFactory.formalParameterList(), | 1375 AstFactory.formalParameterList(), |
663 null, | 1376 null, |
664 AstFactory.blockFunctionBody2()); | 1377 AstFactory.blockFunctionBody2()); |
665 constructorDeclaration.documentationComment = AstFactory | 1378 constructorDeclaration.documentationComment = AstFactory |
666 .documentationComment( | 1379 .documentationComment( |
667 [TokenFactory.tokenFromString('/// aaa')..offset = 50], []); | 1380 [TokenFactory.tokenFromString('/// aaa')..offset = 50], []); |
668 constructorDeclaration.endToken.offset = 80; | 1381 constructorDeclaration.endToken.offset = 80; |
669 constructorDeclaration.accept(builder); | |
670 | 1382 |
| 1383 ElementHolder holder = buildElementsForAst(constructorDeclaration); |
671 List<ConstructorElement> constructors = holder.constructors; | 1384 List<ConstructorElement> constructors = holder.constructors; |
672 expect(constructors, hasLength(1)); | 1385 expect(constructors, hasLength(1)); |
673 ConstructorElement constructor = constructors[0]; | 1386 ConstructorElement constructor = constructors[0]; |
674 expect(constructor, isNotNull); | 1387 expect(constructor, isNotNull); |
675 _assertHasCodeRange(constructor, 50, 31); | 1388 assertHasCodeRange(constructor, 50, 31); |
676 expect(constructor.documentationComment, '/// aaa'); | 1389 expect(constructor.documentationComment, '/// aaa'); |
677 expect(constructor.isExternal, isFalse); | 1390 expect(constructor.isExternal, isFalse); |
678 expect(constructor.isFactory, isFalse); | 1391 expect(constructor.isFactory, isFalse); |
679 expect(constructor.name, ""); | 1392 expect(constructor.name, ""); |
680 expect(constructor.functions, hasLength(0)); | 1393 expect(constructor.functions, hasLength(0)); |
681 expect(constructor.labels, hasLength(0)); | 1394 expect(constructor.labels, hasLength(0)); |
682 expect(constructor.localVariables, hasLength(0)); | 1395 expect(constructor.localVariables, hasLength(0)); |
683 expect(constructor.parameters, hasLength(0)); | 1396 expect(constructor.parameters, hasLength(0)); |
684 } | 1397 } |
685 | 1398 |
686 void test_visitConstructorDeclaration_named() { | 1399 void test_visitConstructorDeclaration_named() { |
687 ElementHolder holder = new ElementHolder(); | |
688 ElementBuilder builder = _makeBuilder(holder); | |
689 String className = "A"; | 1400 String className = "A"; |
690 String constructorName = "c"; | 1401 String constructorName = "c"; |
691 ConstructorDeclaration constructorDeclaration = | 1402 ConstructorDeclaration constructorDeclaration = |
692 AstFactory.constructorDeclaration2( | 1403 AstFactory.constructorDeclaration2( |
693 null, | 1404 null, |
694 null, | 1405 null, |
695 AstFactory.identifier3(className), | 1406 AstFactory.identifier3(className), |
696 constructorName, | 1407 constructorName, |
697 AstFactory.formalParameterList(), | 1408 AstFactory.formalParameterList(), |
698 null, | 1409 null, |
699 AstFactory.blockFunctionBody2()); | 1410 AstFactory.blockFunctionBody2()); |
700 constructorDeclaration.accept(builder); | 1411 |
| 1412 ElementHolder holder = buildElementsForAst(constructorDeclaration); |
701 List<ConstructorElement> constructors = holder.constructors; | 1413 List<ConstructorElement> constructors = holder.constructors; |
702 expect(constructors, hasLength(1)); | 1414 expect(constructors, hasLength(1)); |
703 ConstructorElement constructor = constructors[0]; | 1415 ConstructorElement constructor = constructors[0]; |
704 expect(constructor, isNotNull); | 1416 expect(constructor, isNotNull); |
705 expect(constructor.isExternal, isFalse); | 1417 expect(constructor.isExternal, isFalse); |
706 expect(constructor.isFactory, isFalse); | 1418 expect(constructor.isFactory, isFalse); |
707 expect(constructor.name, constructorName); | 1419 expect(constructor.name, constructorName); |
708 expect(constructor.functions, hasLength(0)); | 1420 expect(constructor.functions, hasLength(0)); |
709 expect(constructor.labels, hasLength(0)); | 1421 expect(constructor.labels, hasLength(0)); |
710 expect(constructor.localVariables, hasLength(0)); | 1422 expect(constructor.localVariables, hasLength(0)); |
711 expect(constructor.parameters, hasLength(0)); | 1423 expect(constructor.parameters, hasLength(0)); |
712 expect(constructorDeclaration.name.staticElement, same(constructor)); | 1424 expect(constructorDeclaration.name.staticElement, same(constructor)); |
713 expect(constructorDeclaration.element, same(constructor)); | 1425 expect(constructorDeclaration.element, same(constructor)); |
714 } | 1426 } |
715 | 1427 |
716 void test_visitConstructorDeclaration_unnamed() { | 1428 void test_visitConstructorDeclaration_unnamed() { |
717 ElementHolder holder = new ElementHolder(); | |
718 ElementBuilder builder = _makeBuilder(holder); | |
719 String className = "A"; | 1429 String className = "A"; |
720 ConstructorDeclaration constructorDeclaration = | 1430 ConstructorDeclaration constructorDeclaration = |
721 AstFactory.constructorDeclaration2( | 1431 AstFactory.constructorDeclaration2( |
722 null, | 1432 null, |
723 null, | 1433 null, |
724 AstFactory.identifier3(className), | 1434 AstFactory.identifier3(className), |
725 null, | 1435 null, |
726 AstFactory.formalParameterList(), | 1436 AstFactory.formalParameterList(), |
727 null, | 1437 null, |
728 AstFactory.blockFunctionBody2()); | 1438 AstFactory.blockFunctionBody2()); |
729 constructorDeclaration.accept(builder); | 1439 |
| 1440 ElementHolder holder = buildElementsForAst(constructorDeclaration); |
730 List<ConstructorElement> constructors = holder.constructors; | 1441 List<ConstructorElement> constructors = holder.constructors; |
731 expect(constructors, hasLength(1)); | 1442 expect(constructors, hasLength(1)); |
732 ConstructorElement constructor = constructors[0]; | 1443 ConstructorElement constructor = constructors[0]; |
733 expect(constructor, isNotNull); | 1444 expect(constructor, isNotNull); |
734 expect(constructor.isExternal, isFalse); | 1445 expect(constructor.isExternal, isFalse); |
735 expect(constructor.isFactory, isFalse); | 1446 expect(constructor.isFactory, isFalse); |
736 expect(constructor.name, ""); | 1447 expect(constructor.name, ""); |
737 expect(constructor.functions, hasLength(0)); | 1448 expect(constructor.functions, hasLength(0)); |
738 expect(constructor.labels, hasLength(0)); | 1449 expect(constructor.labels, hasLength(0)); |
739 expect(constructor.localVariables, hasLength(0)); | 1450 expect(constructor.localVariables, hasLength(0)); |
740 expect(constructor.parameters, hasLength(0)); | 1451 expect(constructor.parameters, hasLength(0)); |
741 expect(constructorDeclaration.element, same(constructor)); | 1452 expect(constructorDeclaration.element, same(constructor)); |
742 } | 1453 } |
743 | 1454 |
744 void test_visitDeclaredIdentifier_noType() { | |
745 LocalVariableElement variable = | |
746 buildElementsForText('f() { for (var i in []) {} }') | |
747 .functions[0] | |
748 .localVariables[0]; | |
749 _assertHasCodeRange(variable, 11, 5); | |
750 expect(variable, isNotNull); | |
751 expect(variable.hasImplicitType, isTrue); | |
752 expect(variable.isConst, isFalse); | |
753 expect(variable.isDeprecated, isFalse); | |
754 expect(variable.isFinal, isFalse); | |
755 expect(variable.isOverride, isFalse); | |
756 expect(variable.isPrivate, isFalse); | |
757 expect(variable.isPublic, isTrue); | |
758 expect(variable.isSynthetic, isFalse); | |
759 expect(variable.name, 'i'); | |
760 } | |
761 | |
762 void test_visitDeclaredIdentifier_type() { | |
763 LocalVariableElement variable = | |
764 buildElementsForText('f() { for (int i in []) {} }') | |
765 .functions[0] | |
766 .localVariables[0]; | |
767 _assertHasCodeRange(variable, 11, 5); | |
768 expect(variable.hasImplicitType, isFalse); | |
769 expect(variable.isConst, isFalse); | |
770 expect(variable.isDeprecated, isFalse); | |
771 expect(variable.isFinal, isFalse); | |
772 expect(variable.isOverride, isFalse); | |
773 expect(variable.isPrivate, isFalse); | |
774 expect(variable.isPublic, isTrue); | |
775 expect(variable.isSynthetic, isFalse); | |
776 expect(variable.name, 'i'); | |
777 } | |
778 | |
779 void test_visitDefaultFormalParameter_noType() { | |
780 // p = 0 | |
781 ElementHolder holder = new ElementHolder(); | |
782 ElementBuilder builder = _makeBuilder(holder); | |
783 String parameterName = 'p'; | |
784 DefaultFormalParameter formalParameter = | |
785 AstFactory.positionalFormalParameter( | |
786 AstFactory.simpleFormalParameter3(parameterName), | |
787 AstFactory.integer(0)); | |
788 formalParameter.beginToken.offset = 50; | |
789 formalParameter.endToken.offset = 80; | |
790 formalParameter.accept(builder); | |
791 | |
792 List<ParameterElement> parameters = holder.parameters; | |
793 expect(parameters, hasLength(1)); | |
794 ParameterElement parameter = parameters[0]; | |
795 _assertHasCodeRange(parameter, 50, 31); | |
796 expect(parameter.hasImplicitType, isTrue); | |
797 expect(parameter.initializer, isNotNull); | |
798 expect(parameter.initializer.type, isNotNull); | |
799 expect(parameter.initializer.hasImplicitReturnType, isTrue); | |
800 expect(parameter.isConst, isFalse); | |
801 expect(parameter.isDeprecated, isFalse); | |
802 expect(parameter.isFinal, isFalse); | |
803 expect(parameter.isInitializingFormal, isFalse); | |
804 expect(parameter.isOverride, isFalse); | |
805 expect(parameter.isPrivate, isFalse); | |
806 expect(parameter.isPublic, isTrue); | |
807 expect(parameter.isSynthetic, isFalse); | |
808 expect(parameter.name, parameterName); | |
809 } | |
810 | |
811 void test_visitDefaultFormalParameter_type() { | |
812 // E p = 0 | |
813 ElementHolder holder = new ElementHolder(); | |
814 ElementBuilder builder = _makeBuilder(holder); | |
815 String parameterName = 'p'; | |
816 DefaultFormalParameter formalParameter = AstFactory.namedFormalParameter( | |
817 AstFactory.simpleFormalParameter4( | |
818 AstFactory.typeName4('E'), parameterName), | |
819 AstFactory.integer(0)); | |
820 formalParameter.accept(builder); | |
821 | |
822 List<ParameterElement> parameters = holder.parameters; | |
823 expect(parameters, hasLength(1)); | |
824 ParameterElement parameter = parameters[0]; | |
825 expect(parameter.hasImplicitType, isFalse); | |
826 expect(parameter.initializer, isNotNull); | |
827 expect(parameter.initializer.type, isNotNull); | |
828 expect(parameter.initializer.hasImplicitReturnType, isTrue); | |
829 expect(parameter.isConst, isFalse); | |
830 expect(parameter.isDeprecated, isFalse); | |
831 expect(parameter.isFinal, isFalse); | |
832 expect(parameter.isInitializingFormal, isFalse); | |
833 expect(parameter.isOverride, isFalse); | |
834 expect(parameter.isPrivate, isFalse); | |
835 expect(parameter.isPublic, isTrue); | |
836 expect(parameter.isSynthetic, isFalse); | |
837 expect(parameter.name, parameterName); | |
838 } | |
839 | |
840 void test_visitEnumDeclaration() { | 1455 void test_visitEnumDeclaration() { |
841 ElementHolder holder = new ElementHolder(); | |
842 ElementBuilder builder = _makeBuilder(holder); | |
843 String enumName = "E"; | 1456 String enumName = "E"; |
844 EnumDeclaration enumDeclaration = | 1457 EnumDeclaration enumDeclaration = |
845 AstFactory.enumDeclaration2(enumName, ["ONE"]); | 1458 AstFactory.enumDeclaration2(enumName, ["ONE"]); |
846 enumDeclaration.documentationComment = AstFactory.documentationComment( | 1459 enumDeclaration.documentationComment = AstFactory.documentationComment( |
847 [TokenFactory.tokenFromString('/// aaa')..offset = 50], []); | 1460 [TokenFactory.tokenFromString('/// aaa')..offset = 50], []); |
848 enumDeclaration.endToken.offset = 80; | 1461 enumDeclaration.endToken.offset = 80; |
849 enumDeclaration.accept(builder); | 1462 ElementHolder holder = buildElementsForAst(enumDeclaration); |
850 List<ClassElement> enums = holder.enums; | 1463 List<ClassElement> enums = holder.enums; |
851 expect(enums, hasLength(1)); | 1464 expect(enums, hasLength(1)); |
852 ClassElement enumElement = enums[0]; | 1465 ClassElement enumElement = enums[0]; |
853 expect(enumElement, isNotNull); | 1466 expect(enumElement, isNotNull); |
854 _assertHasCodeRange(enumElement, 50, 31); | 1467 assertHasCodeRange(enumElement, 50, 31); |
855 expect(enumElement.documentationComment, '/// aaa'); | 1468 expect(enumElement.documentationComment, '/// aaa'); |
856 expect(enumElement.name, enumName); | 1469 expect(enumElement.name, enumName); |
857 } | 1470 } |
858 | 1471 |
859 void test_visitFieldDeclaration() { | 1472 void test_visitFieldDeclaration() { |
860 ElementHolder holder = new ElementHolder(); | |
861 ElementBuilder builder = _makeBuilder(holder); | |
862 String firstFieldName = "x"; | 1473 String firstFieldName = "x"; |
863 String secondFieldName = "y"; | 1474 String secondFieldName = "y"; |
864 FieldDeclaration fieldDeclaration = | 1475 FieldDeclaration fieldDeclaration = |
865 AstFactory.fieldDeclaration2(false, null, [ | 1476 AstFactory.fieldDeclaration2(false, null, [ |
866 AstFactory.variableDeclaration(firstFieldName), | 1477 AstFactory.variableDeclaration(firstFieldName), |
867 AstFactory.variableDeclaration(secondFieldName) | 1478 AstFactory.variableDeclaration(secondFieldName) |
868 ]); | 1479 ]); |
869 fieldDeclaration.documentationComment = AstFactory.documentationComment( | 1480 fieldDeclaration.documentationComment = AstFactory.documentationComment( |
870 [TokenFactory.tokenFromString('/// aaa')..offset = 50], []); | 1481 [TokenFactory.tokenFromString('/// aaa')..offset = 50], []); |
871 fieldDeclaration.endToken.offset = 110; | 1482 fieldDeclaration.endToken.offset = 110; |
872 fieldDeclaration.accept(builder); | |
873 | 1483 |
| 1484 ElementHolder holder = buildElementsForAst(fieldDeclaration); |
874 List<FieldElement> fields = holder.fields; | 1485 List<FieldElement> fields = holder.fields; |
875 expect(fields, hasLength(2)); | 1486 expect(fields, hasLength(2)); |
876 | 1487 |
877 FieldElement firstField = fields[0]; | 1488 FieldElement firstField = fields[0]; |
878 expect(firstField, isNotNull); | 1489 expect(firstField, isNotNull); |
879 _assertHasCodeRange(firstField, 50, 61); | 1490 assertHasCodeRange(firstField, 50, 61); |
880 expect(firstField.documentationComment, '/// aaa'); | 1491 expect(firstField.documentationComment, '/// aaa'); |
881 expect(firstField.name, firstFieldName); | 1492 expect(firstField.name, firstFieldName); |
882 expect(firstField.initializer, isNull); | 1493 expect(firstField.initializer, isNull); |
883 expect(firstField.isConst, isFalse); | 1494 expect(firstField.isConst, isFalse); |
884 expect(firstField.isFinal, isFalse); | 1495 expect(firstField.isFinal, isFalse); |
885 expect(firstField.isSynthetic, isFalse); | 1496 expect(firstField.isSynthetic, isFalse); |
886 | 1497 |
887 FieldElement secondField = fields[1]; | 1498 FieldElement secondField = fields[1]; |
888 expect(secondField, isNotNull); | 1499 expect(secondField, isNotNull); |
889 _assertHasCodeRange(secondField, 50, 61); | 1500 assertHasCodeRange(secondField, 50, 61); |
890 expect(secondField.documentationComment, '/// aaa'); | 1501 expect(secondField.documentationComment, '/// aaa'); |
891 expect(secondField.name, secondFieldName); | 1502 expect(secondField.name, secondFieldName); |
892 expect(secondField.initializer, isNull); | 1503 expect(secondField.initializer, isNull); |
893 expect(secondField.isConst, isFalse); | 1504 expect(secondField.isConst, isFalse); |
894 expect(secondField.isFinal, isFalse); | 1505 expect(secondField.isFinal, isFalse); |
895 expect(secondField.isSynthetic, isFalse); | 1506 expect(secondField.isSynthetic, isFalse); |
896 } | 1507 } |
897 | 1508 |
898 void test_visitFieldFormalParameter() { | 1509 void test_visitFieldFormalParameter() { |
899 ElementHolder holder = new ElementHolder(); | |
900 ElementBuilder builder = _makeBuilder(holder); | |
901 String parameterName = "p"; | 1510 String parameterName = "p"; |
902 FieldFormalParameter formalParameter = | 1511 FieldFormalParameter formalParameter = |
903 AstFactory.fieldFormalParameter(null, null, parameterName); | 1512 AstFactory.fieldFormalParameter(null, null, parameterName); |
904 formalParameter.beginToken.offset = 50; | 1513 formalParameter.beginToken.offset = 50; |
905 formalParameter.endToken.offset = 80; | 1514 formalParameter.endToken.offset = 80; |
906 formalParameter.accept(builder); | 1515 ElementHolder holder = buildElementsForAst(formalParameter); |
907 List<ParameterElement> parameters = holder.parameters; | 1516 List<ParameterElement> parameters = holder.parameters; |
908 expect(parameters, hasLength(1)); | 1517 expect(parameters, hasLength(1)); |
909 ParameterElement parameter = parameters[0]; | 1518 ParameterElement parameter = parameters[0]; |
910 expect(parameter, isNotNull); | 1519 expect(parameter, isNotNull); |
911 _assertHasCodeRange(parameter, 50, 31); | 1520 assertHasCodeRange(parameter, 50, 31); |
912 expect(parameter.name, parameterName); | 1521 expect(parameter.name, parameterName); |
913 expect(parameter.initializer, isNull); | 1522 expect(parameter.initializer, isNull); |
914 expect(parameter.isConst, isFalse); | 1523 expect(parameter.isConst, isFalse); |
915 expect(parameter.isFinal, isFalse); | 1524 expect(parameter.isFinal, isFalse); |
916 expect(parameter.isSynthetic, isFalse); | 1525 expect(parameter.isSynthetic, isFalse); |
917 expect(parameter.parameterKind, ParameterKind.REQUIRED); | 1526 expect(parameter.parameterKind, ParameterKind.REQUIRED); |
918 expect(parameter.parameters, hasLength(0)); | 1527 expect(parameter.parameters, hasLength(0)); |
919 } | 1528 } |
920 | 1529 |
921 void test_visitFieldFormalParameter_functionTyped() { | 1530 void test_visitFieldFormalParameter_functionTyped() { |
922 ElementHolder holder = new ElementHolder(); | |
923 ElementBuilder builder = _makeBuilder(holder); | |
924 String parameterName = "p"; | 1531 String parameterName = "p"; |
925 FieldFormalParameter formalParameter = AstFactory.fieldFormalParameter( | 1532 FieldFormalParameter formalParameter = AstFactory.fieldFormalParameter( |
926 null, | 1533 null, |
927 null, | 1534 null, |
928 parameterName, | 1535 parameterName, |
929 AstFactory | 1536 AstFactory |
930 .formalParameterList([AstFactory.simpleFormalParameter3("a")])); | 1537 .formalParameterList([AstFactory.simpleFormalParameter3("a")])); |
931 formalParameter.accept(builder); | 1538 ElementHolder holder = buildElementsForAst(formalParameter); |
932 List<ParameterElement> parameters = holder.parameters; | 1539 List<ParameterElement> parameters = holder.parameters; |
933 expect(parameters, hasLength(1)); | 1540 expect(parameters, hasLength(1)); |
934 ParameterElement parameter = parameters[0]; | 1541 ParameterElement parameter = parameters[0]; |
935 expect(parameter, isNotNull); | 1542 expect(parameter, isNotNull); |
936 expect(parameter.name, parameterName); | 1543 expect(parameter.name, parameterName); |
937 expect(parameter.initializer, isNull); | 1544 expect(parameter.initializer, isNull); |
938 expect(parameter.isConst, isFalse); | 1545 expect(parameter.isConst, isFalse); |
939 expect(parameter.isFinal, isFalse); | 1546 expect(parameter.isFinal, isFalse); |
940 expect(parameter.isSynthetic, isFalse); | 1547 expect(parameter.isSynthetic, isFalse); |
941 expect(parameter.parameterKind, ParameterKind.REQUIRED); | 1548 expect(parameter.parameterKind, ParameterKind.REQUIRED); |
942 expect(parameter.parameters, hasLength(1)); | 1549 expect(parameter.parameters, hasLength(1)); |
943 } | 1550 } |
944 | 1551 |
945 void test_visitFormalParameterList() { | 1552 void test_visitFormalParameterList() { |
946 ElementHolder holder = new ElementHolder(); | |
947 ElementBuilder builder = _makeBuilder(holder); | |
948 String firstParameterName = "a"; | 1553 String firstParameterName = "a"; |
949 String secondParameterName = "b"; | 1554 String secondParameterName = "b"; |
950 FormalParameterList parameterList = AstFactory.formalParameterList([ | 1555 FormalParameterList parameterList = AstFactory.formalParameterList([ |
951 AstFactory.simpleFormalParameter3(firstParameterName), | 1556 AstFactory.simpleFormalParameter3(firstParameterName), |
952 AstFactory.simpleFormalParameter3(secondParameterName) | 1557 AstFactory.simpleFormalParameter3(secondParameterName) |
953 ]); | 1558 ]); |
954 parameterList.accept(builder); | 1559 ElementHolder holder = buildElementsForAst(parameterList); |
955 List<ParameterElement> parameters = holder.parameters; | 1560 List<ParameterElement> parameters = holder.parameters; |
956 expect(parameters, hasLength(2)); | 1561 expect(parameters, hasLength(2)); |
957 expect(parameters[0].name, firstParameterName); | 1562 expect(parameters[0].name, firstParameterName); |
958 expect(parameters[1].name, secondParameterName); | 1563 expect(parameters[1].name, secondParameterName); |
959 } | 1564 } |
960 | 1565 |
961 void test_visitFunctionDeclaration_external() { | 1566 void test_visitFunctionDeclaration_external() { |
962 // external f(); | 1567 // external f(); |
963 ElementHolder holder = new ElementHolder(); | |
964 ElementBuilder builder = _makeBuilder(holder); | |
965 String functionName = "f"; | 1568 String functionName = "f"; |
966 FunctionDeclaration declaration = AstFactory.functionDeclaration( | 1569 FunctionDeclaration declaration = AstFactory.functionDeclaration( |
967 null, | 1570 null, |
968 null, | 1571 null, |
969 functionName, | 1572 functionName, |
970 AstFactory.functionExpression2( | 1573 AstFactory.functionExpression2( |
971 AstFactory.formalParameterList(), AstFactory.emptyFunctionBody())); | 1574 AstFactory.formalParameterList(), AstFactory.emptyFunctionBody())); |
972 declaration.externalKeyword = | 1575 declaration.externalKeyword = |
973 TokenFactory.tokenFromKeyword(Keyword.EXTERNAL); | 1576 TokenFactory.tokenFromKeyword(Keyword.EXTERNAL); |
974 declaration.accept(builder); | |
975 | 1577 |
| 1578 ElementHolder holder = buildElementsForAst(declaration); |
976 List<FunctionElement> functions = holder.functions; | 1579 List<FunctionElement> functions = holder.functions; |
977 expect(functions, hasLength(1)); | 1580 expect(functions, hasLength(1)); |
978 FunctionElement function = functions[0]; | 1581 FunctionElement function = functions[0]; |
979 expect(function, isNotNull); | 1582 expect(function, isNotNull); |
980 expect(function.name, functionName); | 1583 expect(function.name, functionName); |
981 expect(declaration.element, same(function)); | 1584 expect(declaration.element, same(function)); |
982 expect(declaration.functionExpression.element, same(function)); | 1585 expect(declaration.functionExpression.element, same(function)); |
983 expect(function.hasImplicitReturnType, isTrue); | 1586 expect(function.hasImplicitReturnType, isTrue); |
984 expect(function.isExternal, isTrue); | 1587 expect(function.isExternal, isTrue); |
985 expect(function.isSynthetic, isFalse); | 1588 expect(function.isSynthetic, isFalse); |
986 expect(function.typeParameters, hasLength(0)); | 1589 expect(function.typeParameters, hasLength(0)); |
987 } | 1590 } |
988 | 1591 |
989 void test_visitFunctionDeclaration_getter() { | 1592 void test_visitFunctionDeclaration_getter() { |
990 // get f() {} | 1593 // get f() {} |
991 ElementHolder holder = new ElementHolder(); | |
992 ElementBuilder builder = _makeBuilder(holder); | |
993 String functionName = "f"; | 1594 String functionName = "f"; |
994 FunctionDeclaration declaration = AstFactory.functionDeclaration( | 1595 FunctionDeclaration declaration = AstFactory.functionDeclaration( |
995 null, | 1596 null, |
996 Keyword.GET, | 1597 Keyword.GET, |
997 functionName, | 1598 functionName, |
998 AstFactory.functionExpression2( | 1599 AstFactory.functionExpression2( |
999 AstFactory.formalParameterList(), AstFactory.blockFunctionBody2())); | 1600 AstFactory.formalParameterList(), AstFactory.blockFunctionBody2())); |
1000 declaration.documentationComment = AstFactory.documentationComment( | 1601 declaration.documentationComment = AstFactory.documentationComment( |
1001 [TokenFactory.tokenFromString('/// aaa')..offset = 50], []); | 1602 [TokenFactory.tokenFromString('/// aaa')..offset = 50], []); |
1002 declaration.endToken.offset = 80; | 1603 declaration.endToken.offset = 80; |
1003 declaration.accept(builder); | |
1004 | 1604 |
| 1605 ElementHolder holder = buildElementsForAst(declaration); |
1005 List<PropertyAccessorElement> accessors = holder.accessors; | 1606 List<PropertyAccessorElement> accessors = holder.accessors; |
1006 expect(accessors, hasLength(1)); | 1607 expect(accessors, hasLength(1)); |
1007 PropertyAccessorElement accessor = accessors[0]; | 1608 PropertyAccessorElement accessor = accessors[0]; |
1008 expect(accessor, isNotNull); | 1609 expect(accessor, isNotNull); |
1009 _assertHasCodeRange(accessor, 50, 31); | 1610 assertHasCodeRange(accessor, 50, 31); |
1010 expect(accessor.documentationComment, '/// aaa'); | 1611 expect(accessor.documentationComment, '/// aaa'); |
1011 expect(accessor.name, functionName); | 1612 expect(accessor.name, functionName); |
1012 expect(declaration.element, same(accessor)); | 1613 expect(declaration.element, same(accessor)); |
1013 expect(declaration.functionExpression.element, same(accessor)); | 1614 expect(declaration.functionExpression.element, same(accessor)); |
1014 expect(accessor.hasImplicitReturnType, isTrue); | 1615 expect(accessor.hasImplicitReturnType, isTrue); |
1015 expect(accessor.isGetter, isTrue); | 1616 expect(accessor.isGetter, isTrue); |
1016 expect(accessor.isExternal, isFalse); | 1617 expect(accessor.isExternal, isFalse); |
1017 expect(accessor.isSetter, isFalse); | 1618 expect(accessor.isSetter, isFalse); |
1018 expect(accessor.isSynthetic, isFalse); | 1619 expect(accessor.isSynthetic, isFalse); |
1019 expect(accessor.typeParameters, hasLength(0)); | 1620 expect(accessor.typeParameters, hasLength(0)); |
1020 PropertyInducingElement variable = accessor.variable; | 1621 PropertyInducingElement variable = accessor.variable; |
1021 EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableElement, | 1622 EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableElement, |
1022 TopLevelVariableElement, variable); | 1623 TopLevelVariableElement, variable); |
1023 expect(variable.isSynthetic, isTrue); | 1624 expect(variable.isSynthetic, isTrue); |
1024 } | 1625 } |
1025 | 1626 |
1026 void test_visitFunctionDeclaration_plain() { | 1627 void test_visitFunctionDeclaration_plain() { |
1027 // T f() {} | 1628 // T f() {} |
1028 ElementHolder holder = new ElementHolder(); | |
1029 ElementBuilder builder = _makeBuilder(holder); | |
1030 String functionName = "f"; | 1629 String functionName = "f"; |
1031 FunctionDeclaration declaration = AstFactory.functionDeclaration( | 1630 FunctionDeclaration declaration = AstFactory.functionDeclaration( |
1032 AstFactory.typeName4('T'), | 1631 AstFactory.typeName4('T'), |
1033 null, | 1632 null, |
1034 functionName, | 1633 functionName, |
1035 AstFactory.functionExpression2( | 1634 AstFactory.functionExpression2( |
1036 AstFactory.formalParameterList(), AstFactory.blockFunctionBody2())); | 1635 AstFactory.formalParameterList(), AstFactory.blockFunctionBody2())); |
1037 declaration.documentationComment = AstFactory.documentationComment( | 1636 declaration.documentationComment = AstFactory.documentationComment( |
1038 [TokenFactory.tokenFromString('/// aaa')..offset = 50], []); | 1637 [TokenFactory.tokenFromString('/// aaa')..offset = 50], []); |
1039 declaration.endToken.offset = 80; | 1638 declaration.endToken.offset = 80; |
1040 declaration.accept(builder); | |
1041 | 1639 |
| 1640 ElementHolder holder = buildElementsForAst(declaration); |
1042 List<FunctionElement> functions = holder.functions; | 1641 List<FunctionElement> functions = holder.functions; |
1043 expect(functions, hasLength(1)); | 1642 expect(functions, hasLength(1)); |
1044 FunctionElement function = functions[0]; | 1643 FunctionElement function = functions[0]; |
1045 expect(function, isNotNull); | 1644 expect(function, isNotNull); |
1046 _assertHasCodeRange(function, 50, 31); | 1645 assertHasCodeRange(function, 50, 31); |
1047 expect(function.documentationComment, '/// aaa'); | 1646 expect(function.documentationComment, '/// aaa'); |
1048 expect(function.hasImplicitReturnType, isFalse); | 1647 expect(function.hasImplicitReturnType, isFalse); |
1049 expect(function.name, functionName); | 1648 expect(function.name, functionName); |
1050 expect(declaration.element, same(function)); | 1649 expect(declaration.element, same(function)); |
1051 expect(declaration.functionExpression.element, same(function)); | 1650 expect(declaration.functionExpression.element, same(function)); |
1052 expect(function.isExternal, isFalse); | 1651 expect(function.isExternal, isFalse); |
1053 expect(function.isSynthetic, isFalse); | 1652 expect(function.isSynthetic, isFalse); |
1054 expect(function.typeParameters, hasLength(0)); | 1653 expect(function.typeParameters, hasLength(0)); |
1055 } | 1654 } |
1056 | 1655 |
1057 void test_visitFunctionDeclaration_setter() { | 1656 void test_visitFunctionDeclaration_setter() { |
1058 // set f() {} | 1657 // set f() {} |
1059 ElementHolder holder = new ElementHolder(); | |
1060 ElementBuilder builder = _makeBuilder(holder); | |
1061 String functionName = "f"; | 1658 String functionName = "f"; |
1062 FunctionDeclaration declaration = AstFactory.functionDeclaration( | 1659 FunctionDeclaration declaration = AstFactory.functionDeclaration( |
1063 null, | 1660 null, |
1064 Keyword.SET, | 1661 Keyword.SET, |
1065 functionName, | 1662 functionName, |
1066 AstFactory.functionExpression2( | 1663 AstFactory.functionExpression2( |
1067 AstFactory.formalParameterList(), AstFactory.blockFunctionBody2())); | 1664 AstFactory.formalParameterList(), AstFactory.blockFunctionBody2())); |
1068 declaration.documentationComment = AstFactory.documentationComment( | 1665 declaration.documentationComment = AstFactory.documentationComment( |
1069 [TokenFactory.tokenFromString('/// aaa')..offset = 50], []); | 1666 [TokenFactory.tokenFromString('/// aaa')..offset = 50], []); |
1070 declaration.endToken.offset = 80; | 1667 declaration.endToken.offset = 80; |
1071 declaration.accept(builder); | |
1072 | 1668 |
| 1669 ElementHolder holder = buildElementsForAst(declaration); |
1073 List<PropertyAccessorElement> accessors = holder.accessors; | 1670 List<PropertyAccessorElement> accessors = holder.accessors; |
1074 expect(accessors, hasLength(1)); | 1671 expect(accessors, hasLength(1)); |
1075 PropertyAccessorElement accessor = accessors[0]; | 1672 PropertyAccessorElement accessor = accessors[0]; |
1076 expect(accessor, isNotNull); | 1673 expect(accessor, isNotNull); |
1077 _assertHasCodeRange(accessor, 50, 31); | 1674 assertHasCodeRange(accessor, 50, 31); |
1078 expect(accessor.documentationComment, '/// aaa'); | 1675 expect(accessor.documentationComment, '/// aaa'); |
1079 expect(accessor.hasImplicitReturnType, isTrue); | 1676 expect(accessor.hasImplicitReturnType, isTrue); |
1080 expect(accessor.name, "$functionName="); | 1677 expect(accessor.name, "$functionName="); |
1081 expect(declaration.element, same(accessor)); | 1678 expect(declaration.element, same(accessor)); |
1082 expect(declaration.functionExpression.element, same(accessor)); | 1679 expect(declaration.functionExpression.element, same(accessor)); |
1083 expect(accessor.isGetter, isFalse); | 1680 expect(accessor.isGetter, isFalse); |
1084 expect(accessor.isExternal, isFalse); | 1681 expect(accessor.isExternal, isFalse); |
1085 expect(accessor.isSetter, isTrue); | 1682 expect(accessor.isSetter, isTrue); |
1086 expect(accessor.isSynthetic, isFalse); | 1683 expect(accessor.isSynthetic, isFalse); |
1087 expect(accessor.typeParameters, hasLength(0)); | 1684 expect(accessor.typeParameters, hasLength(0)); |
1088 PropertyInducingElement variable = accessor.variable; | 1685 PropertyInducingElement variable = accessor.variable; |
1089 EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableElement, | 1686 EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableElement, |
1090 TopLevelVariableElement, variable); | 1687 TopLevelVariableElement, variable); |
1091 expect(variable.isSynthetic, isTrue); | 1688 expect(variable.isSynthetic, isTrue); |
1092 } | 1689 } |
1093 | 1690 |
1094 void test_visitFunctionDeclaration_typeParameters() { | 1691 void test_visitFunctionDeclaration_typeParameters() { |
1095 // f<E>() {} | 1692 // f<E>() {} |
1096 ElementHolder holder = new ElementHolder(); | |
1097 ElementBuilder builder = _makeBuilder(holder); | |
1098 String functionName = 'f'; | 1693 String functionName = 'f'; |
1099 String typeParameterName = 'E'; | 1694 String typeParameterName = 'E'; |
1100 FunctionExpression expression = AstFactory.functionExpression3( | 1695 FunctionExpression expression = AstFactory.functionExpression3( |
1101 AstFactory.typeParameterList([typeParameterName]), | 1696 AstFactory.typeParameterList([typeParameterName]), |
1102 AstFactory.formalParameterList(), | 1697 AstFactory.formalParameterList(), |
1103 AstFactory.blockFunctionBody2()); | 1698 AstFactory.blockFunctionBody2()); |
1104 FunctionDeclaration declaration = | 1699 FunctionDeclaration declaration = |
1105 AstFactory.functionDeclaration(null, null, functionName, expression); | 1700 AstFactory.functionDeclaration(null, null, functionName, expression); |
1106 declaration.accept(builder); | |
1107 | 1701 |
| 1702 ElementHolder holder = buildElementsForAst(declaration); |
1108 List<FunctionElement> functions = holder.functions; | 1703 List<FunctionElement> functions = holder.functions; |
1109 expect(functions, hasLength(1)); | 1704 expect(functions, hasLength(1)); |
1110 FunctionElement function = functions[0]; | 1705 FunctionElement function = functions[0]; |
1111 expect(function, isNotNull); | 1706 expect(function, isNotNull); |
1112 expect(function.hasImplicitReturnType, isTrue); | 1707 expect(function.hasImplicitReturnType, isTrue); |
1113 expect(function.name, functionName); | 1708 expect(function.name, functionName); |
1114 expect(function.isExternal, isFalse); | 1709 expect(function.isExternal, isFalse); |
1115 expect(function.isSynthetic, isFalse); | 1710 expect(function.isSynthetic, isFalse); |
1116 expect(declaration.element, same(function)); | 1711 expect(declaration.element, same(function)); |
1117 expect(expression.element, same(function)); | 1712 expect(expression.element, same(function)); |
1118 List<TypeParameterElement> typeParameters = function.typeParameters; | 1713 List<TypeParameterElement> typeParameters = function.typeParameters; |
1119 expect(typeParameters, hasLength(1)); | 1714 expect(typeParameters, hasLength(1)); |
1120 TypeParameterElement typeParameter = typeParameters[0]; | 1715 TypeParameterElement typeParameter = typeParameters[0]; |
1121 expect(typeParameter, isNotNull); | 1716 expect(typeParameter, isNotNull); |
1122 expect(typeParameter.name, typeParameterName); | 1717 expect(typeParameter.name, typeParameterName); |
1123 } | 1718 } |
1124 | 1719 |
1125 void test_visitFunctionExpression() { | |
1126 ElementHolder holder = new ElementHolder(); | |
1127 ElementBuilder builder = _makeBuilder(holder); | |
1128 FunctionExpression expression = AstFactory.functionExpression2( | |
1129 AstFactory.formalParameterList(), AstFactory.blockFunctionBody2()); | |
1130 expression.accept(builder); | |
1131 List<FunctionElement> functions = holder.functions; | |
1132 expect(functions, hasLength(1)); | |
1133 FunctionElement function = functions[0]; | |
1134 expect(function, isNotNull); | |
1135 expect(expression.element, same(function)); | |
1136 expect(function.hasImplicitReturnType, isTrue); | |
1137 expect(function.isSynthetic, isFalse); | |
1138 expect(function.typeParameters, hasLength(0)); | |
1139 } | |
1140 | |
1141 void test_visitFunctionExpression_inBlockBody() { | |
1142 List<FunctionElement> functions = | |
1143 buildElementsForText('f() { return () => 42; }').functions[0].functions; | |
1144 expect(functions, hasLength(1)); | |
1145 FunctionElement function = functions[0]; | |
1146 expect(function, isNotNull); | |
1147 expect(function.hasImplicitReturnType, isTrue); | |
1148 expect(function.isSynthetic, isFalse); | |
1149 expect(function.typeParameters, hasLength(0)); | |
1150 } | |
1151 | |
1152 void test_visitFunctionExpression_inExpressionBody() { | |
1153 List<FunctionElement> functions = | |
1154 buildElementsForText('f() => () => 42;').functions[0].functions; | |
1155 expect(functions, hasLength(1)); | |
1156 FunctionElement function = functions[0]; | |
1157 expect(function, isNotNull); | |
1158 expect(function.hasImplicitReturnType, isTrue); | |
1159 expect(function.isSynthetic, isFalse); | |
1160 expect(function.typeParameters, hasLength(0)); | |
1161 } | |
1162 | |
1163 void test_visitFunctionTypeAlias() { | |
1164 ElementHolder holder = new ElementHolder(); | |
1165 ElementBuilder builder = _makeBuilder(holder); | |
1166 String aliasName = "F"; | |
1167 String parameterName = "E"; | |
1168 FunctionTypeAlias aliasNode = AstFactory.typeAlias( | |
1169 null, aliasName, AstFactory.typeParameterList([parameterName]), null); | |
1170 aliasNode.documentationComment = AstFactory.documentationComment( | |
1171 [TokenFactory.tokenFromString('/// aaa')..offset = 50], []); | |
1172 aliasNode.endToken.offset = 80; | |
1173 aliasNode.accept(builder); | |
1174 | |
1175 List<FunctionTypeAliasElement> aliases = holder.typeAliases; | |
1176 expect(aliases, hasLength(1)); | |
1177 FunctionTypeAliasElement alias = aliases[0]; | |
1178 expect(alias, isNotNull); | |
1179 _assertHasCodeRange(alias, 50, 31); | |
1180 expect(alias.documentationComment, '/// aaa'); | |
1181 expect(alias.name, aliasName); | |
1182 expect(alias.parameters, hasLength(0)); | |
1183 List<TypeParameterElement> typeParameters = alias.typeParameters; | |
1184 expect(typeParameters, hasLength(1)); | |
1185 TypeParameterElement typeParameter = typeParameters[0]; | |
1186 expect(typeParameter, isNotNull); | |
1187 expect(typeParameter.name, parameterName); | |
1188 } | |
1189 | |
1190 void test_visitFunctionTypedFormalParameter() { | |
1191 ElementHolder holder = new ElementHolder(); | |
1192 ElementBuilder builder = _makeBuilder(holder); | |
1193 String parameterName = "p"; | |
1194 FunctionTypedFormalParameter formalParameter = | |
1195 AstFactory.functionTypedFormalParameter(null, parameterName); | |
1196 _useParameterInMethod(formalParameter, 100, 110); | |
1197 formalParameter.accept(builder); | |
1198 List<ParameterElement> parameters = holder.parameters; | |
1199 expect(parameters, hasLength(1)); | |
1200 ParameterElement parameter = parameters[0]; | |
1201 expect(parameter, isNotNull); | |
1202 expect(parameter.name, parameterName); | |
1203 expect(parameter.initializer, isNull); | |
1204 expect(parameter.isConst, isFalse); | |
1205 expect(parameter.isFinal, isFalse); | |
1206 expect(parameter.isSynthetic, isFalse); | |
1207 expect(parameter.parameterKind, ParameterKind.REQUIRED); | |
1208 _assertVisibleRange(parameter, 100, 110); | |
1209 } | |
1210 | |
1211 void test_visitFunctionTypedFormalParameter_withTypeParameters() { | |
1212 ElementHolder holder = new ElementHolder(); | |
1213 ElementBuilder builder = _makeBuilder(holder); | |
1214 String parameterName = "p"; | |
1215 FunctionTypedFormalParameter formalParameter = | |
1216 AstFactory.functionTypedFormalParameter(null, parameterName); | |
1217 formalParameter.typeParameters = AstFactory.typeParameterList(['F']); | |
1218 _useParameterInMethod(formalParameter, 100, 110); | |
1219 formalParameter.accept(builder); | |
1220 List<ParameterElement> parameters = holder.parameters; | |
1221 expect(parameters, hasLength(1)); | |
1222 ParameterElement parameter = parameters[0]; | |
1223 expect(parameter, isNotNull); | |
1224 expect(parameter.name, parameterName); | |
1225 expect(parameter.initializer, isNull); | |
1226 expect(parameter.isConst, isFalse); | |
1227 expect(parameter.isFinal, isFalse); | |
1228 expect(parameter.isSynthetic, isFalse); | |
1229 expect(parameter.parameterKind, ParameterKind.REQUIRED); | |
1230 expect(parameter.typeParameters, hasLength(1)); | |
1231 _assertVisibleRange(parameter, 100, 110); | |
1232 } | |
1233 | |
1234 void test_visitLabeledStatement() { | |
1235 List<LabelElement> labels = | |
1236 buildElementsForText('f() { l: print(42); }').functions[0].labels; | |
1237 expect(labels, hasLength(1)); | |
1238 LabelElement label = labels[0]; | |
1239 expect(label, isNotNull); | |
1240 expect(label.name, 'l'); | |
1241 expect(label.isSynthetic, isFalse); | |
1242 } | |
1243 | |
1244 void test_visitMethodDeclaration_abstract() { | 1720 void test_visitMethodDeclaration_abstract() { |
1245 // m(); | 1721 // m(); |
1246 ElementHolder holder = new ElementHolder(); | |
1247 ElementBuilder builder = _makeBuilder(holder); | |
1248 String methodName = "m"; | 1722 String methodName = "m"; |
1249 MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2( | 1723 MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2( |
1250 null, | 1724 null, |
1251 null, | 1725 null, |
1252 null, | 1726 null, |
1253 null, | 1727 null, |
1254 AstFactory.identifier3(methodName), | 1728 AstFactory.identifier3(methodName), |
1255 AstFactory.formalParameterList(), | 1729 AstFactory.formalParameterList(), |
1256 AstFactory.emptyFunctionBody()); | 1730 AstFactory.emptyFunctionBody()); |
1257 methodDeclaration.accept(builder); | |
1258 | 1731 |
| 1732 ElementHolder holder = buildElementsForAst(methodDeclaration); |
1259 List<MethodElement> methods = holder.methods; | 1733 List<MethodElement> methods = holder.methods; |
1260 expect(methods, hasLength(1)); | 1734 expect(methods, hasLength(1)); |
1261 MethodElement method = methods[0]; | 1735 MethodElement method = methods[0]; |
1262 expect(method, isNotNull); | 1736 expect(method, isNotNull); |
1263 expect(method.hasImplicitReturnType, isTrue); | 1737 expect(method.hasImplicitReturnType, isTrue); |
1264 expect(method.name, methodName); | 1738 expect(method.name, methodName); |
1265 expect(method.functions, hasLength(0)); | 1739 expect(method.functions, hasLength(0)); |
1266 expect(method.labels, hasLength(0)); | 1740 expect(method.labels, hasLength(0)); |
1267 expect(method.localVariables, hasLength(0)); | 1741 expect(method.localVariables, hasLength(0)); |
1268 expect(method.parameters, hasLength(0)); | 1742 expect(method.parameters, hasLength(0)); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1305 // class members nodes and their elements | 1779 // class members nodes and their elements |
1306 FieldDeclaration fieldDeclNode = classNode.members[0]; | 1780 FieldDeclaration fieldDeclNode = classNode.members[0]; |
1307 VariableDeclaration fieldNode = fieldDeclNode.fields.variables.single; | 1781 VariableDeclaration fieldNode = fieldDeclNode.fields.variables.single; |
1308 MethodDeclaration getterNode = classNode.members[1]; | 1782 MethodDeclaration getterNode = classNode.members[1]; |
1309 expect(fieldNode.element, notSyntheticFieldElement); | 1783 expect(fieldNode.element, notSyntheticFieldElement); |
1310 expect(getterNode.element, notSyntheticGetterElement); | 1784 expect(getterNode.element, notSyntheticGetterElement); |
1311 } | 1785 } |
1312 | 1786 |
1313 void test_visitMethodDeclaration_external() { | 1787 void test_visitMethodDeclaration_external() { |
1314 // external m(); | 1788 // external m(); |
1315 ElementHolder holder = new ElementHolder(); | |
1316 ElementBuilder builder = _makeBuilder(holder); | |
1317 String methodName = "m"; | 1789 String methodName = "m"; |
1318 MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2( | 1790 MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2( |
1319 null, | 1791 null, |
1320 null, | 1792 null, |
1321 null, | 1793 null, |
1322 null, | 1794 null, |
1323 AstFactory.identifier3(methodName), | 1795 AstFactory.identifier3(methodName), |
1324 AstFactory.formalParameterList(), | 1796 AstFactory.formalParameterList(), |
1325 AstFactory.emptyFunctionBody()); | 1797 AstFactory.emptyFunctionBody()); |
1326 methodDeclaration.externalKeyword = | 1798 methodDeclaration.externalKeyword = |
1327 TokenFactory.tokenFromKeyword(Keyword.EXTERNAL); | 1799 TokenFactory.tokenFromKeyword(Keyword.EXTERNAL); |
1328 methodDeclaration.accept(builder); | |
1329 | 1800 |
| 1801 ElementHolder holder = buildElementsForAst(methodDeclaration); |
1330 List<MethodElement> methods = holder.methods; | 1802 List<MethodElement> methods = holder.methods; |
1331 expect(methods, hasLength(1)); | 1803 expect(methods, hasLength(1)); |
1332 MethodElement method = methods[0]; | 1804 MethodElement method = methods[0]; |
1333 expect(method, isNotNull); | 1805 expect(method, isNotNull); |
1334 expect(method.hasImplicitReturnType, isTrue); | 1806 expect(method.hasImplicitReturnType, isTrue); |
1335 expect(method.name, methodName); | 1807 expect(method.name, methodName); |
1336 expect(method.functions, hasLength(0)); | 1808 expect(method.functions, hasLength(0)); |
1337 expect(method.labels, hasLength(0)); | 1809 expect(method.labels, hasLength(0)); |
1338 expect(method.localVariables, hasLength(0)); | 1810 expect(method.localVariables, hasLength(0)); |
1339 expect(method.parameters, hasLength(0)); | 1811 expect(method.parameters, hasLength(0)); |
1340 expect(method.typeParameters, hasLength(0)); | 1812 expect(method.typeParameters, hasLength(0)); |
1341 expect(method.isAbstract, isFalse); | 1813 expect(method.isAbstract, isFalse); |
1342 expect(method.isExternal, isTrue); | 1814 expect(method.isExternal, isTrue); |
1343 expect(method.isStatic, isFalse); | 1815 expect(method.isStatic, isFalse); |
1344 expect(method.isSynthetic, isFalse); | 1816 expect(method.isSynthetic, isFalse); |
1345 } | 1817 } |
1346 | 1818 |
1347 void test_visitMethodDeclaration_getter() { | 1819 void test_visitMethodDeclaration_getter() { |
1348 // get m() {} | 1820 // get m() {} |
1349 ElementHolder holder = new ElementHolder(); | |
1350 ElementBuilder builder = _makeBuilder(holder); | |
1351 String methodName = "m"; | 1821 String methodName = "m"; |
1352 MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2( | 1822 MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2( |
1353 null, | 1823 null, |
1354 null, | 1824 null, |
1355 Keyword.GET, | 1825 Keyword.GET, |
1356 null, | 1826 null, |
1357 AstFactory.identifier3(methodName), | 1827 AstFactory.identifier3(methodName), |
1358 AstFactory.formalParameterList(), | 1828 AstFactory.formalParameterList(), |
1359 AstFactory.blockFunctionBody2()); | 1829 AstFactory.blockFunctionBody2()); |
1360 methodDeclaration.documentationComment = AstFactory.documentationComment( | 1830 methodDeclaration.documentationComment = AstFactory.documentationComment( |
1361 [TokenFactory.tokenFromString('/// aaa')..offset = 50], []); | 1831 [TokenFactory.tokenFromString('/// aaa')..offset = 50], []); |
1362 methodDeclaration.endToken.offset = 80; | 1832 methodDeclaration.endToken.offset = 80; |
1363 methodDeclaration.accept(builder); | |
1364 | 1833 |
| 1834 ElementHolder holder = buildElementsForAst(methodDeclaration); |
1365 List<FieldElement> fields = holder.fields; | 1835 List<FieldElement> fields = holder.fields; |
1366 expect(fields, hasLength(1)); | 1836 expect(fields, hasLength(1)); |
1367 FieldElement field = fields[0]; | 1837 FieldElement field = fields[0]; |
1368 expect(field, isNotNull); | 1838 expect(field, isNotNull); |
1369 expect(field.name, methodName); | 1839 expect(field.name, methodName); |
1370 expect(field.isSynthetic, isTrue); | 1840 expect(field.isSynthetic, isTrue); |
1371 expect(field.setter, isNull); | 1841 expect(field.setter, isNull); |
1372 PropertyAccessorElement getter = field.getter; | 1842 PropertyAccessorElement getter = field.getter; |
1373 expect(getter, isNotNull); | 1843 expect(getter, isNotNull); |
1374 _assertHasCodeRange(getter, 50, 31); | 1844 assertHasCodeRange(getter, 50, 31); |
1375 expect(getter.documentationComment, '/// aaa'); | 1845 expect(getter.documentationComment, '/// aaa'); |
1376 expect(getter.hasImplicitReturnType, isTrue); | 1846 expect(getter.hasImplicitReturnType, isTrue); |
1377 expect(getter.isAbstract, isFalse); | 1847 expect(getter.isAbstract, isFalse); |
1378 expect(getter.isExternal, isFalse); | 1848 expect(getter.isExternal, isFalse); |
1379 expect(getter.isGetter, isTrue); | 1849 expect(getter.isGetter, isTrue); |
1380 expect(getter.isSynthetic, isFalse); | 1850 expect(getter.isSynthetic, isFalse); |
1381 expect(getter.name, methodName); | 1851 expect(getter.name, methodName); |
1382 expect(getter.variable, field); | 1852 expect(getter.variable, field); |
1383 expect(getter.functions, hasLength(0)); | 1853 expect(getter.functions, hasLength(0)); |
1384 expect(getter.labels, hasLength(0)); | 1854 expect(getter.labels, hasLength(0)); |
1385 expect(getter.localVariables, hasLength(0)); | 1855 expect(getter.localVariables, hasLength(0)); |
1386 expect(getter.parameters, hasLength(0)); | 1856 expect(getter.parameters, hasLength(0)); |
1387 } | 1857 } |
1388 | 1858 |
1389 void test_visitMethodDeclaration_getter_abstract() { | 1859 void test_visitMethodDeclaration_getter_abstract() { |
1390 // get m(); | 1860 // get m(); |
1391 ElementHolder holder = new ElementHolder(); | |
1392 ElementBuilder builder = _makeBuilder(holder); | |
1393 String methodName = "m"; | 1861 String methodName = "m"; |
1394 MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2( | 1862 MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2( |
1395 null, | 1863 null, |
1396 null, | 1864 null, |
1397 Keyword.GET, | 1865 Keyword.GET, |
1398 null, | 1866 null, |
1399 AstFactory.identifier3(methodName), | 1867 AstFactory.identifier3(methodName), |
1400 AstFactory.formalParameterList(), | 1868 AstFactory.formalParameterList(), |
1401 AstFactory.emptyFunctionBody()); | 1869 AstFactory.emptyFunctionBody()); |
1402 methodDeclaration.accept(builder); | |
1403 | 1870 |
| 1871 ElementHolder holder = buildElementsForAst(methodDeclaration); |
1404 List<FieldElement> fields = holder.fields; | 1872 List<FieldElement> fields = holder.fields; |
1405 expect(fields, hasLength(1)); | 1873 expect(fields, hasLength(1)); |
1406 FieldElement field = fields[0]; | 1874 FieldElement field = fields[0]; |
1407 expect(field, isNotNull); | 1875 expect(field, isNotNull); |
1408 expect(field.name, methodName); | 1876 expect(field.name, methodName); |
1409 expect(field.isSynthetic, isTrue); | 1877 expect(field.isSynthetic, isTrue); |
1410 expect(field.setter, isNull); | 1878 expect(field.setter, isNull); |
1411 PropertyAccessorElement getter = field.getter; | 1879 PropertyAccessorElement getter = field.getter; |
1412 expect(getter, isNotNull); | 1880 expect(getter, isNotNull); |
1413 expect(getter.hasImplicitReturnType, isTrue); | 1881 expect(getter.hasImplicitReturnType, isTrue); |
1414 expect(getter.isAbstract, isTrue); | 1882 expect(getter.isAbstract, isTrue); |
1415 expect(getter.isExternal, isFalse); | 1883 expect(getter.isExternal, isFalse); |
1416 expect(getter.isGetter, isTrue); | 1884 expect(getter.isGetter, isTrue); |
1417 expect(getter.isSynthetic, isFalse); | 1885 expect(getter.isSynthetic, isFalse); |
1418 expect(getter.name, methodName); | 1886 expect(getter.name, methodName); |
1419 expect(getter.variable, field); | 1887 expect(getter.variable, field); |
1420 expect(getter.functions, hasLength(0)); | 1888 expect(getter.functions, hasLength(0)); |
1421 expect(getter.labels, hasLength(0)); | 1889 expect(getter.labels, hasLength(0)); |
1422 expect(getter.localVariables, hasLength(0)); | 1890 expect(getter.localVariables, hasLength(0)); |
1423 expect(getter.parameters, hasLength(0)); | 1891 expect(getter.parameters, hasLength(0)); |
1424 } | 1892 } |
1425 | 1893 |
1426 void test_visitMethodDeclaration_getter_external() { | 1894 void test_visitMethodDeclaration_getter_external() { |
1427 // external get m(); | 1895 // external get m(); |
1428 ElementHolder holder = new ElementHolder(); | |
1429 ElementBuilder builder = _makeBuilder(holder); | |
1430 String methodName = "m"; | 1896 String methodName = "m"; |
1431 MethodDeclaration methodDeclaration = AstFactory.methodDeclaration( | 1897 MethodDeclaration methodDeclaration = AstFactory.methodDeclaration( |
1432 null, | 1898 null, |
1433 null, | 1899 null, |
1434 Keyword.GET, | 1900 Keyword.GET, |
1435 null, | 1901 null, |
1436 AstFactory.identifier3(methodName), | 1902 AstFactory.identifier3(methodName), |
1437 AstFactory.formalParameterList()); | 1903 AstFactory.formalParameterList()); |
1438 methodDeclaration.externalKeyword = | 1904 methodDeclaration.externalKeyword = |
1439 TokenFactory.tokenFromKeyword(Keyword.EXTERNAL); | 1905 TokenFactory.tokenFromKeyword(Keyword.EXTERNAL); |
1440 methodDeclaration.accept(builder); | |
1441 | 1906 |
| 1907 ElementHolder holder = buildElementsForAst(methodDeclaration); |
1442 List<FieldElement> fields = holder.fields; | 1908 List<FieldElement> fields = holder.fields; |
1443 expect(fields, hasLength(1)); | 1909 expect(fields, hasLength(1)); |
1444 FieldElement field = fields[0]; | 1910 FieldElement field = fields[0]; |
1445 expect(field, isNotNull); | 1911 expect(field, isNotNull); |
1446 expect(field.name, methodName); | 1912 expect(field.name, methodName); |
1447 expect(field.isSynthetic, isTrue); | 1913 expect(field.isSynthetic, isTrue); |
1448 expect(field.setter, isNull); | 1914 expect(field.setter, isNull); |
1449 PropertyAccessorElement getter = field.getter; | 1915 PropertyAccessorElement getter = field.getter; |
1450 expect(getter, isNotNull); | 1916 expect(getter, isNotNull); |
1451 expect(getter.hasImplicitReturnType, isTrue); | 1917 expect(getter.hasImplicitReturnType, isTrue); |
1452 expect(getter.isAbstract, isFalse); | 1918 expect(getter.isAbstract, isFalse); |
1453 expect(getter.isExternal, isTrue); | 1919 expect(getter.isExternal, isTrue); |
1454 expect(getter.isGetter, isTrue); | 1920 expect(getter.isGetter, isTrue); |
1455 expect(getter.isSynthetic, isFalse); | 1921 expect(getter.isSynthetic, isFalse); |
1456 expect(getter.name, methodName); | 1922 expect(getter.name, methodName); |
1457 expect(getter.variable, field); | 1923 expect(getter.variable, field); |
1458 expect(getter.functions, hasLength(0)); | 1924 expect(getter.functions, hasLength(0)); |
1459 expect(getter.labels, hasLength(0)); | 1925 expect(getter.labels, hasLength(0)); |
1460 expect(getter.localVariables, hasLength(0)); | 1926 expect(getter.localVariables, hasLength(0)); |
1461 expect(getter.parameters, hasLength(0)); | 1927 expect(getter.parameters, hasLength(0)); |
1462 } | 1928 } |
1463 | 1929 |
1464 void test_visitMethodDeclaration_minimal() { | 1930 void test_visitMethodDeclaration_minimal() { |
1465 // T m() {} | 1931 // T m() {} |
1466 ElementHolder holder = new ElementHolder(); | |
1467 ElementBuilder builder = _makeBuilder(holder); | |
1468 String methodName = "m"; | 1932 String methodName = "m"; |
1469 MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2( | 1933 MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2( |
1470 null, | 1934 null, |
1471 AstFactory.typeName4('T'), | 1935 AstFactory.typeName4('T'), |
1472 null, | 1936 null, |
1473 null, | 1937 null, |
1474 AstFactory.identifier3(methodName), | 1938 AstFactory.identifier3(methodName), |
1475 AstFactory.formalParameterList(), | 1939 AstFactory.formalParameterList(), |
1476 AstFactory.blockFunctionBody2()); | 1940 AstFactory.blockFunctionBody2()); |
1477 methodDeclaration.documentationComment = AstFactory.documentationComment( | 1941 methodDeclaration.documentationComment = AstFactory.documentationComment( |
1478 [TokenFactory.tokenFromString('/// aaa')..offset = 50], []); | 1942 [TokenFactory.tokenFromString('/// aaa')..offset = 50], []); |
1479 methodDeclaration.endToken.offset = 80; | 1943 methodDeclaration.endToken.offset = 80; |
1480 methodDeclaration.accept(builder); | 1944 |
1481 | 1945 ElementHolder holder = buildElementsForAst(methodDeclaration); |
1482 List<MethodElement> methods = holder.methods; | 1946 List<MethodElement> methods = holder.methods; |
1483 expect(methods, hasLength(1)); | 1947 expect(methods, hasLength(1)); |
1484 MethodElement method = methods[0]; | 1948 MethodElement method = methods[0]; |
1485 expect(method, isNotNull); | 1949 expect(method, isNotNull); |
1486 _assertHasCodeRange(method, 50, 31); | 1950 assertHasCodeRange(method, 50, 31); |
1487 expect(method.documentationComment, '/// aaa'); | 1951 expect(method.documentationComment, '/// aaa'); |
1488 expect(method.hasImplicitReturnType, isFalse); | 1952 expect(method.hasImplicitReturnType, isFalse); |
1489 expect(method.name, methodName); | 1953 expect(method.name, methodName); |
1490 expect(method.functions, hasLength(0)); | 1954 expect(method.functions, hasLength(0)); |
1491 expect(method.labels, hasLength(0)); | 1955 expect(method.labels, hasLength(0)); |
1492 expect(method.localVariables, hasLength(0)); | 1956 expect(method.localVariables, hasLength(0)); |
1493 expect(method.parameters, hasLength(0)); | 1957 expect(method.parameters, hasLength(0)); |
1494 expect(method.typeParameters, hasLength(0)); | 1958 expect(method.typeParameters, hasLength(0)); |
1495 expect(method.isAbstract, isFalse); | 1959 expect(method.isAbstract, isFalse); |
1496 expect(method.isExternal, isFalse); | 1960 expect(method.isExternal, isFalse); |
1497 expect(method.isStatic, isFalse); | 1961 expect(method.isStatic, isFalse); |
1498 expect(method.isSynthetic, isFalse); | 1962 expect(method.isSynthetic, isFalse); |
1499 } | 1963 } |
1500 | 1964 |
1501 void test_visitMethodDeclaration_operator() { | 1965 void test_visitMethodDeclaration_operator() { |
1502 // operator +(addend) {} | 1966 // operator +(addend) {} |
1503 ElementHolder holder = new ElementHolder(); | |
1504 ElementBuilder builder = _makeBuilder(holder); | |
1505 String methodName = "+"; | 1967 String methodName = "+"; |
1506 MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2( | 1968 MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2( |
1507 null, | 1969 null, |
1508 null, | 1970 null, |
1509 null, | 1971 null, |
1510 Keyword.OPERATOR, | 1972 Keyword.OPERATOR, |
1511 AstFactory.identifier3(methodName), | 1973 AstFactory.identifier3(methodName), |
1512 AstFactory | 1974 AstFactory |
1513 .formalParameterList([AstFactory.simpleFormalParameter3("addend")]), | 1975 .formalParameterList([AstFactory.simpleFormalParameter3("addend")]), |
1514 AstFactory.blockFunctionBody2()); | 1976 AstFactory.blockFunctionBody2()); |
1515 methodDeclaration.accept(builder); | 1977 |
1516 | 1978 ElementHolder holder = buildElementsForAst(methodDeclaration); |
1517 List<MethodElement> methods = holder.methods; | 1979 List<MethodElement> methods = holder.methods; |
1518 expect(methods, hasLength(1)); | 1980 expect(methods, hasLength(1)); |
1519 MethodElement method = methods[0]; | 1981 MethodElement method = methods[0]; |
1520 expect(method, isNotNull); | 1982 expect(method, isNotNull); |
1521 expect(method.hasImplicitReturnType, isTrue); | 1983 expect(method.hasImplicitReturnType, isTrue); |
1522 expect(method.name, methodName); | 1984 expect(method.name, methodName); |
1523 expect(method.functions, hasLength(0)); | 1985 expect(method.functions, hasLength(0)); |
1524 expect(method.labels, hasLength(0)); | 1986 expect(method.labels, hasLength(0)); |
1525 expect(method.localVariables, hasLength(0)); | 1987 expect(method.localVariables, hasLength(0)); |
1526 expect(method.parameters, hasLength(1)); | 1988 expect(method.parameters, hasLength(1)); |
1527 expect(method.typeParameters, hasLength(0)); | 1989 expect(method.typeParameters, hasLength(0)); |
1528 expect(method.isAbstract, isFalse); | 1990 expect(method.isAbstract, isFalse); |
1529 expect(method.isExternal, isFalse); | 1991 expect(method.isExternal, isFalse); |
1530 expect(method.isStatic, isFalse); | 1992 expect(method.isStatic, isFalse); |
1531 expect(method.isSynthetic, isFalse); | 1993 expect(method.isSynthetic, isFalse); |
1532 } | 1994 } |
1533 | 1995 |
1534 void test_visitMethodDeclaration_setter() { | 1996 void test_visitMethodDeclaration_setter() { |
1535 // set m() {} | 1997 // set m() {} |
1536 ElementHolder holder = new ElementHolder(); | |
1537 ElementBuilder builder = _makeBuilder(holder); | |
1538 String methodName = "m"; | 1998 String methodName = "m"; |
1539 MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2( | 1999 MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2( |
1540 null, | 2000 null, |
1541 null, | 2001 null, |
1542 Keyword.SET, | 2002 Keyword.SET, |
1543 null, | 2003 null, |
1544 AstFactory.identifier3(methodName), | 2004 AstFactory.identifier3(methodName), |
1545 AstFactory.formalParameterList(), | 2005 AstFactory.formalParameterList(), |
1546 AstFactory.blockFunctionBody2()); | 2006 AstFactory.blockFunctionBody2()); |
1547 methodDeclaration.documentationComment = AstFactory.documentationComment( | 2007 methodDeclaration.documentationComment = AstFactory.documentationComment( |
1548 [TokenFactory.tokenFromString('/// aaa')..offset = 50], []); | 2008 [TokenFactory.tokenFromString('/// aaa')..offset = 50], []); |
1549 methodDeclaration.endToken.offset = 80; | 2009 methodDeclaration.endToken.offset = 80; |
1550 methodDeclaration.accept(builder); | 2010 |
1551 | 2011 ElementHolder holder = buildElementsForAst(methodDeclaration); |
1552 List<FieldElement> fields = holder.fields; | 2012 List<FieldElement> fields = holder.fields; |
1553 expect(fields, hasLength(1)); | 2013 expect(fields, hasLength(1)); |
1554 FieldElement field = fields[0]; | 2014 FieldElement field = fields[0]; |
1555 expect(field, isNotNull); | 2015 expect(field, isNotNull); |
1556 expect(field.name, methodName); | 2016 expect(field.name, methodName); |
1557 expect(field.isSynthetic, isTrue); | 2017 expect(field.isSynthetic, isTrue); |
1558 expect(field.getter, isNull); | 2018 expect(field.getter, isNull); |
1559 | 2019 |
1560 PropertyAccessorElement setter = field.setter; | 2020 PropertyAccessorElement setter = field.setter; |
1561 expect(setter, isNotNull); | 2021 expect(setter, isNotNull); |
1562 _assertHasCodeRange(setter, 50, 31); | 2022 assertHasCodeRange(setter, 50, 31); |
1563 expect(setter.documentationComment, '/// aaa'); | 2023 expect(setter.documentationComment, '/// aaa'); |
1564 expect(setter.hasImplicitReturnType, isTrue); | 2024 expect(setter.hasImplicitReturnType, isTrue); |
1565 expect(setter.isAbstract, isFalse); | 2025 expect(setter.isAbstract, isFalse); |
1566 expect(setter.isExternal, isFalse); | 2026 expect(setter.isExternal, isFalse); |
1567 expect(setter.isSetter, isTrue); | 2027 expect(setter.isSetter, isTrue); |
1568 expect(setter.isSynthetic, isFalse); | 2028 expect(setter.isSynthetic, isFalse); |
1569 expect(setter.name, "$methodName="); | 2029 expect(setter.name, "$methodName="); |
1570 expect(setter.displayName, methodName); | 2030 expect(setter.displayName, methodName); |
1571 expect(setter.variable, field); | 2031 expect(setter.variable, field); |
1572 expect(setter.functions, hasLength(0)); | 2032 expect(setter.functions, hasLength(0)); |
1573 expect(setter.labels, hasLength(0)); | 2033 expect(setter.labels, hasLength(0)); |
1574 expect(setter.localVariables, hasLength(0)); | 2034 expect(setter.localVariables, hasLength(0)); |
1575 expect(setter.parameters, hasLength(0)); | 2035 expect(setter.parameters, hasLength(0)); |
1576 } | 2036 } |
1577 | 2037 |
1578 void test_visitMethodDeclaration_setter_abstract() { | 2038 void test_visitMethodDeclaration_setter_abstract() { |
1579 // set m(); | 2039 // set m(); |
1580 ElementHolder holder = new ElementHolder(); | |
1581 ElementBuilder builder = _makeBuilder(holder); | |
1582 String methodName = "m"; | 2040 String methodName = "m"; |
1583 MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2( | 2041 MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2( |
1584 null, | 2042 null, |
1585 null, | 2043 null, |
1586 Keyword.SET, | 2044 Keyword.SET, |
1587 null, | 2045 null, |
1588 AstFactory.identifier3(methodName), | 2046 AstFactory.identifier3(methodName), |
1589 AstFactory.formalParameterList(), | 2047 AstFactory.formalParameterList(), |
1590 AstFactory.emptyFunctionBody()); | 2048 AstFactory.emptyFunctionBody()); |
1591 methodDeclaration.accept(builder); | 2049 |
1592 | 2050 ElementHolder holder = buildElementsForAst(methodDeclaration); |
1593 List<FieldElement> fields = holder.fields; | 2051 List<FieldElement> fields = holder.fields; |
1594 expect(fields, hasLength(1)); | 2052 expect(fields, hasLength(1)); |
1595 FieldElement field = fields[0]; | 2053 FieldElement field = fields[0]; |
1596 expect(field, isNotNull); | 2054 expect(field, isNotNull); |
1597 expect(field.name, methodName); | 2055 expect(field.name, methodName); |
1598 expect(field.isSynthetic, isTrue); | 2056 expect(field.isSynthetic, isTrue); |
1599 expect(field.getter, isNull); | 2057 expect(field.getter, isNull); |
1600 PropertyAccessorElement setter = field.setter; | 2058 PropertyAccessorElement setter = field.setter; |
1601 expect(setter, isNotNull); | 2059 expect(setter, isNotNull); |
1602 expect(setter.hasImplicitReturnType, isTrue); | 2060 expect(setter.hasImplicitReturnType, isTrue); |
1603 expect(setter.isAbstract, isTrue); | 2061 expect(setter.isAbstract, isTrue); |
1604 expect(setter.isExternal, isFalse); | 2062 expect(setter.isExternal, isFalse); |
1605 expect(setter.isSetter, isTrue); | 2063 expect(setter.isSetter, isTrue); |
1606 expect(setter.isSynthetic, isFalse); | 2064 expect(setter.isSynthetic, isFalse); |
1607 expect(setter.name, "$methodName="); | 2065 expect(setter.name, "$methodName="); |
1608 expect(setter.displayName, methodName); | 2066 expect(setter.displayName, methodName); |
1609 expect(setter.variable, field); | 2067 expect(setter.variable, field); |
1610 expect(setter.functions, hasLength(0)); | 2068 expect(setter.functions, hasLength(0)); |
1611 expect(setter.labels, hasLength(0)); | 2069 expect(setter.labels, hasLength(0)); |
1612 expect(setter.localVariables, hasLength(0)); | 2070 expect(setter.localVariables, hasLength(0)); |
1613 expect(setter.parameters, hasLength(0)); | 2071 expect(setter.parameters, hasLength(0)); |
1614 } | 2072 } |
1615 | 2073 |
1616 void test_visitMethodDeclaration_setter_external() { | 2074 void test_visitMethodDeclaration_setter_external() { |
1617 // external m(); | 2075 // external m(); |
1618 ElementHolder holder = new ElementHolder(); | |
1619 ElementBuilder builder = _makeBuilder(holder); | |
1620 String methodName = "m"; | 2076 String methodName = "m"; |
1621 MethodDeclaration methodDeclaration = AstFactory.methodDeclaration( | 2077 MethodDeclaration methodDeclaration = AstFactory.methodDeclaration( |
1622 null, | 2078 null, |
1623 null, | 2079 null, |
1624 Keyword.SET, | 2080 Keyword.SET, |
1625 null, | 2081 null, |
1626 AstFactory.identifier3(methodName), | 2082 AstFactory.identifier3(methodName), |
1627 AstFactory.formalParameterList()); | 2083 AstFactory.formalParameterList()); |
1628 methodDeclaration.externalKeyword = | 2084 methodDeclaration.externalKeyword = |
1629 TokenFactory.tokenFromKeyword(Keyword.EXTERNAL); | 2085 TokenFactory.tokenFromKeyword(Keyword.EXTERNAL); |
1630 methodDeclaration.accept(builder); | 2086 |
1631 | 2087 ElementHolder holder = buildElementsForAst(methodDeclaration); |
1632 List<FieldElement> fields = holder.fields; | 2088 List<FieldElement> fields = holder.fields; |
1633 expect(fields, hasLength(1)); | 2089 expect(fields, hasLength(1)); |
1634 FieldElement field = fields[0]; | 2090 FieldElement field = fields[0]; |
1635 expect(field, isNotNull); | 2091 expect(field, isNotNull); |
1636 expect(field.name, methodName); | 2092 expect(field.name, methodName); |
1637 expect(field.isSynthetic, isTrue); | 2093 expect(field.isSynthetic, isTrue); |
1638 expect(field.getter, isNull); | 2094 expect(field.getter, isNull); |
1639 PropertyAccessorElement setter = field.setter; | 2095 PropertyAccessorElement setter = field.setter; |
1640 expect(setter, isNotNull); | 2096 expect(setter, isNotNull); |
1641 expect(setter.hasImplicitReturnType, isTrue); | 2097 expect(setter.hasImplicitReturnType, isTrue); |
1642 expect(setter.isAbstract, isFalse); | 2098 expect(setter.isAbstract, isFalse); |
1643 expect(setter.isExternal, isTrue); | 2099 expect(setter.isExternal, isTrue); |
1644 expect(setter.isSetter, isTrue); | 2100 expect(setter.isSetter, isTrue); |
1645 expect(setter.isSynthetic, isFalse); | 2101 expect(setter.isSynthetic, isFalse); |
1646 expect(setter.name, "$methodName="); | 2102 expect(setter.name, "$methodName="); |
1647 expect(setter.displayName, methodName); | 2103 expect(setter.displayName, methodName); |
1648 expect(setter.variable, field); | 2104 expect(setter.variable, field); |
1649 expect(setter.functions, hasLength(0)); | 2105 expect(setter.functions, hasLength(0)); |
1650 expect(setter.labels, hasLength(0)); | 2106 expect(setter.labels, hasLength(0)); |
1651 expect(setter.localVariables, hasLength(0)); | 2107 expect(setter.localVariables, hasLength(0)); |
1652 expect(setter.parameters, hasLength(0)); | 2108 expect(setter.parameters, hasLength(0)); |
1653 } | 2109 } |
1654 | 2110 |
1655 void test_visitMethodDeclaration_static() { | 2111 void test_visitMethodDeclaration_static() { |
1656 // static m() {} | 2112 // static m() {} |
1657 ElementHolder holder = new ElementHolder(); | |
1658 ElementBuilder builder = _makeBuilder(holder); | |
1659 String methodName = "m"; | 2113 String methodName = "m"; |
1660 MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2( | 2114 MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2( |
1661 Keyword.STATIC, | 2115 Keyword.STATIC, |
1662 null, | 2116 null, |
1663 null, | 2117 null, |
1664 null, | 2118 null, |
1665 AstFactory.identifier3(methodName), | 2119 AstFactory.identifier3(methodName), |
1666 AstFactory.formalParameterList(), | 2120 AstFactory.formalParameterList(), |
1667 AstFactory.blockFunctionBody2()); | 2121 AstFactory.blockFunctionBody2()); |
1668 methodDeclaration.accept(builder); | 2122 ElementHolder holder = buildElementsForAst(methodDeclaration); |
1669 List<MethodElement> methods = holder.methods; | 2123 List<MethodElement> methods = holder.methods; |
1670 expect(methods, hasLength(1)); | 2124 expect(methods, hasLength(1)); |
1671 MethodElement method = methods[0]; | 2125 MethodElement method = methods[0]; |
1672 expect(method, isNotNull); | 2126 expect(method, isNotNull); |
1673 expect(method.hasImplicitReturnType, isTrue); | 2127 expect(method.hasImplicitReturnType, isTrue); |
1674 expect(method.name, methodName); | 2128 expect(method.name, methodName); |
1675 expect(method.functions, hasLength(0)); | 2129 expect(method.functions, hasLength(0)); |
1676 expect(method.labels, hasLength(0)); | 2130 expect(method.labels, hasLength(0)); |
1677 expect(method.localVariables, hasLength(0)); | 2131 expect(method.localVariables, hasLength(0)); |
1678 expect(method.parameters, hasLength(0)); | 2132 expect(method.parameters, hasLength(0)); |
1679 expect(method.typeParameters, hasLength(0)); | 2133 expect(method.typeParameters, hasLength(0)); |
1680 expect(method.isAbstract, isFalse); | 2134 expect(method.isAbstract, isFalse); |
1681 expect(method.isExternal, isFalse); | 2135 expect(method.isExternal, isFalse); |
1682 expect(method.isStatic, isTrue); | 2136 expect(method.isStatic, isTrue); |
1683 expect(method.isSynthetic, isFalse); | 2137 expect(method.isSynthetic, isFalse); |
1684 } | 2138 } |
1685 | 2139 |
1686 void test_visitMethodDeclaration_typeParameters() { | 2140 void test_visitMethodDeclaration_typeParameters() { |
1687 // m<E>() {} | 2141 // m<E>() {} |
1688 ElementHolder holder = new ElementHolder(); | |
1689 ElementBuilder builder = _makeBuilder(holder); | |
1690 String methodName = "m"; | 2142 String methodName = "m"; |
1691 MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2( | 2143 MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2( |
1692 null, | 2144 null, |
1693 null, | 2145 null, |
1694 null, | 2146 null, |
1695 null, | 2147 null, |
1696 AstFactory.identifier3(methodName), | 2148 AstFactory.identifier3(methodName), |
1697 AstFactory.formalParameterList(), | 2149 AstFactory.formalParameterList(), |
1698 AstFactory.blockFunctionBody2()); | 2150 AstFactory.blockFunctionBody2()); |
1699 methodDeclaration.typeParameters = AstFactory.typeParameterList(['E']); | 2151 methodDeclaration.typeParameters = AstFactory.typeParameterList(['E']); |
1700 methodDeclaration.accept(builder); | 2152 |
1701 | 2153 ElementHolder holder = buildElementsForAst(methodDeclaration); |
1702 List<MethodElement> methods = holder.methods; | 2154 List<MethodElement> methods = holder.methods; |
1703 expect(methods, hasLength(1)); | 2155 expect(methods, hasLength(1)); |
1704 MethodElement method = methods[0]; | 2156 MethodElement method = methods[0]; |
1705 expect(method, isNotNull); | 2157 expect(method, isNotNull); |
1706 expect(method.hasImplicitReturnType, isTrue); | 2158 expect(method.hasImplicitReturnType, isTrue); |
1707 expect(method.name, methodName); | 2159 expect(method.name, methodName); |
1708 expect(method.functions, hasLength(0)); | 2160 expect(method.functions, hasLength(0)); |
1709 expect(method.labels, hasLength(0)); | 2161 expect(method.labels, hasLength(0)); |
1710 expect(method.localVariables, hasLength(0)); | 2162 expect(method.localVariables, hasLength(0)); |
1711 expect(method.parameters, hasLength(0)); | 2163 expect(method.parameters, hasLength(0)); |
1712 expect(method.typeParameters, hasLength(1)); | 2164 expect(method.typeParameters, hasLength(1)); |
1713 expect(method.isAbstract, isFalse); | 2165 expect(method.isAbstract, isFalse); |
1714 expect(method.isExternal, isFalse); | 2166 expect(method.isExternal, isFalse); |
1715 expect(method.isStatic, isFalse); | 2167 expect(method.isStatic, isFalse); |
1716 expect(method.isSynthetic, isFalse); | 2168 expect(method.isSynthetic, isFalse); |
1717 } | 2169 } |
1718 | 2170 |
1719 void test_visitMethodDeclaration_withMembers() { | |
1720 MethodElement method = buildElementsForText( | |
1721 'class C { m(p) { var v; try { l: return; } catch (e) {} } }') | |
1722 .types[0] | |
1723 .methods[0]; | |
1724 String methodName = "m"; | |
1725 String parameterName = "p"; | |
1726 String localVariableName = "v"; | |
1727 String labelName = "l"; | |
1728 String exceptionParameterName = "e"; | |
1729 expect(method, isNotNull); | |
1730 expect(method.hasImplicitReturnType, isTrue); | |
1731 expect(method.name, methodName); | |
1732 expect(method.typeParameters, hasLength(0)); | |
1733 expect(method.isAbstract, isFalse); | |
1734 expect(method.isExternal, isFalse); | |
1735 expect(method.isStatic, isFalse); | |
1736 expect(method.isSynthetic, isFalse); | |
1737 List<VariableElement> parameters = method.parameters; | |
1738 expect(parameters, hasLength(1)); | |
1739 VariableElement parameter = parameters[0]; | |
1740 expect(parameter, isNotNull); | |
1741 expect(parameter.name, parameterName); | |
1742 List<VariableElement> localVariables = method.localVariables; | |
1743 expect(localVariables, hasLength(2)); | |
1744 VariableElement firstVariable = localVariables[0]; | |
1745 VariableElement secondVariable = localVariables[1]; | |
1746 expect(firstVariable, isNotNull); | |
1747 expect(secondVariable, isNotNull); | |
1748 expect( | |
1749 (firstVariable.name == localVariableName && | |
1750 secondVariable.name == exceptionParameterName) || | |
1751 (firstVariable.name == exceptionParameterName && | |
1752 secondVariable.name == localVariableName), | |
1753 isTrue); | |
1754 List<LabelElement> labels = method.labels; | |
1755 expect(labels, hasLength(1)); | |
1756 LabelElement label = labels[0]; | |
1757 expect(label, isNotNull); | |
1758 expect(label.name, labelName); | |
1759 } | |
1760 | |
1761 void test_visitNamedFormalParameter() { | |
1762 ElementHolder holder = new ElementHolder(); | |
1763 ElementBuilder builder = _makeBuilder(holder); | |
1764 String parameterName = "p"; | |
1765 DefaultFormalParameter formalParameter = AstFactory.namedFormalParameter( | |
1766 AstFactory.simpleFormalParameter3(parameterName), | |
1767 AstFactory.identifier3("42")); | |
1768 _useParameterInMethod(formalParameter, 100, 110); | |
1769 formalParameter.beginToken.offset = 50; | |
1770 formalParameter.endToken.offset = 80; | |
1771 formalParameter.accept(builder); | |
1772 List<ParameterElement> parameters = holder.parameters; | |
1773 expect(parameters, hasLength(1)); | |
1774 ParameterElement parameter = parameters[0]; | |
1775 expect(parameter, isNotNull); | |
1776 _assertHasCodeRange(parameter, 50, 32); | |
1777 expect(parameter.name, parameterName); | |
1778 expect(parameter.isConst, isFalse); | |
1779 expect(parameter.isFinal, isFalse); | |
1780 expect(parameter.isSynthetic, isFalse); | |
1781 expect(parameter.parameterKind, ParameterKind.NAMED); | |
1782 _assertVisibleRange(parameter, 100, 110); | |
1783 expect(parameter.defaultValueCode, "42"); | |
1784 FunctionElement initializer = parameter.initializer; | |
1785 expect(initializer, isNotNull); | |
1786 expect(initializer.isSynthetic, isTrue); | |
1787 expect(initializer.hasImplicitReturnType, isTrue); | |
1788 } | |
1789 | |
1790 void test_visitSimpleFormalParameter_noType() { | |
1791 // p | |
1792 ElementHolder holder = new ElementHolder(); | |
1793 ElementBuilder builder = _makeBuilder(holder); | |
1794 String parameterName = "p"; | |
1795 SimpleFormalParameter formalParameter = | |
1796 AstFactory.simpleFormalParameter3(parameterName); | |
1797 _useParameterInMethod(formalParameter, 100, 110); | |
1798 formalParameter.accept(builder); | |
1799 List<ParameterElement> parameters = holder.parameters; | |
1800 expect(parameters, hasLength(1)); | |
1801 ParameterElement parameter = parameters[0]; | |
1802 expect(parameter, isNotNull); | |
1803 expect(parameter.hasImplicitType, isTrue); | |
1804 expect(parameter.initializer, isNull); | |
1805 expect(parameter.isConst, isFalse); | |
1806 expect(parameter.isFinal, isFalse); | |
1807 expect(parameter.isSynthetic, isFalse); | |
1808 expect(parameter.name, parameterName); | |
1809 expect(parameter.parameterKind, ParameterKind.REQUIRED); | |
1810 _assertVisibleRange(parameter, 100, 110); | |
1811 } | |
1812 | |
1813 void test_visitSimpleFormalParameter_type() { | |
1814 // T p | |
1815 ElementHolder holder = new ElementHolder(); | |
1816 ElementBuilder builder = _makeBuilder(holder); | |
1817 String parameterName = "p"; | |
1818 SimpleFormalParameter formalParameter = AstFactory.simpleFormalParameter4( | |
1819 AstFactory.typeName4('T'), parameterName); | |
1820 _useParameterInMethod(formalParameter, 100, 110); | |
1821 formalParameter.accept(builder); | |
1822 List<ParameterElement> parameters = holder.parameters; | |
1823 expect(parameters, hasLength(1)); | |
1824 ParameterElement parameter = parameters[0]; | |
1825 expect(parameter, isNotNull); | |
1826 expect(parameter.hasImplicitType, isFalse); | |
1827 expect(parameter.initializer, isNull); | |
1828 expect(parameter.isConst, isFalse); | |
1829 expect(parameter.isFinal, isFalse); | |
1830 expect(parameter.isSynthetic, isFalse); | |
1831 expect(parameter.name, parameterName); | |
1832 expect(parameter.parameterKind, ParameterKind.REQUIRED); | |
1833 _assertVisibleRange(parameter, 100, 110); | |
1834 } | |
1835 | |
1836 void test_visitTypeAlias_minimal() { | 2171 void test_visitTypeAlias_minimal() { |
1837 ElementHolder holder = new ElementHolder(); | |
1838 ElementBuilder builder = _makeBuilder(holder); | |
1839 String aliasName = "F"; | 2172 String aliasName = "F"; |
1840 TypeAlias typeAlias = AstFactory.typeAlias(null, aliasName, null, null); | 2173 TypeAlias typeAlias = AstFactory.typeAlias(null, aliasName, null, null); |
1841 typeAlias.accept(builder); | 2174 ElementHolder holder = buildElementsForAst(typeAlias); |
1842 List<FunctionTypeAliasElement> aliases = holder.typeAliases; | 2175 List<FunctionTypeAliasElement> aliases = holder.typeAliases; |
1843 expect(aliases, hasLength(1)); | 2176 expect(aliases, hasLength(1)); |
1844 FunctionTypeAliasElement alias = aliases[0]; | 2177 FunctionTypeAliasElement alias = aliases[0]; |
1845 expect(alias, isNotNull); | 2178 expect(alias, isNotNull); |
1846 expect(alias.name, aliasName); | 2179 expect(alias.name, aliasName); |
1847 expect(alias.type, isNotNull); | 2180 expect(alias.type, isNotNull); |
1848 expect(alias.isSynthetic, isFalse); | 2181 expect(alias.isSynthetic, isFalse); |
1849 } | 2182 } |
1850 | 2183 |
1851 void test_visitTypeAlias_withFormalParameters() { | 2184 void test_visitTypeAlias_withFormalParameters() { |
1852 ElementHolder holder = new ElementHolder(); | |
1853 ElementBuilder builder = _makeBuilder(holder); | |
1854 String aliasName = "F"; | 2185 String aliasName = "F"; |
1855 String firstParameterName = "x"; | 2186 String firstParameterName = "x"; |
1856 String secondParameterName = "y"; | 2187 String secondParameterName = "y"; |
1857 TypeAlias typeAlias = AstFactory.typeAlias( | 2188 TypeAlias typeAlias = AstFactory.typeAlias( |
1858 null, | 2189 null, |
1859 aliasName, | 2190 aliasName, |
1860 AstFactory.typeParameterList(), | 2191 AstFactory.typeParameterList(), |
1861 AstFactory.formalParameterList([ | 2192 AstFactory.formalParameterList([ |
1862 AstFactory.simpleFormalParameter3(firstParameterName), | 2193 AstFactory.simpleFormalParameter3(firstParameterName), |
1863 AstFactory.simpleFormalParameter3(secondParameterName) | 2194 AstFactory.simpleFormalParameter3(secondParameterName) |
1864 ])); | 2195 ])); |
1865 typeAlias.beginToken.offset = 50; | 2196 typeAlias.beginToken.offset = 50; |
1866 typeAlias.endToken.offset = 80; | 2197 typeAlias.endToken.offset = 80; |
1867 typeAlias.accept(builder); | 2198 ElementHolder holder = buildElementsForAst(typeAlias); |
1868 List<FunctionTypeAliasElement> aliases = holder.typeAliases; | 2199 List<FunctionTypeAliasElement> aliases = holder.typeAliases; |
1869 expect(aliases, hasLength(1)); | 2200 expect(aliases, hasLength(1)); |
1870 FunctionTypeAliasElement alias = aliases[0]; | 2201 FunctionTypeAliasElement alias = aliases[0]; |
1871 expect(alias, isNotNull); | 2202 expect(alias, isNotNull); |
1872 _assertHasCodeRange(alias, 50, 31); | 2203 assertHasCodeRange(alias, 50, 31); |
1873 expect(alias.name, aliasName); | 2204 expect(alias.name, aliasName); |
1874 expect(alias.type, isNotNull); | 2205 expect(alias.type, isNotNull); |
1875 expect(alias.isSynthetic, isFalse); | 2206 expect(alias.isSynthetic, isFalse); |
1876 List<VariableElement> parameters = alias.parameters; | 2207 List<VariableElement> parameters = alias.parameters; |
1877 expect(parameters, hasLength(2)); | 2208 expect(parameters, hasLength(2)); |
1878 expect(parameters[0].name, firstParameterName); | 2209 expect(parameters[0].name, firstParameterName); |
1879 expect(parameters[1].name, secondParameterName); | 2210 expect(parameters[1].name, secondParameterName); |
1880 List<TypeParameterElement> typeParameters = alias.typeParameters; | 2211 List<TypeParameterElement> typeParameters = alias.typeParameters; |
1881 expect(typeParameters, isNotNull); | 2212 expect(typeParameters, isNotNull); |
1882 expect(typeParameters, hasLength(0)); | 2213 expect(typeParameters, hasLength(0)); |
1883 } | 2214 } |
1884 | 2215 |
1885 void test_visitTypeAlias_withTypeParameters() { | 2216 void test_visitTypeAlias_withTypeParameters() { |
1886 ElementHolder holder = new ElementHolder(); | |
1887 ElementBuilder builder = _makeBuilder(holder); | |
1888 String aliasName = "F"; | 2217 String aliasName = "F"; |
1889 String firstTypeParameterName = "A"; | 2218 String firstTypeParameterName = "A"; |
1890 String secondTypeParameterName = "B"; | 2219 String secondTypeParameterName = "B"; |
1891 TypeAlias typeAlias = AstFactory.typeAlias( | 2220 TypeAlias typeAlias = AstFactory.typeAlias( |
1892 null, | 2221 null, |
1893 aliasName, | 2222 aliasName, |
1894 AstFactory.typeParameterList( | 2223 AstFactory.typeParameterList( |
1895 [firstTypeParameterName, secondTypeParameterName]), | 2224 [firstTypeParameterName, secondTypeParameterName]), |
1896 AstFactory.formalParameterList()); | 2225 AstFactory.formalParameterList()); |
1897 typeAlias.accept(builder); | 2226 ElementHolder holder = buildElementsForAst(typeAlias); |
1898 List<FunctionTypeAliasElement> aliases = holder.typeAliases; | 2227 List<FunctionTypeAliasElement> aliases = holder.typeAliases; |
1899 expect(aliases, hasLength(1)); | 2228 expect(aliases, hasLength(1)); |
1900 FunctionTypeAliasElement alias = aliases[0]; | 2229 FunctionTypeAliasElement alias = aliases[0]; |
1901 expect(alias, isNotNull); | 2230 expect(alias, isNotNull); |
1902 expect(alias.name, aliasName); | 2231 expect(alias.name, aliasName); |
1903 expect(alias.type, isNotNull); | 2232 expect(alias.type, isNotNull); |
1904 expect(alias.isSynthetic, isFalse); | 2233 expect(alias.isSynthetic, isFalse); |
1905 List<VariableElement> parameters = alias.parameters; | 2234 List<VariableElement> parameters = alias.parameters; |
1906 expect(parameters, isNotNull); | 2235 expect(parameters, isNotNull); |
1907 expect(parameters, hasLength(0)); | 2236 expect(parameters, hasLength(0)); |
1908 List<TypeParameterElement> typeParameters = alias.typeParameters; | 2237 List<TypeParameterElement> typeParameters = alias.typeParameters; |
1909 expect(typeParameters, hasLength(2)); | 2238 expect(typeParameters, hasLength(2)); |
1910 expect(typeParameters[0].name, firstTypeParameterName); | 2239 expect(typeParameters[0].name, firstTypeParameterName); |
1911 expect(typeParameters[1].name, secondTypeParameterName); | 2240 expect(typeParameters[1].name, secondTypeParameterName); |
1912 } | 2241 } |
1913 | 2242 |
1914 void test_visitTypeParameter() { | 2243 void test_visitTypeParameter() { |
1915 ElementHolder holder = new ElementHolder(); | |
1916 ElementBuilder builder = _makeBuilder(holder); | |
1917 String parameterName = "E"; | 2244 String parameterName = "E"; |
1918 TypeParameter typeParameter = AstFactory.typeParameter(parameterName); | 2245 TypeParameter typeParameter = AstFactory.typeParameter(parameterName); |
1919 typeParameter.beginToken.offset = 50; | 2246 typeParameter.beginToken.offset = 50; |
1920 typeParameter.accept(builder); | 2247 ElementHolder holder = buildElementsForAst(typeParameter); |
1921 List<TypeParameterElement> typeParameters = holder.typeParameters; | 2248 List<TypeParameterElement> typeParameters = holder.typeParameters; |
1922 expect(typeParameters, hasLength(1)); | 2249 expect(typeParameters, hasLength(1)); |
1923 TypeParameterElement typeParameterElement = typeParameters[0]; | 2250 TypeParameterElement typeParameterElement = typeParameters[0]; |
1924 expect(typeParameterElement, isNotNull); | 2251 expect(typeParameterElement, isNotNull); |
1925 _assertHasCodeRange(typeParameterElement, 50, 1); | 2252 assertHasCodeRange(typeParameterElement, 50, 1); |
1926 expect(typeParameterElement.name, parameterName); | 2253 expect(typeParameterElement.name, parameterName); |
1927 expect(typeParameterElement.bound, isNull); | 2254 expect(typeParameterElement.bound, isNull); |
1928 expect(typeParameterElement.isSynthetic, isFalse); | 2255 expect(typeParameterElement.isSynthetic, isFalse); |
1929 } | 2256 } |
1930 | 2257 } |
1931 void test_visitVariableDeclaration_inConstructor() { | 2258 |
1932 List<ConstructorElement> constructors = | 2259 abstract class _BaseTest { |
1933 buildElementsForText('class C { C() { var v = 1; } }') | 2260 CompilationUnitElement compilationUnitElement; |
1934 .types[0] | 2261 CompilationUnit _compilationUnit; |
1935 .constructors; | 2262 |
1936 expect(constructors, hasLength(1)); | 2263 CompilationUnit get compilationUnit => _compilationUnit; |
1937 List<LocalVariableElement> variableElements = | 2264 |
1938 constructors[0].localVariables; | 2265 void assertHasCodeRange(Element element, int offset, int length) { |
1939 expect(variableElements, hasLength(1)); | |
1940 LocalVariableElement variableElement = variableElements[0]; | |
1941 _assertHasCodeRange(variableElement, 16, 10); | |
1942 expect(variableElement.hasImplicitType, isTrue); | |
1943 expect(variableElement.name, 'v'); | |
1944 _assertVisibleRange(variableElement, 14, 28); | |
1945 } | |
1946 | |
1947 void test_visitVariableDeclaration_inForEachStatement() { | |
1948 ElementHolder holder = new ElementHolder(); | |
1949 ElementBuilder builder = _makeBuilder(holder); | |
1950 // | |
1951 // m() { for (var v in []) } | |
1952 // | |
1953 String variableName = "v"; | |
1954 Statement statement = AstFactory.forEachStatement( | |
1955 AstFactory.declaredIdentifier3('v'), | |
1956 AstFactory.listLiteral(), | |
1957 AstFactory.block()); | |
1958 _setNodeSourceRange(statement, 100, 110); | |
1959 MethodDeclaration method = AstFactory.methodDeclaration2( | |
1960 null, | |
1961 null, | |
1962 null, | |
1963 null, | |
1964 AstFactory.identifier3("m"), | |
1965 AstFactory.formalParameterList(), | |
1966 AstFactory.blockFunctionBody2([statement])); | |
1967 _setBlockBodySourceRange(method.body, 200, 220); | |
1968 method.accept(builder); | |
1969 | |
1970 List<MethodElement> methods = holder.methods; | |
1971 expect(methods, hasLength(1)); | |
1972 List<LocalVariableElement> variableElements = methods[0].localVariables; | |
1973 expect(variableElements, hasLength(1)); | |
1974 LocalVariableElement variableElement = variableElements[0]; | |
1975 expect(variableElement.name, variableName); | |
1976 _assertVisibleRange(variableElement, 100, 110); | |
1977 } | |
1978 | |
1979 void test_visitVariableDeclaration_inForStatement() { | |
1980 ElementHolder holder = new ElementHolder(); | |
1981 ElementBuilder builder = _makeBuilder(holder); | |
1982 // | |
1983 // m() { for (T v;;) } | |
1984 // | |
1985 String variableName = "v"; | |
1986 ForStatement statement = AstFactory.forStatement2( | |
1987 AstFactory.variableDeclarationList(null, AstFactory.typeName4('T'), | |
1988 [AstFactory.variableDeclaration('v')]), | |
1989 null, | |
1990 null, | |
1991 AstFactory.block()); | |
1992 _setNodeSourceRange(statement, 100, 110); | |
1993 MethodDeclaration method = AstFactory.methodDeclaration2( | |
1994 null, | |
1995 null, | |
1996 null, | |
1997 null, | |
1998 AstFactory.identifier3("m"), | |
1999 AstFactory.formalParameterList(), | |
2000 AstFactory.blockFunctionBody2([statement])); | |
2001 _setBlockBodySourceRange(method.body, 200, 220); | |
2002 method.accept(builder); | |
2003 | |
2004 List<MethodElement> methods = holder.methods; | |
2005 expect(methods, hasLength(1)); | |
2006 List<LocalVariableElement> variableElements = methods[0].localVariables; | |
2007 expect(variableElements, hasLength(1)); | |
2008 LocalVariableElement variableElement = variableElements[0]; | |
2009 expect(variableElement.name, variableName); | |
2010 _assertVisibleRange(variableElement, 100, 110); | |
2011 } | |
2012 | |
2013 void test_visitVariableDeclaration_inMethod() { | |
2014 ElementHolder holder = new ElementHolder(); | |
2015 ElementBuilder builder = _makeBuilder(holder); | |
2016 // | |
2017 // m() {T v;} | |
2018 // | |
2019 String variableName = "v"; | |
2020 VariableDeclaration variable = | |
2021 AstFactory.variableDeclaration2(variableName, null); | |
2022 Statement statement = AstFactory.variableDeclarationStatement( | |
2023 null, AstFactory.typeName4('T'), [variable]); | |
2024 MethodDeclaration method = AstFactory.methodDeclaration2( | |
2025 null, | |
2026 null, | |
2027 null, | |
2028 null, | |
2029 AstFactory.identifier3("m"), | |
2030 AstFactory.formalParameterList(), | |
2031 AstFactory.blockFunctionBody2([statement])); | |
2032 _setBlockBodySourceRange(method.body, 100, 110); | |
2033 method.accept(builder); | |
2034 | |
2035 List<MethodElement> methods = holder.methods; | |
2036 expect(methods, hasLength(1)); | |
2037 List<LocalVariableElement> variableElements = methods[0].localVariables; | |
2038 expect(variableElements, hasLength(1)); | |
2039 LocalVariableElement variableElement = variableElements[0]; | |
2040 expect(variableElement.hasImplicitType, isFalse); | |
2041 expect(variableElement.name, variableName); | |
2042 _assertVisibleRange(variableElement, 100, 110); | |
2043 } | |
2044 | |
2045 void test_visitVariableDeclaration_localNestedInFunction() { | |
2046 ElementHolder holder = new ElementHolder(); | |
2047 ElementBuilder builder = _makeBuilder(holder); | |
2048 // | |
2049 // var f = () {var v;}; | |
2050 // | |
2051 String variableName = "v"; | |
2052 VariableDeclaration variable = | |
2053 AstFactory.variableDeclaration2(variableName, null); | |
2054 Statement statement = | |
2055 AstFactory.variableDeclarationStatement2(null, [variable]); | |
2056 Expression initializer = AstFactory.functionExpression2( | |
2057 AstFactory.formalParameterList(), | |
2058 AstFactory.blockFunctionBody2([statement])); | |
2059 String fieldName = "f"; | |
2060 VariableDeclaration field = | |
2061 AstFactory.variableDeclaration2(fieldName, initializer); | |
2062 FieldDeclaration fieldDeclaration = | |
2063 AstFactory.fieldDeclaration2(false, null, [field]); | |
2064 fieldDeclaration.accept(builder); | |
2065 | |
2066 List<FieldElement> variables = holder.fields; | |
2067 expect(variables, hasLength(1)); | |
2068 FieldElement fieldElement = variables[0]; | |
2069 expect(fieldElement, isNotNull); | |
2070 FunctionElement initializerElement = fieldElement.initializer; | |
2071 expect(initializerElement, isNotNull); | |
2072 expect(initializerElement.hasImplicitReturnType, isTrue); | |
2073 List<FunctionElement> functionElements = initializerElement.functions; | |
2074 expect(functionElements, hasLength(1)); | |
2075 List<LocalVariableElement> variableElements = | |
2076 functionElements[0].localVariables; | |
2077 expect(variableElements, hasLength(1)); | |
2078 LocalVariableElement variableElement = variableElements[0]; | |
2079 expect(variableElement.hasImplicitType, isTrue); | |
2080 expect(variableElement.isConst, isFalse); | |
2081 expect(variableElement.isFinal, isFalse); | |
2082 expect(variableElement.isSynthetic, isFalse); | |
2083 expect(variableElement.name, variableName); | |
2084 } | |
2085 | |
2086 void test_visitVariableDeclaration_noInitializer() { | |
2087 // var v; | |
2088 ElementHolder holder = new ElementHolder(); | |
2089 ElementBuilder builder = _makeBuilder(holder); | |
2090 String variableName = "v"; | |
2091 VariableDeclaration variableDeclaration = | |
2092 AstFactory.variableDeclaration2(variableName, null); | |
2093 AstFactory.variableDeclarationList2(null, [variableDeclaration]); | |
2094 variableDeclaration.accept(builder); | |
2095 | |
2096 List<TopLevelVariableElement> variables = holder.topLevelVariables; | |
2097 expect(variables, hasLength(1)); | |
2098 TopLevelVariableElement variable = variables[0]; | |
2099 expect(variable, isNotNull); | |
2100 expect(variable.hasImplicitType, isTrue); | |
2101 expect(variable.initializer, isNull); | |
2102 expect(variable.name, variableName); | |
2103 expect(variable.isConst, isFalse); | |
2104 expect(variable.isFinal, isFalse); | |
2105 expect(variable.isSynthetic, isFalse); | |
2106 expect(variable.getter, isNotNull); | |
2107 expect(variable.setter, isNotNull); | |
2108 } | |
2109 | |
2110 void test_visitVariableDeclaration_top() { | |
2111 // final a, b; | |
2112 ElementHolder holder = new ElementHolder(); | |
2113 ElementBuilder builder = _makeBuilder(holder); | |
2114 VariableDeclaration variableDeclaration1 = | |
2115 AstFactory.variableDeclaration('a'); | |
2116 VariableDeclaration variableDeclaration2 = | |
2117 AstFactory.variableDeclaration('b'); | |
2118 TopLevelVariableDeclaration topLevelVariableDeclaration = AstFactory | |
2119 .topLevelVariableDeclaration( | |
2120 Keyword.FINAL, null, [variableDeclaration1, variableDeclaration2]); | |
2121 topLevelVariableDeclaration.documentationComment = AstFactory | |
2122 .documentationComment( | |
2123 [TokenFactory.tokenFromString('/// aaa')..offset = 50], []); | |
2124 | |
2125 topLevelVariableDeclaration.accept(builder); | |
2126 List<TopLevelVariableElement> variables = holder.topLevelVariables; | |
2127 expect(variables, hasLength(2)); | |
2128 | |
2129 TopLevelVariableElement variable1 = variables[0]; | |
2130 expect(variable1, isNotNull); | |
2131 expect(variable1.documentationComment, '/// aaa'); | |
2132 | |
2133 TopLevelVariableElement variable2 = variables[1]; | |
2134 expect(variable2, isNotNull); | |
2135 expect(variable2.documentationComment, '/// aaa'); | |
2136 } | |
2137 | |
2138 void test_visitVariableDeclaration_top_const_hasInitializer() { | |
2139 // const v = 42; | |
2140 ElementHolder holder = new ElementHolder(); | |
2141 ElementBuilder builder = _makeBuilder(holder); | |
2142 String variableName = "v"; | |
2143 VariableDeclaration variableDeclaration = | |
2144 AstFactory.variableDeclaration2(variableName, AstFactory.integer(42)); | |
2145 AstFactory.variableDeclarationList2(Keyword.CONST, [variableDeclaration]); | |
2146 variableDeclaration.accept(builder); | |
2147 | |
2148 List<TopLevelVariableElement> variables = holder.topLevelVariables; | |
2149 expect(variables, hasLength(1)); | |
2150 TopLevelVariableElement variable = variables[0]; | |
2151 expect(variable, new isInstanceOf<ConstTopLevelVariableElementImpl>()); | |
2152 expect(variable.initializer, isNotNull); | |
2153 expect(variable.initializer.type, isNotNull); | |
2154 expect(variable.initializer.hasImplicitReturnType, isTrue); | |
2155 expect(variable.name, variableName); | |
2156 expect(variable.hasImplicitType, isTrue); | |
2157 expect(variable.isConst, isTrue); | |
2158 expect(variable.isFinal, isFalse); | |
2159 expect(variable.isSynthetic, isFalse); | |
2160 expect(variable.getter, isNotNull); | |
2161 expect(variable.setter, isNull); | |
2162 } | |
2163 | |
2164 void test_visitVariableDeclaration_top_final() { | |
2165 // final v; | |
2166 ElementHolder holder = new ElementHolder(); | |
2167 ElementBuilder builder = _makeBuilder(holder); | |
2168 String variableName = "v"; | |
2169 VariableDeclaration variableDeclaration = | |
2170 AstFactory.variableDeclaration2(variableName, null); | |
2171 AstFactory.variableDeclarationList2(Keyword.FINAL, [variableDeclaration]); | |
2172 variableDeclaration.accept(builder); | |
2173 List<TopLevelVariableElement> variables = holder.topLevelVariables; | |
2174 expect(variables, hasLength(1)); | |
2175 TopLevelVariableElement variable = variables[0]; | |
2176 expect(variable, isNotNull); | |
2177 expect(variable.hasImplicitType, isTrue); | |
2178 expect(variable.initializer, isNull); | |
2179 expect(variable.name, variableName); | |
2180 expect(variable.isConst, isFalse); | |
2181 expect(variable.isFinal, isTrue); | |
2182 expect(variable.isSynthetic, isFalse); | |
2183 expect(variable.getter, isNotNull); | |
2184 expect(variable.setter, isNull); | |
2185 } | |
2186 | |
2187 void _assertHasCodeRange(Element element, int offset, int length) { | |
2188 ElementImpl elementImpl = element; | 2266 ElementImpl elementImpl = element; |
2189 expect(elementImpl.codeOffset, offset); | 2267 expect(elementImpl.codeOffset, offset); |
2190 expect(elementImpl.codeLength, length); | 2268 expect(elementImpl.codeLength, length); |
2191 } | 2269 } |
2192 | 2270 |
| 2271 /** |
| 2272 * Build elements using [ApiElementBuilder]. |
| 2273 */ |
| 2274 ElementHolder buildElementsForAst(AstNode node) { |
| 2275 ElementHolder holder = new ElementHolder(); |
| 2276 AstVisitor builder = createElementBuilder(holder); |
| 2277 node.accept(builder); |
| 2278 return holder; |
| 2279 } |
| 2280 |
| 2281 /** |
| 2282 * Parse the given [code], and build elements using [ApiElementBuilder]. |
| 2283 */ |
| 2284 ElementHolder buildElementsForText(String code) { |
| 2285 ElementHolder holder = new ElementHolder(); |
| 2286 AstVisitor builder = createElementBuilder(holder); |
| 2287 _visitAstOfCode(code, builder); |
| 2288 return holder; |
| 2289 } |
| 2290 |
| 2291 /** |
| 2292 * Verify that the given [metadata] has exactly one annotation, and that its |
| 2293 * [ElementAnnotationImpl] is unresolved. |
| 2294 */ |
| 2295 void checkAnnotation(NodeList<Annotation> metadata) { |
| 2296 expect(metadata, hasLength(1)); |
| 2297 expect(metadata[0], new isInstanceOf<AnnotationImpl>()); |
| 2298 AnnotationImpl annotation = metadata[0]; |
| 2299 expect(annotation.elementAnnotation, |
| 2300 new isInstanceOf<ElementAnnotationImpl>()); |
| 2301 ElementAnnotationImpl elementAnnotation = annotation.elementAnnotation; |
| 2302 expect(elementAnnotation.element, isNull); // Not yet resolved |
| 2303 expect(elementAnnotation.compilationUnit, isNotNull); |
| 2304 expect(elementAnnotation.compilationUnit, compilationUnitElement); |
| 2305 } |
| 2306 |
| 2307 /** |
| 2308 * Verify that the given [element] has exactly one annotation, and that its |
| 2309 * [ElementAnnotationImpl] is unresolved. |
| 2310 */ |
| 2311 void checkMetadata(Element element) { |
| 2312 expect(element.metadata, hasLength(1)); |
| 2313 expect(element.metadata[0], new isInstanceOf<ElementAnnotationImpl>()); |
| 2314 ElementAnnotationImpl elementAnnotation = element.metadata[0]; |
| 2315 expect(elementAnnotation.element, isNull); // Not yet resolved |
| 2316 expect(elementAnnotation.compilationUnit, isNotNull); |
| 2317 expect(elementAnnotation.compilationUnit, compilationUnitElement); |
| 2318 } |
| 2319 |
| 2320 AstVisitor createElementBuilder(ElementHolder holder); |
| 2321 |
| 2322 void setUp() { |
| 2323 compilationUnitElement = new CompilationUnitElementImpl('test.dart'); |
| 2324 } |
| 2325 |
2193 void _assertVisibleRange(LocalElement element, int offset, int end) { | 2326 void _assertVisibleRange(LocalElement element, int offset, int end) { |
2194 SourceRange visibleRange = element.visibleRange; | 2327 SourceRange visibleRange = element.visibleRange; |
2195 expect(visibleRange.offset, offset); | 2328 expect(visibleRange.offset, offset); |
2196 expect(visibleRange.end, end); | 2329 expect(visibleRange.end, end); |
2197 } | 2330 } |
2198 | 2331 |
2199 ElementBuilder _makeBuilder(ElementHolder holder) => | 2332 /** |
2200 new ElementBuilder(holder, new CompilationUnitElementImpl('test.dart')); | 2333 * Parse the given [code], and visit it with the given [visitor]. |
2201 | 2334 * Fail if any error is logged. |
2202 void _setBlockBodySourceRange(BlockFunctionBody body, int offset, int end) { | 2335 */ |
2203 _setNodeSourceRange(body.block, offset, end); | 2336 void _visitAstOfCode(String code, AstVisitor visitor) { |
2204 } | 2337 TestLogger logger = new TestLogger(); |
2205 | 2338 AnalysisEngine.instance.logger = logger; |
2206 void _setNodeSourceRange(AstNode node, int offset, int end) { | 2339 try { |
2207 node.beginToken.offset = offset; | 2340 _compilationUnit = ParserTestCase.parseCompilationUnit(code); |
2208 Token endToken = node.endToken; | 2341 compilationUnit.accept(visitor); |
2209 endToken.offset = end - endToken.length; | 2342 } finally { |
2210 } | 2343 expect(logger.log, hasLength(0)); |
2211 | 2344 AnalysisEngine.instance.logger = Logger.NULL; |
2212 void _useParameterInMethod( | 2345 } |
2213 FormalParameter formalParameter, int blockOffset, int blockEnd) { | |
2214 Block block = AstFactory.block(); | |
2215 block.leftBracket.offset = blockOffset; | |
2216 block.rightBracket.offset = blockEnd - 1; | |
2217 BlockFunctionBody body = AstFactory.blockFunctionBody(block); | |
2218 AstFactory.methodDeclaration2( | |
2219 null, | |
2220 null, | |
2221 null, | |
2222 null, | |
2223 AstFactory.identifier3("main"), | |
2224 AstFactory.formalParameterList([formalParameter]), | |
2225 body); | |
2226 } | 2346 } |
2227 } | 2347 } |
OLD | NEW |