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(ApiElementBuilderTest); |
29 defineReflectiveTests(ElementBuilderTest); | 29 defineReflectiveTests(ElementBuilderTest); |
| 30 defineReflectiveTests(LocalElementBuilderTest); |
30 }); | 31 }); |
31 } | 32 } |
32 | 33 |
33 @reflectiveTest | 34 @reflectiveTest |
34 class ApiElementBuilderTest extends _BaseTest with _ApiElementBuilderTestMixin { | 35 class ApiElementBuilderTest extends _BaseTest with _ApiElementBuilderTestMixin { |
35 @override | 36 @override |
36 AstVisitor createElementBuilder(ElementHolder holder) { | 37 AstVisitor createElementBuilder(ElementHolder holder) { |
37 return new ApiElementBuilder(holder, compilationUnitElement); | 38 return new ApiElementBuilder(holder, compilationUnitElement); |
38 } | 39 } |
39 | 40 |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 expect(accessor.variable.setter, same(accessor)); | 180 expect(accessor.variable.setter, same(accessor)); |
180 } | 181 } |
181 } | 182 } |
182 | 183 |
183 @override | 184 @override |
184 void setUp() { | 185 void setUp() { |
185 super.setUp(); | 186 super.setUp(); |
186 compilationUnitElement = new CompilationUnitElementImpl('test.dart'); | 187 compilationUnitElement = new CompilationUnitElementImpl('test.dart'); |
187 } | 188 } |
188 | 189 |
189 void test_visitDefaultFormalParameter_noType() { | |
190 // p = 0 | |
191 String parameterName = 'p'; | |
192 DefaultFormalParameter formalParameter = | |
193 AstFactory.positionalFormalParameter( | |
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); | |
244 } | |
245 | |
246 void test_metadata_localVariableDeclaration() { | 190 void test_metadata_localVariableDeclaration() { |
247 List<LocalVariableElement> localVariables = | 191 List<LocalVariableElement> localVariables = |
248 buildElementsForText('f() { @a int x, y; }') | 192 buildElementsForText('f() { @a int x, y; }') |
249 .functions[0] | 193 .functions[0] |
250 .localVariables; | 194 .localVariables; |
251 checkMetadata(localVariables[0]); | 195 checkMetadata(localVariables[0]); |
252 checkMetadata(localVariables[1]); | 196 checkMetadata(localVariables[1]); |
253 expect(localVariables[0].metadata, same(localVariables[1].metadata)); | 197 expect(localVariables[0].metadata, same(localVariables[1].metadata)); |
254 } | 198 } |
255 | 199 |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
350 expect(variable.isConst, isFalse); | 294 expect(variable.isConst, isFalse); |
351 expect(variable.isDeprecated, isFalse); | 295 expect(variable.isDeprecated, isFalse); |
352 expect(variable.isFinal, isFalse); | 296 expect(variable.isFinal, isFalse); |
353 expect(variable.isOverride, isFalse); | 297 expect(variable.isOverride, isFalse); |
354 expect(variable.isPrivate, isFalse); | 298 expect(variable.isPrivate, isFalse); |
355 expect(variable.isPublic, isTrue); | 299 expect(variable.isPublic, isTrue); |
356 expect(variable.isSynthetic, isFalse); | 300 expect(variable.isSynthetic, isFalse); |
357 expect(variable.name, 'i'); | 301 expect(variable.name, 'i'); |
358 } | 302 } |
359 | 303 |
| 304 void test_visitDefaultFormalParameter_noType() { |
| 305 // p = 0 |
| 306 String parameterName = 'p'; |
| 307 DefaultFormalParameter formalParameter = |
| 308 AstFactory.positionalFormalParameter( |
| 309 AstFactory.simpleFormalParameter3(parameterName), |
| 310 AstFactory.integer(0)); |
| 311 formalParameter.beginToken.offset = 50; |
| 312 formalParameter.endToken.offset = 80; |
| 313 |
| 314 ElementHolder holder = buildElementsForAst(formalParameter); |
| 315 List<ParameterElement> parameters = holder.parameters; |
| 316 expect(parameters, hasLength(1)); |
| 317 ParameterElement parameter = parameters[0]; |
| 318 assertHasCodeRange(parameter, 50, 31); |
| 319 expect(parameter.hasImplicitType, isTrue); |
| 320 expect(parameter.initializer, isNotNull); |
| 321 expect(parameter.initializer.type, isNotNull); |
| 322 expect(parameter.initializer.hasImplicitReturnType, isTrue); |
| 323 expect(parameter.isConst, isFalse); |
| 324 expect(parameter.isDeprecated, isFalse); |
| 325 expect(parameter.isFinal, isFalse); |
| 326 expect(parameter.isInitializingFormal, isFalse); |
| 327 expect(parameter.isOverride, isFalse); |
| 328 expect(parameter.isPrivate, isFalse); |
| 329 expect(parameter.isPublic, isTrue); |
| 330 expect(parameter.isSynthetic, isFalse); |
| 331 expect(parameter.name, parameterName); |
| 332 } |
| 333 |
| 334 void test_visitDefaultFormalParameter_type() { |
| 335 // E p = 0 |
| 336 String parameterName = 'p'; |
| 337 DefaultFormalParameter formalParameter = AstFactory.namedFormalParameter( |
| 338 AstFactory.simpleFormalParameter4( |
| 339 AstFactory.typeName4('E'), parameterName), |
| 340 AstFactory.integer(0)); |
| 341 |
| 342 ElementHolder holder = buildElementsForAst(formalParameter); |
| 343 List<ParameterElement> parameters = holder.parameters; |
| 344 expect(parameters, hasLength(1)); |
| 345 ParameterElement parameter = parameters[0]; |
| 346 expect(parameter.hasImplicitType, isFalse); |
| 347 expect(parameter.initializer, isNotNull); |
| 348 expect(parameter.initializer.type, isNotNull); |
| 349 expect(parameter.initializer.hasImplicitReturnType, isTrue); |
| 350 expect(parameter.isConst, isFalse); |
| 351 expect(parameter.isDeprecated, isFalse); |
| 352 expect(parameter.isFinal, isFalse); |
| 353 expect(parameter.isInitializingFormal, isFalse); |
| 354 expect(parameter.isOverride, isFalse); |
| 355 expect(parameter.isPrivate, isFalse); |
| 356 expect(parameter.isPublic, isTrue); |
| 357 expect(parameter.isSynthetic, isFalse); |
| 358 expect(parameter.name, parameterName); |
| 359 } |
| 360 |
360 void test_visitFunctionExpression() { | 361 void test_visitFunctionExpression() { |
361 ElementHolder holder = new ElementHolder(); | 362 ElementHolder holder = new ElementHolder(); |
362 ElementBuilder builder = _makeBuilder(holder); | 363 ElementBuilder builder = _makeBuilder(holder); |
363 FunctionExpression expression = AstFactory.functionExpression2( | 364 FunctionExpression expression = AstFactory.functionExpression2( |
364 AstFactory.formalParameterList(), AstFactory.blockFunctionBody2()); | 365 AstFactory.formalParameterList(), AstFactory.blockFunctionBody2()); |
365 expression.accept(builder); | 366 expression.accept(builder); |
366 List<FunctionElement> functions = holder.functions; | 367 List<FunctionElement> functions = holder.functions; |
367 expect(functions, hasLength(1)); | 368 expect(functions, hasLength(1)); |
368 FunctionElement function = functions[0]; | 369 FunctionElement function = functions[0]; |
369 expect(function, isNotNull); | 370 expect(function, isNotNull); |
(...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
872 null, | 873 null, |
873 null, | 874 null, |
874 null, | 875 null, |
875 null, | 876 null, |
876 AstFactory.identifier3("main"), | 877 AstFactory.identifier3("main"), |
877 AstFactory.formalParameterList([formalParameter]), | 878 AstFactory.formalParameterList([formalParameter]), |
878 body); | 879 body); |
879 } | 880 } |
880 } | 881 } |
881 | 882 |
| 883 @reflectiveTest |
| 884 class LocalElementBuilderTest extends _BaseTest { |
| 885 @override |
| 886 AstVisitor createElementBuilder(ElementHolder holder) { |
| 887 return new LocalElementBuilder(holder, compilationUnitElement); |
| 888 } |
| 889 |
| 890 void test_buildLocalElements() { |
| 891 CompilationUnit unit = ParserTestCase.parseCompilationUnit(r''' |
| 892 main() { |
| 893 int v1; |
| 894 f1() { |
| 895 int v2; |
| 896 f2() { |
| 897 int v3; |
| 898 } |
| 899 } |
| 900 } |
| 901 '''); |
| 902 var mainAst = unit.declarations.single as FunctionDeclaration; |
| 903 // Build API elements. |
| 904 FunctionElementImpl main; |
| 905 { |
| 906 ElementHolder holder = new ElementHolder(); |
| 907 unit.accept(new ApiElementBuilder(holder, compilationUnitElement)); |
| 908 main = holder.functions.single as FunctionElementImpl; |
| 909 } |
| 910 expect(main.localVariables, isEmpty); |
| 911 expect(main.functions, isEmpty); |
| 912 // Build local elements in body. |
| 913 ElementHolder holder = new ElementHolder(); |
| 914 FunctionBody mainBody = mainAst.functionExpression.body; |
| 915 mainBody.accept(new LocalElementBuilder(holder, compilationUnitElement)); |
| 916 main.functions = holder.functions; |
| 917 main.localVariables = holder.localVariables; |
| 918 expect(main.localVariables.map((v) => v.name), ['v1']); |
| 919 expect(main.functions, hasLength(1)); |
| 920 { |
| 921 FunctionElement f1 = main.functions[0]; |
| 922 expect(f1.name, 'f1'); |
| 923 expect(f1.localVariables.map((v) => v.name), ['v2']); |
| 924 expect(f1.functions, hasLength(1)); |
| 925 { |
| 926 FunctionElement f2 = f1.functions[0]; |
| 927 expect(f2.name, 'f2'); |
| 928 expect(f2.localVariables.map((v) => v.name), ['v3']); |
| 929 expect(f2.functions, isEmpty); |
| 930 } |
| 931 } |
| 932 } |
| 933 |
| 934 void test_buildParameterInitializer() { |
| 935 CompilationUnit unit = ParserTestCase.parseCompilationUnit('f({p: 42}) {}'); |
| 936 var function = unit.declarations.single as FunctionDeclaration; |
| 937 var parameter = function.functionExpression.parameters.parameters.single |
| 938 as DefaultFormalParameter; |
| 939 // Build API elements. |
| 940 { |
| 941 ElementHolder holder = new ElementHolder(); |
| 942 unit.accept(new ApiElementBuilder(holder, compilationUnitElement)); |
| 943 } |
| 944 // Validate the parameter element. |
| 945 var parameterElement = parameter.element as ParameterElementImpl; |
| 946 expect(parameterElement, isNotNull); |
| 947 expect(parameterElement.initializer, isNull); |
| 948 // Build the initializer element. |
| 949 new LocalElementBuilder(new ElementHolder(), compilationUnitElement) |
| 950 .buildParameterInitializer(parameterElement, parameter.defaultValue); |
| 951 expect(parameterElement.initializer, isNotNull); |
| 952 } |
| 953 |
| 954 void test_buildVariableInitializer() { |
| 955 CompilationUnit unit = ParserTestCase.parseCompilationUnit('var V = 42;'); |
| 956 TopLevelVariableDeclaration topLevelDecl = |
| 957 unit.declarations[0] as TopLevelVariableDeclaration; |
| 958 VariableDeclaration variable = topLevelDecl.variables.variables.single; |
| 959 // Build the variable element. |
| 960 { |
| 961 ElementHolder holder = new ElementHolder(); |
| 962 unit.accept(new ApiElementBuilder(holder, compilationUnitElement)); |
| 963 } |
| 964 // Validate the variable element. |
| 965 var variableElement = variable.element as VariableElementImpl; |
| 966 expect(variableElement, isNotNull); |
| 967 expect(variableElement.initializer, isNull); |
| 968 // Build the initializer element. |
| 969 new LocalElementBuilder(new ElementHolder(), compilationUnitElement) |
| 970 .buildVariableInitializer(variableElement, variable.initializer); |
| 971 expect(variableElement.initializer, isNotNull); |
| 972 } |
| 973 |
| 974 void test_visitVariableDeclaration_local() { |
| 975 var holder = buildElementsForText('class C { m() { T v = null; } }'); |
| 976 List<LocalVariableElement> variableElements = holder.localVariables; |
| 977 expect(variableElements, hasLength(1)); |
| 978 LocalVariableElement variableElement = variableElements[0]; |
| 979 expect(variableElement.hasImplicitType, isFalse); |
| 980 expect(variableElement.name, 'v'); |
| 981 expect(variableElement.initializer, isNotNull); |
| 982 _assertVisibleRange(variableElement, 14, 29); |
| 983 } |
| 984 } |
| 985 |
882 /** | 986 /** |
883 * Mixin with test methods for testing element building in [ApiElementBuilder]. | 987 * Mixin with test methods for testing element building in [ApiElementBuilder]. |
884 * It is used to test the [ApiElementBuilder] itself, and its usage by | 988 * It is used to test the [ApiElementBuilder] itself, and its usage by |
885 * [ElementBuilder]. | 989 * [ElementBuilder]. |
886 */ | 990 */ |
887 abstract class _ApiElementBuilderTestMixin { | 991 abstract class _ApiElementBuilderTestMixin { |
888 CompilationUnit get compilationUnit; | 992 CompilationUnit get compilationUnit; |
889 | 993 |
890 void assertHasCodeRange(Element element, int offset, int length); | 994 void assertHasCodeRange(Element element, int offset, int length); |
891 | 995 |
(...skipping 1446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2338 AnalysisEngine.instance.logger = logger; | 2442 AnalysisEngine.instance.logger = logger; |
2339 try { | 2443 try { |
2340 _compilationUnit = ParserTestCase.parseCompilationUnit(code); | 2444 _compilationUnit = ParserTestCase.parseCompilationUnit(code); |
2341 compilationUnit.accept(visitor); | 2445 compilationUnit.accept(visitor); |
2342 } finally { | 2446 } finally { |
2343 expect(logger.log, hasLength(0)); | 2447 expect(logger.log, hasLength(0)); |
2344 AnalysisEngine.instance.logger = Logger.NULL; | 2448 AnalysisEngine.instance.logger = Logger.NULL; |
2345 } | 2449 } |
2346 } | 2450 } |
2347 } | 2451 } |
OLD | NEW |