| 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 |