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

Side by Side Diff: pkg/analyzer/test/dart/element/builder_test.dart

Issue 2428773004: Add tests showing using LocalElementBuilder separately, for variable or body. (Closed)
Patch Set: Add documentation for build*Initializer() methods. Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « pkg/analyzer/lib/src/dart/element/builder.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/dart/element/builder.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698