| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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.generated.static_type_analyzer_test; | 5 library analyzer.test.generated.static_type_analyzer_test; |
| 6 | 6 |
| 7 import 'dart:collection'; | 7 import 'dart:collection'; |
| 8 | 8 |
| 9 import 'package:analyzer/dart/ast/ast.dart'; | 9 import 'package:analyzer/dart/ast/ast.dart'; |
| 10 import 'package:analyzer/dart/ast/token.dart'; | 10 import 'package:analyzer/dart/ast/token.dart'; |
| 11 import 'package:analyzer/dart/element/element.dart'; | 11 import 'package:analyzer/dart/element/element.dart'; |
| 12 import 'package:analyzer/dart/element/type.dart'; | 12 import 'package:analyzer/dart/element/type.dart'; |
| 13 import 'package:analyzer/file_system/memory_file_system.dart'; | 13 import 'package:analyzer/file_system/memory_file_system.dart'; |
| 14 import 'package:analyzer/src/dart/element/element.dart'; | 14 import 'package:analyzer/src/dart/element/element.dart'; |
| 15 import 'package:analyzer/src/dart/element/member.dart'; | 15 import 'package:analyzer/src/dart/element/member.dart'; |
| 16 import 'package:analyzer/src/dart/element/type.dart'; | 16 import 'package:analyzer/src/dart/element/type.dart'; |
| 17 import 'package:analyzer/src/generated/engine.dart'; | 17 import 'package:analyzer/src/generated/engine.dart'; |
| 18 import 'package:analyzer/src/generated/resolver.dart'; | 18 import 'package:analyzer/src/generated/resolver.dart'; |
| 19 import 'package:analyzer/src/generated/source.dart'; | 19 import 'package:analyzer/src/generated/source.dart'; |
| 20 import 'package:analyzer/src/generated/static_type_analyzer.dart'; | 20 import 'package:analyzer/src/generated/static_type_analyzer.dart'; |
| 21 import 'package:analyzer/src/generated/testing/ast_factory.dart'; | 21 import 'package:analyzer/src/generated/testing/ast_test_factory.dart'; |
| 22 import 'package:analyzer/src/generated/testing/element_factory.dart'; | 22 import 'package:analyzer/src/generated/testing/element_factory.dart'; |
| 23 import 'package:analyzer/src/generated/testing/test_type_provider.dart'; | 23 import 'package:analyzer/src/generated/testing/test_type_provider.dart'; |
| 24 import 'package:analyzer/src/generated/testing/token_factory.dart'; | 24 import 'package:analyzer/src/generated/testing/token_factory.dart'; |
| 25 import 'package:analyzer/src/source/source_resource.dart'; | 25 import 'package:analyzer/src/source/source_resource.dart'; |
| 26 import 'package:test/test.dart'; | 26 import 'package:test/test.dart'; |
| 27 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 27 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
| 28 | 28 |
| 29 import 'analysis_context_factory.dart'; | 29 import 'analysis_context_factory.dart'; |
| 30 import 'resolver_test_case.dart'; | 30 import 'resolver_test_case.dart'; |
| 31 import 'test_support.dart'; | 31 import 'test_support.dart'; |
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 347 futureType.instantiate([intType]) | 347 futureType.instantiate([intType]) |
| 348 ]; | 348 ]; |
| 349 // flatten(A) = A and flatten(B) = B, since neither string nor int is more | 349 // flatten(A) = A and flatten(B) = B, since neither string nor int is more |
| 350 // specific than the other. | 350 // specific than the other. |
| 351 expect(_flatten(classA.type), classA.type); | 351 expect(_flatten(classA.type), classA.type); |
| 352 expect(_flatten(classB.type), classB.type); | 352 expect(_flatten(classB.type), classB.type); |
| 353 } | 353 } |
| 354 | 354 |
| 355 void test_visitAdjacentStrings() { | 355 void test_visitAdjacentStrings() { |
| 356 // "a" "b" | 356 // "a" "b" |
| 357 Expression node = AstFactory | 357 Expression node = AstTestFactory |
| 358 .adjacentStrings([_resolvedString("a"), _resolvedString("b")]); | 358 .adjacentStrings([_resolvedString("a"), _resolvedString("b")]); |
| 359 expect(_analyze(node), same(_typeProvider.stringType)); | 359 expect(_analyze(node), same(_typeProvider.stringType)); |
| 360 _listener.assertNoErrors(); | 360 _listener.assertNoErrors(); |
| 361 } | 361 } |
| 362 | 362 |
| 363 void test_visitAsExpression() { | 363 void test_visitAsExpression() { |
| 364 // class A { ... this as B ... } | 364 // class A { ... this as B ... } |
| 365 // class B extends A {} | 365 // class B extends A {} |
| 366 ClassElement superclass = ElementFactory.classElement2("A"); | 366 ClassElement superclass = ElementFactory.classElement2("A"); |
| 367 InterfaceType superclassType = superclass.type; | 367 InterfaceType superclassType = superclass.type; |
| 368 ClassElement subclass = ElementFactory.classElement("B", superclassType); | 368 ClassElement subclass = ElementFactory.classElement("B", superclassType); |
| 369 Expression node = AstFactory.asExpression( | 369 Expression node = AstTestFactory.asExpression( |
| 370 AstFactory.thisExpression(), AstFactory.typeName(subclass)); | 370 AstTestFactory.thisExpression(), AstTestFactory.typeName(subclass)); |
| 371 expect(_analyze3(node, superclassType), same(subclass.type)); | 371 expect(_analyze3(node, superclassType), same(subclass.type)); |
| 372 _listener.assertNoErrors(); | 372 _listener.assertNoErrors(); |
| 373 } | 373 } |
| 374 | 374 |
| 375 void test_visitAssignmentExpression_compound_II() { | 375 void test_visitAssignmentExpression_compound_II() { |
| 376 validate(TokenType operator) { | 376 validate(TokenType operator) { |
| 377 InterfaceType numType = _typeProvider.numType; | 377 InterfaceType numType = _typeProvider.numType; |
| 378 InterfaceType intType = _typeProvider.intType; | 378 InterfaceType intType = _typeProvider.intType; |
| 379 SimpleIdentifier identifier = _resolvedVariable(intType, "i"); | 379 SimpleIdentifier identifier = _resolvedVariable(intType, "i"); |
| 380 AssignmentExpression node = AstFactory.assignmentExpression( | 380 AssignmentExpression node = AstTestFactory.assignmentExpression( |
| 381 identifier, operator, _resolvedInteger(1)); | 381 identifier, operator, _resolvedInteger(1)); |
| 382 MethodElement plusMethod = getMethod(numType, "+"); | 382 MethodElement plusMethod = getMethod(numType, "+"); |
| 383 node.staticElement = plusMethod; | 383 node.staticElement = plusMethod; |
| 384 expect(_analyze(node), same(intType)); | 384 expect(_analyze(node), same(intType)); |
| 385 _listener.assertNoErrors(); | 385 _listener.assertNoErrors(); |
| 386 } | 386 } |
| 387 | 387 |
| 388 validate(TokenType.MINUS_EQ); | 388 validate(TokenType.MINUS_EQ); |
| 389 validate(TokenType.PERCENT_EQ); | 389 validate(TokenType.PERCENT_EQ); |
| 390 validate(TokenType.PLUS_EQ); | 390 validate(TokenType.PLUS_EQ); |
| 391 validate(TokenType.STAR_EQ); | 391 validate(TokenType.STAR_EQ); |
| 392 validate(TokenType.TILDE_SLASH_EQ); | 392 validate(TokenType.TILDE_SLASH_EQ); |
| 393 } | 393 } |
| 394 | 394 |
| 395 void test_visitAssignmentExpression_compound_lazy() { | 395 void test_visitAssignmentExpression_compound_lazy() { |
| 396 validate(TokenType operator) { | 396 validate(TokenType operator) { |
| 397 InterfaceType boolType = _typeProvider.boolType; | 397 InterfaceType boolType = _typeProvider.boolType; |
| 398 SimpleIdentifier identifier = _resolvedVariable(boolType, "b"); | 398 SimpleIdentifier identifier = _resolvedVariable(boolType, "b"); |
| 399 AssignmentExpression node = AstFactory.assignmentExpression( | 399 AssignmentExpression node = AstTestFactory.assignmentExpression( |
| 400 identifier, operator, _resolvedBool(true)); | 400 identifier, operator, _resolvedBool(true)); |
| 401 expect(_analyze(node), same(boolType)); | 401 expect(_analyze(node), same(boolType)); |
| 402 _listener.assertNoErrors(); | 402 _listener.assertNoErrors(); |
| 403 } | 403 } |
| 404 | 404 |
| 405 validate(TokenType.AMPERSAND_AMPERSAND_EQ); | 405 validate(TokenType.AMPERSAND_AMPERSAND_EQ); |
| 406 validate(TokenType.BAR_BAR_EQ); | 406 validate(TokenType.BAR_BAR_EQ); |
| 407 } | 407 } |
| 408 | 408 |
| 409 void test_visitAssignmentExpression_compound_plusID() { | 409 void test_visitAssignmentExpression_compound_plusID() { |
| 410 validate(TokenType operator) { | 410 validate(TokenType operator) { |
| 411 InterfaceType numType = _typeProvider.numType; | 411 InterfaceType numType = _typeProvider.numType; |
| 412 InterfaceType intType = _typeProvider.intType; | 412 InterfaceType intType = _typeProvider.intType; |
| 413 InterfaceType doubleType = _typeProvider.doubleType; | 413 InterfaceType doubleType = _typeProvider.doubleType; |
| 414 SimpleIdentifier identifier = _resolvedVariable(intType, "i"); | 414 SimpleIdentifier identifier = _resolvedVariable(intType, "i"); |
| 415 AssignmentExpression node = AstFactory.assignmentExpression( | 415 AssignmentExpression node = AstTestFactory.assignmentExpression( |
| 416 identifier, operator, _resolvedDouble(1.0)); | 416 identifier, operator, _resolvedDouble(1.0)); |
| 417 MethodElement plusMethod = getMethod(numType, "+"); | 417 MethodElement plusMethod = getMethod(numType, "+"); |
| 418 node.staticElement = plusMethod; | 418 node.staticElement = plusMethod; |
| 419 expect(_analyze(node), same(doubleType)); | 419 expect(_analyze(node), same(doubleType)); |
| 420 _listener.assertNoErrors(); | 420 _listener.assertNoErrors(); |
| 421 } | 421 } |
| 422 | 422 |
| 423 validate(TokenType.MINUS_EQ); | 423 validate(TokenType.MINUS_EQ); |
| 424 validate(TokenType.PERCENT_EQ); | 424 validate(TokenType.PERCENT_EQ); |
| 425 validate(TokenType.PLUS_EQ); | 425 validate(TokenType.PLUS_EQ); |
| 426 validate(TokenType.STAR_EQ); | 426 validate(TokenType.STAR_EQ); |
| 427 } | 427 } |
| 428 | 428 |
| 429 void test_visitAssignmentExpression_compoundIfNull_differentTypes() { | 429 void test_visitAssignmentExpression_compoundIfNull_differentTypes() { |
| 430 // double d; d ??= 0 | 430 // double d; d ??= 0 |
| 431 Expression node = AstFactory.assignmentExpression( | 431 Expression node = AstTestFactory.assignmentExpression( |
| 432 _resolvedVariable(_typeProvider.doubleType, 'd'), | 432 _resolvedVariable(_typeProvider.doubleType, 'd'), |
| 433 TokenType.QUESTION_QUESTION_EQ, | 433 TokenType.QUESTION_QUESTION_EQ, |
| 434 _resolvedInteger(0)); | 434 _resolvedInteger(0)); |
| 435 expect(_analyze(node), same(_typeProvider.numType)); | 435 expect(_analyze(node), same(_typeProvider.numType)); |
| 436 _listener.assertNoErrors(); | 436 _listener.assertNoErrors(); |
| 437 } | 437 } |
| 438 | 438 |
| 439 void test_visitAssignmentExpression_compoundIfNull_sameTypes() { | 439 void test_visitAssignmentExpression_compoundIfNull_sameTypes() { |
| 440 // int i; i ??= 0 | 440 // int i; i ??= 0 |
| 441 Expression node = AstFactory.assignmentExpression( | 441 Expression node = AstTestFactory.assignmentExpression( |
| 442 _resolvedVariable(_typeProvider.intType, 'i'), | 442 _resolvedVariable(_typeProvider.intType, 'i'), |
| 443 TokenType.QUESTION_QUESTION_EQ, | 443 TokenType.QUESTION_QUESTION_EQ, |
| 444 _resolvedInteger(0)); | 444 _resolvedInteger(0)); |
| 445 expect(_analyze(node), same(_typeProvider.intType)); | 445 expect(_analyze(node), same(_typeProvider.intType)); |
| 446 _listener.assertNoErrors(); | 446 _listener.assertNoErrors(); |
| 447 } | 447 } |
| 448 | 448 |
| 449 void test_visitAssignmentExpression_simple() { | 449 void test_visitAssignmentExpression_simple() { |
| 450 // i = 0 | 450 // i = 0 |
| 451 InterfaceType intType = _typeProvider.intType; | 451 InterfaceType intType = _typeProvider.intType; |
| 452 Expression node = AstFactory.assignmentExpression( | 452 Expression node = AstTestFactory.assignmentExpression( |
| 453 _resolvedVariable(intType, "i"), TokenType.EQ, _resolvedInteger(0)); | 453 _resolvedVariable(intType, "i"), TokenType.EQ, _resolvedInteger(0)); |
| 454 expect(_analyze(node), same(intType)); | 454 expect(_analyze(node), same(intType)); |
| 455 _listener.assertNoErrors(); | 455 _listener.assertNoErrors(); |
| 456 } | 456 } |
| 457 | 457 |
| 458 void test_visitAwaitExpression_flattened() { | 458 void test_visitAwaitExpression_flattened() { |
| 459 // await e, where e has type Future<Future<int>> | 459 // await e, where e has type Future<Future<int>> |
| 460 InterfaceType intType = _typeProvider.intType; | 460 InterfaceType intType = _typeProvider.intType; |
| 461 InterfaceType futureIntType = | 461 InterfaceType futureIntType = |
| 462 _typeProvider.futureType.instantiate(<DartType>[intType]); | 462 _typeProvider.futureType.instantiate(<DartType>[intType]); |
| 463 InterfaceType futureFutureIntType = | 463 InterfaceType futureFutureIntType = |
| 464 _typeProvider.futureType.instantiate(<DartType>[futureIntType]); | 464 _typeProvider.futureType.instantiate(<DartType>[futureIntType]); |
| 465 Expression node = | 465 Expression node = AstTestFactory |
| 466 AstFactory.awaitExpression(_resolvedVariable(futureFutureIntType, 'e')); | 466 .awaitExpression(_resolvedVariable(futureFutureIntType, 'e')); |
| 467 expect(_analyze(node), same(intType)); | 467 expect(_analyze(node), same(intType)); |
| 468 _listener.assertNoErrors(); | 468 _listener.assertNoErrors(); |
| 469 } | 469 } |
| 470 | 470 |
| 471 void test_visitAwaitExpression_simple() { | 471 void test_visitAwaitExpression_simple() { |
| 472 // await e, where e has type Future<int> | 472 // await e, where e has type Future<int> |
| 473 InterfaceType intType = _typeProvider.intType; | 473 InterfaceType intType = _typeProvider.intType; |
| 474 InterfaceType futureIntType = | 474 InterfaceType futureIntType = |
| 475 _typeProvider.futureType.instantiate(<DartType>[intType]); | 475 _typeProvider.futureType.instantiate(<DartType>[intType]); |
| 476 Expression node = | 476 Expression node = |
| 477 AstFactory.awaitExpression(_resolvedVariable(futureIntType, 'e')); | 477 AstTestFactory.awaitExpression(_resolvedVariable(futureIntType, 'e')); |
| 478 expect(_analyze(node), same(intType)); | 478 expect(_analyze(node), same(intType)); |
| 479 _listener.assertNoErrors(); | 479 _listener.assertNoErrors(); |
| 480 } | 480 } |
| 481 | 481 |
| 482 void test_visitBinaryExpression_equals() { | 482 void test_visitBinaryExpression_equals() { |
| 483 // 2 == 3 | 483 // 2 == 3 |
| 484 Expression node = AstFactory.binaryExpression( | 484 Expression node = AstTestFactory.binaryExpression( |
| 485 _resolvedInteger(2), TokenType.EQ_EQ, _resolvedInteger(3)); | 485 _resolvedInteger(2), TokenType.EQ_EQ, _resolvedInteger(3)); |
| 486 expect(_analyze(node), same(_typeProvider.boolType)); | 486 expect(_analyze(node), same(_typeProvider.boolType)); |
| 487 _listener.assertNoErrors(); | 487 _listener.assertNoErrors(); |
| 488 } | 488 } |
| 489 | 489 |
| 490 void test_visitBinaryExpression_ifNull() { | 490 void test_visitBinaryExpression_ifNull() { |
| 491 // 1 ?? 1.5 | 491 // 1 ?? 1.5 |
| 492 Expression node = AstFactory.binaryExpression( | 492 Expression node = AstTestFactory.binaryExpression( |
| 493 _resolvedInteger(1), TokenType.QUESTION_QUESTION, _resolvedDouble(1.5)); | 493 _resolvedInteger(1), TokenType.QUESTION_QUESTION, _resolvedDouble(1.5)); |
| 494 expect(_analyze(node), same(_typeProvider.numType)); | 494 expect(_analyze(node), same(_typeProvider.numType)); |
| 495 _listener.assertNoErrors(); | 495 _listener.assertNoErrors(); |
| 496 } | 496 } |
| 497 | 497 |
| 498 void test_visitBinaryExpression_logicalAnd() { | 498 void test_visitBinaryExpression_logicalAnd() { |
| 499 // false && true | 499 // false && true |
| 500 Expression node = AstFactory.binaryExpression( | 500 Expression node = AstTestFactory.binaryExpression( |
| 501 AstFactory.booleanLiteral(false), | 501 AstTestFactory.booleanLiteral(false), |
| 502 TokenType.AMPERSAND_AMPERSAND, | 502 TokenType.AMPERSAND_AMPERSAND, |
| 503 AstFactory.booleanLiteral(true)); | 503 AstTestFactory.booleanLiteral(true)); |
| 504 expect(_analyze(node), same(_typeProvider.boolType)); | 504 expect(_analyze(node), same(_typeProvider.boolType)); |
| 505 _listener.assertNoErrors(); | 505 _listener.assertNoErrors(); |
| 506 } | 506 } |
| 507 | 507 |
| 508 void test_visitBinaryExpression_logicalOr() { | 508 void test_visitBinaryExpression_logicalOr() { |
| 509 // false || true | 509 // false || true |
| 510 Expression node = AstFactory.binaryExpression( | 510 Expression node = AstTestFactory.binaryExpression( |
| 511 AstFactory.booleanLiteral(false), | 511 AstTestFactory.booleanLiteral(false), |
| 512 TokenType.BAR_BAR, | 512 TokenType.BAR_BAR, |
| 513 AstFactory.booleanLiteral(true)); | 513 AstTestFactory.booleanLiteral(true)); |
| 514 expect(_analyze(node), same(_typeProvider.boolType)); | 514 expect(_analyze(node), same(_typeProvider.boolType)); |
| 515 _listener.assertNoErrors(); | 515 _listener.assertNoErrors(); |
| 516 } | 516 } |
| 517 | 517 |
| 518 void test_visitBinaryExpression_minusID_propagated() { | 518 void test_visitBinaryExpression_minusID_propagated() { |
| 519 // a - b | 519 // a - b |
| 520 BinaryExpression node = AstFactory.binaryExpression( | 520 BinaryExpression node = AstTestFactory.binaryExpression( |
| 521 _propagatedVariable(_typeProvider.intType, 'a'), | 521 _propagatedVariable(_typeProvider.intType, 'a'), |
| 522 TokenType.MINUS, | 522 TokenType.MINUS, |
| 523 _propagatedVariable(_typeProvider.doubleType, 'b')); | 523 _propagatedVariable(_typeProvider.doubleType, 'b')); |
| 524 node.propagatedElement = getMethod(_typeProvider.numType, "+"); | 524 node.propagatedElement = getMethod(_typeProvider.numType, "+"); |
| 525 _analyze(node); | 525 _analyze(node); |
| 526 expect(node.propagatedType, same(_typeProvider.doubleType)); | 526 expect(node.propagatedType, same(_typeProvider.doubleType)); |
| 527 _listener.assertNoErrors(); | 527 _listener.assertNoErrors(); |
| 528 } | 528 } |
| 529 | 529 |
| 530 void test_visitBinaryExpression_notEquals() { | 530 void test_visitBinaryExpression_notEquals() { |
| 531 // 2 != 3 | 531 // 2 != 3 |
| 532 Expression node = AstFactory.binaryExpression( | 532 Expression node = AstTestFactory.binaryExpression( |
| 533 _resolvedInteger(2), TokenType.BANG_EQ, _resolvedInteger(3)); | 533 _resolvedInteger(2), TokenType.BANG_EQ, _resolvedInteger(3)); |
| 534 expect(_analyze(node), same(_typeProvider.boolType)); | 534 expect(_analyze(node), same(_typeProvider.boolType)); |
| 535 _listener.assertNoErrors(); | 535 _listener.assertNoErrors(); |
| 536 } | 536 } |
| 537 | 537 |
| 538 void test_visitBinaryExpression_plusID() { | 538 void test_visitBinaryExpression_plusID() { |
| 539 // 1 + 2.0 | 539 // 1 + 2.0 |
| 540 BinaryExpression node = AstFactory.binaryExpression( | 540 BinaryExpression node = AstTestFactory.binaryExpression( |
| 541 _resolvedInteger(1), TokenType.PLUS, _resolvedDouble(2.0)); | 541 _resolvedInteger(1), TokenType.PLUS, _resolvedDouble(2.0)); |
| 542 node.staticElement = getMethod(_typeProvider.numType, "+"); | 542 node.staticElement = getMethod(_typeProvider.numType, "+"); |
| 543 expect(_analyze(node), same(_typeProvider.doubleType)); | 543 expect(_analyze(node), same(_typeProvider.doubleType)); |
| 544 _listener.assertNoErrors(); | 544 _listener.assertNoErrors(); |
| 545 } | 545 } |
| 546 | 546 |
| 547 void test_visitBinaryExpression_plusII() { | 547 void test_visitBinaryExpression_plusII() { |
| 548 // 1 + 2 | 548 // 1 + 2 |
| 549 BinaryExpression node = AstFactory.binaryExpression( | 549 BinaryExpression node = AstTestFactory.binaryExpression( |
| 550 _resolvedInteger(1), TokenType.PLUS, _resolvedInteger(2)); | 550 _resolvedInteger(1), TokenType.PLUS, _resolvedInteger(2)); |
| 551 node.staticElement = getMethod(_typeProvider.numType, "+"); | 551 node.staticElement = getMethod(_typeProvider.numType, "+"); |
| 552 expect(_analyze(node), same(_typeProvider.intType)); | 552 expect(_analyze(node), same(_typeProvider.intType)); |
| 553 _listener.assertNoErrors(); | 553 _listener.assertNoErrors(); |
| 554 } | 554 } |
| 555 | 555 |
| 556 void test_visitBinaryExpression_plusII_propagated() { | 556 void test_visitBinaryExpression_plusII_propagated() { |
| 557 // a + b | 557 // a + b |
| 558 BinaryExpression node = AstFactory.binaryExpression( | 558 BinaryExpression node = AstTestFactory.binaryExpression( |
| 559 _propagatedVariable(_typeProvider.intType, 'a'), | 559 _propagatedVariable(_typeProvider.intType, 'a'), |
| 560 TokenType.PLUS, | 560 TokenType.PLUS, |
| 561 _propagatedVariable(_typeProvider.intType, 'b')); | 561 _propagatedVariable(_typeProvider.intType, 'b')); |
| 562 node.propagatedElement = getMethod(_typeProvider.numType, "+"); | 562 node.propagatedElement = getMethod(_typeProvider.numType, "+"); |
| 563 _analyze(node); | 563 _analyze(node); |
| 564 expect(node.propagatedType, same(_typeProvider.intType)); | 564 expect(node.propagatedType, same(_typeProvider.intType)); |
| 565 _listener.assertNoErrors(); | 565 _listener.assertNoErrors(); |
| 566 } | 566 } |
| 567 | 567 |
| 568 void test_visitBinaryExpression_slash() { | 568 void test_visitBinaryExpression_slash() { |
| 569 // 2 / 2 | 569 // 2 / 2 |
| 570 BinaryExpression node = AstFactory.binaryExpression( | 570 BinaryExpression node = AstTestFactory.binaryExpression( |
| 571 _resolvedInteger(2), TokenType.SLASH, _resolvedInteger(2)); | 571 _resolvedInteger(2), TokenType.SLASH, _resolvedInteger(2)); |
| 572 node.staticElement = getMethod(_typeProvider.numType, "/"); | 572 node.staticElement = getMethod(_typeProvider.numType, "/"); |
| 573 expect(_analyze(node), same(_typeProvider.doubleType)); | 573 expect(_analyze(node), same(_typeProvider.doubleType)); |
| 574 _listener.assertNoErrors(); | 574 _listener.assertNoErrors(); |
| 575 } | 575 } |
| 576 | 576 |
| 577 void test_visitBinaryExpression_star_notSpecial() { | 577 void test_visitBinaryExpression_star_notSpecial() { |
| 578 // class A { | 578 // class A { |
| 579 // A operator *(double value); | 579 // A operator *(double value); |
| 580 // } | 580 // } |
| 581 // (a as A) * 2.0 | 581 // (a as A) * 2.0 |
| 582 ClassElementImpl classA = ElementFactory.classElement2("A"); | 582 ClassElementImpl classA = ElementFactory.classElement2("A"); |
| 583 InterfaceType typeA = classA.type; | 583 InterfaceType typeA = classA.type; |
| 584 MethodElement operator = | 584 MethodElement operator = |
| 585 ElementFactory.methodElement("*", typeA, [_typeProvider.doubleType]); | 585 ElementFactory.methodElement("*", typeA, [_typeProvider.doubleType]); |
| 586 classA.methods = <MethodElement>[operator]; | 586 classA.methods = <MethodElement>[operator]; |
| 587 BinaryExpression node = AstFactory.binaryExpression( | 587 BinaryExpression node = AstTestFactory.binaryExpression( |
| 588 AstFactory.asExpression( | 588 AstTestFactory.asExpression( |
| 589 AstFactory.identifier3("a"), AstFactory.typeName(classA)), | 589 AstTestFactory.identifier3("a"), AstTestFactory.typeName(classA)), |
| 590 TokenType.PLUS, | 590 TokenType.PLUS, |
| 591 _resolvedDouble(2.0)); | 591 _resolvedDouble(2.0)); |
| 592 node.staticElement = operator; | 592 node.staticElement = operator; |
| 593 expect(_analyze(node), same(typeA)); | 593 expect(_analyze(node), same(typeA)); |
| 594 _listener.assertNoErrors(); | 594 _listener.assertNoErrors(); |
| 595 } | 595 } |
| 596 | 596 |
| 597 void test_visitBinaryExpression_starID() { | 597 void test_visitBinaryExpression_starID() { |
| 598 // 1 * 2.0 | 598 // 1 * 2.0 |
| 599 BinaryExpression node = AstFactory.binaryExpression( | 599 BinaryExpression node = AstTestFactory.binaryExpression( |
| 600 _resolvedInteger(1), TokenType.PLUS, _resolvedDouble(2.0)); | 600 _resolvedInteger(1), TokenType.PLUS, _resolvedDouble(2.0)); |
| 601 node.staticElement = getMethod(_typeProvider.numType, "*"); | 601 node.staticElement = getMethod(_typeProvider.numType, "*"); |
| 602 expect(_analyze(node), same(_typeProvider.doubleType)); | 602 expect(_analyze(node), same(_typeProvider.doubleType)); |
| 603 _listener.assertNoErrors(); | 603 _listener.assertNoErrors(); |
| 604 } | 604 } |
| 605 | 605 |
| 606 void test_visitBooleanLiteral_false() { | 606 void test_visitBooleanLiteral_false() { |
| 607 // false | 607 // false |
| 608 Expression node = AstFactory.booleanLiteral(false); | 608 Expression node = AstTestFactory.booleanLiteral(false); |
| 609 expect(_analyze(node), same(_typeProvider.boolType)); | 609 expect(_analyze(node), same(_typeProvider.boolType)); |
| 610 _listener.assertNoErrors(); | 610 _listener.assertNoErrors(); |
| 611 } | 611 } |
| 612 | 612 |
| 613 void test_visitBooleanLiteral_true() { | 613 void test_visitBooleanLiteral_true() { |
| 614 // true | 614 // true |
| 615 Expression node = AstFactory.booleanLiteral(true); | 615 Expression node = AstTestFactory.booleanLiteral(true); |
| 616 expect(_analyze(node), same(_typeProvider.boolType)); | 616 expect(_analyze(node), same(_typeProvider.boolType)); |
| 617 _listener.assertNoErrors(); | 617 _listener.assertNoErrors(); |
| 618 } | 618 } |
| 619 | 619 |
| 620 void test_visitCascadeExpression() { | 620 void test_visitCascadeExpression() { |
| 621 // a..length | 621 // a..length |
| 622 Expression node = AstFactory.cascadeExpression( | 622 Expression node = AstTestFactory.cascadeExpression( |
| 623 _resolvedString("a"), [AstFactory.propertyAccess2(null, "length")]); | 623 _resolvedString("a"), [AstTestFactory.propertyAccess2(null, "length")]); |
| 624 expect(_analyze(node), same(_typeProvider.stringType)); | 624 expect(_analyze(node), same(_typeProvider.stringType)); |
| 625 _listener.assertNoErrors(); | 625 _listener.assertNoErrors(); |
| 626 } | 626 } |
| 627 | 627 |
| 628 void test_visitConditionalExpression_differentTypes() { | 628 void test_visitConditionalExpression_differentTypes() { |
| 629 // true ? 1.0 : 0 | 629 // true ? 1.0 : 0 |
| 630 Expression node = AstFactory.conditionalExpression( | 630 Expression node = AstTestFactory.conditionalExpression( |
| 631 AstFactory.booleanLiteral(true), | 631 AstTestFactory.booleanLiteral(true), |
| 632 _resolvedDouble(1.0), | 632 _resolvedDouble(1.0), |
| 633 _resolvedInteger(0)); | 633 _resolvedInteger(0)); |
| 634 expect(_analyze(node), same(_typeProvider.numType)); | 634 expect(_analyze(node), same(_typeProvider.numType)); |
| 635 _listener.assertNoErrors(); | 635 _listener.assertNoErrors(); |
| 636 } | 636 } |
| 637 | 637 |
| 638 void test_visitConditionalExpression_sameTypes() { | 638 void test_visitConditionalExpression_sameTypes() { |
| 639 // true ? 1 : 0 | 639 // true ? 1 : 0 |
| 640 Expression node = AstFactory.conditionalExpression( | 640 Expression node = AstTestFactory.conditionalExpression( |
| 641 AstFactory.booleanLiteral(true), | 641 AstTestFactory.booleanLiteral(true), |
| 642 _resolvedInteger(1), | 642 _resolvedInteger(1), |
| 643 _resolvedInteger(0)); | 643 _resolvedInteger(0)); |
| 644 expect(_analyze(node), same(_typeProvider.intType)); | 644 expect(_analyze(node), same(_typeProvider.intType)); |
| 645 _listener.assertNoErrors(); | 645 _listener.assertNoErrors(); |
| 646 } | 646 } |
| 647 | 647 |
| 648 void test_visitDoubleLiteral() { | 648 void test_visitDoubleLiteral() { |
| 649 // 4.33 | 649 // 4.33 |
| 650 Expression node = AstFactory.doubleLiteral(4.33); | 650 Expression node = AstTestFactory.doubleLiteral(4.33); |
| 651 expect(_analyze(node), same(_typeProvider.doubleType)); | 651 expect(_analyze(node), same(_typeProvider.doubleType)); |
| 652 _listener.assertNoErrors(); | 652 _listener.assertNoErrors(); |
| 653 } | 653 } |
| 654 | 654 |
| 655 void test_visitFunctionExpression_async_block() { | 655 void test_visitFunctionExpression_async_block() { |
| 656 // () async {} | 656 // () async {} |
| 657 BlockFunctionBody body = AstFactory.blockFunctionBody2(); | 657 BlockFunctionBody body = AstTestFactory.blockFunctionBody2(); |
| 658 body.keyword = TokenFactory.tokenFromString('async'); | 658 body.keyword = TokenFactory.tokenFromString('async'); |
| 659 FunctionExpression node = | 659 FunctionExpression node = _resolvedFunctionExpression( |
| 660 _resolvedFunctionExpression(AstFactory.formalParameterList([]), body); | 660 AstTestFactory.formalParameterList([]), body); |
| 661 DartType resultType = _analyze(node); | 661 DartType resultType = _analyze(node); |
| 662 _assertFunctionType( | 662 _assertFunctionType( |
| 663 _typeProvider.futureDynamicType, null, null, null, resultType); | 663 _typeProvider.futureDynamicType, null, null, null, resultType); |
| 664 _listener.assertNoErrors(); | 664 _listener.assertNoErrors(); |
| 665 } | 665 } |
| 666 | 666 |
| 667 void test_visitFunctionExpression_async_expression() { | 667 void test_visitFunctionExpression_async_expression() { |
| 668 // () async => e, where e has type int | 668 // () async => e, where e has type int |
| 669 InterfaceType intType = _typeProvider.intType; | 669 InterfaceType intType = _typeProvider.intType; |
| 670 InterfaceType futureIntType = | 670 InterfaceType futureIntType = |
| 671 _typeProvider.futureType.instantiate(<DartType>[intType]); | 671 _typeProvider.futureType.instantiate(<DartType>[intType]); |
| 672 Expression expression = _resolvedVariable(intType, 'e'); | 672 Expression expression = _resolvedVariable(intType, 'e'); |
| 673 ExpressionFunctionBody body = AstFactory.expressionFunctionBody(expression); | 673 ExpressionFunctionBody body = |
| 674 AstTestFactory.expressionFunctionBody(expression); |
| 674 body.keyword = TokenFactory.tokenFromString('async'); | 675 body.keyword = TokenFactory.tokenFromString('async'); |
| 675 FunctionExpression node = | 676 FunctionExpression node = _resolvedFunctionExpression( |
| 676 _resolvedFunctionExpression(AstFactory.formalParameterList([]), body); | 677 AstTestFactory.formalParameterList([]), body); |
| 677 DartType resultType = _analyze(node); | 678 DartType resultType = _analyze(node); |
| 678 _assertFunctionType(futureIntType, null, null, null, resultType); | 679 _assertFunctionType(futureIntType, null, null, null, resultType); |
| 679 _listener.assertNoErrors(); | 680 _listener.assertNoErrors(); |
| 680 } | 681 } |
| 681 | 682 |
| 682 void test_visitFunctionExpression_async_expression_flatten() { | 683 void test_visitFunctionExpression_async_expression_flatten() { |
| 683 // () async => e, where e has type Future<int> | 684 // () async => e, where e has type Future<int> |
| 684 InterfaceType intType = _typeProvider.intType; | 685 InterfaceType intType = _typeProvider.intType; |
| 685 InterfaceType futureIntType = | 686 InterfaceType futureIntType = |
| 686 _typeProvider.futureType.instantiate(<DartType>[intType]); | 687 _typeProvider.futureType.instantiate(<DartType>[intType]); |
| 687 Expression expression = _resolvedVariable(futureIntType, 'e'); | 688 Expression expression = _resolvedVariable(futureIntType, 'e'); |
| 688 ExpressionFunctionBody body = AstFactory.expressionFunctionBody(expression); | 689 ExpressionFunctionBody body = |
| 690 AstTestFactory.expressionFunctionBody(expression); |
| 689 body.keyword = TokenFactory.tokenFromString('async'); | 691 body.keyword = TokenFactory.tokenFromString('async'); |
| 690 FunctionExpression node = | 692 FunctionExpression node = _resolvedFunctionExpression( |
| 691 _resolvedFunctionExpression(AstFactory.formalParameterList([]), body); | 693 AstTestFactory.formalParameterList([]), body); |
| 692 DartType resultType = _analyze(node); | 694 DartType resultType = _analyze(node); |
| 693 _assertFunctionType(futureIntType, null, null, null, resultType); | 695 _assertFunctionType(futureIntType, null, null, null, resultType); |
| 694 _listener.assertNoErrors(); | 696 _listener.assertNoErrors(); |
| 695 } | 697 } |
| 696 | 698 |
| 697 void test_visitFunctionExpression_async_expression_flatten_twice() { | 699 void test_visitFunctionExpression_async_expression_flatten_twice() { |
| 698 // () async => e, where e has type Future<Future<int>> | 700 // () async => e, where e has type Future<Future<int>> |
| 699 InterfaceType intType = _typeProvider.intType; | 701 InterfaceType intType = _typeProvider.intType; |
| 700 InterfaceType futureIntType = | 702 InterfaceType futureIntType = |
| 701 _typeProvider.futureType.instantiate(<DartType>[intType]); | 703 _typeProvider.futureType.instantiate(<DartType>[intType]); |
| 702 InterfaceType futureFutureIntType = | 704 InterfaceType futureFutureIntType = |
| 703 _typeProvider.futureType.instantiate(<DartType>[futureIntType]); | 705 _typeProvider.futureType.instantiate(<DartType>[futureIntType]); |
| 704 Expression expression = _resolvedVariable(futureFutureIntType, 'e'); | 706 Expression expression = _resolvedVariable(futureFutureIntType, 'e'); |
| 705 ExpressionFunctionBody body = AstFactory.expressionFunctionBody(expression); | 707 ExpressionFunctionBody body = |
| 708 AstTestFactory.expressionFunctionBody(expression); |
| 706 body.keyword = TokenFactory.tokenFromString('async'); | 709 body.keyword = TokenFactory.tokenFromString('async'); |
| 707 FunctionExpression node = | 710 FunctionExpression node = _resolvedFunctionExpression( |
| 708 _resolvedFunctionExpression(AstFactory.formalParameterList([]), body); | 711 AstTestFactory.formalParameterList([]), body); |
| 709 DartType resultType = _analyze(node); | 712 DartType resultType = _analyze(node); |
| 710 _assertFunctionType(futureIntType, null, null, null, resultType); | 713 _assertFunctionType(futureIntType, null, null, null, resultType); |
| 711 _listener.assertNoErrors(); | 714 _listener.assertNoErrors(); |
| 712 } | 715 } |
| 713 | 716 |
| 714 void test_visitFunctionExpression_generator_async() { | 717 void test_visitFunctionExpression_generator_async() { |
| 715 // () async* {} | 718 // () async* {} |
| 716 BlockFunctionBody body = AstFactory.blockFunctionBody2(); | 719 BlockFunctionBody body = AstTestFactory.blockFunctionBody2(); |
| 717 body.keyword = TokenFactory.tokenFromString('async'); | 720 body.keyword = TokenFactory.tokenFromString('async'); |
| 718 body.star = TokenFactory.tokenFromType(TokenType.STAR); | 721 body.star = TokenFactory.tokenFromType(TokenType.STAR); |
| 719 FunctionExpression node = | 722 FunctionExpression node = _resolvedFunctionExpression( |
| 720 _resolvedFunctionExpression(AstFactory.formalParameterList([]), body); | 723 AstTestFactory.formalParameterList([]), body); |
| 721 DartType resultType = _analyze(node); | 724 DartType resultType = _analyze(node); |
| 722 _assertFunctionType( | 725 _assertFunctionType( |
| 723 _typeProvider.streamDynamicType, null, null, null, resultType); | 726 _typeProvider.streamDynamicType, null, null, null, resultType); |
| 724 _listener.assertNoErrors(); | 727 _listener.assertNoErrors(); |
| 725 } | 728 } |
| 726 | 729 |
| 727 void test_visitFunctionExpression_generator_sync() { | 730 void test_visitFunctionExpression_generator_sync() { |
| 728 // () sync* {} | 731 // () sync* {} |
| 729 BlockFunctionBody body = AstFactory.blockFunctionBody2(); | 732 BlockFunctionBody body = AstTestFactory.blockFunctionBody2(); |
| 730 body.keyword = TokenFactory.tokenFromString('sync'); | 733 body.keyword = TokenFactory.tokenFromString('sync'); |
| 731 body.star = TokenFactory.tokenFromType(TokenType.STAR); | 734 body.star = TokenFactory.tokenFromType(TokenType.STAR); |
| 732 FunctionExpression node = | 735 FunctionExpression node = _resolvedFunctionExpression( |
| 733 _resolvedFunctionExpression(AstFactory.formalParameterList([]), body); | 736 AstTestFactory.formalParameterList([]), body); |
| 734 DartType resultType = _analyze(node); | 737 DartType resultType = _analyze(node); |
| 735 _assertFunctionType( | 738 _assertFunctionType( |
| 736 _typeProvider.iterableDynamicType, null, null, null, resultType); | 739 _typeProvider.iterableDynamicType, null, null, null, resultType); |
| 737 _listener.assertNoErrors(); | 740 _listener.assertNoErrors(); |
| 738 } | 741 } |
| 739 | 742 |
| 740 void test_visitFunctionExpression_named_block() { | 743 void test_visitFunctionExpression_named_block() { |
| 741 // ({p1 : 0, p2 : 0}) {} | 744 // ({p1 : 0, p2 : 0}) {} |
| 742 DartType dynamicType = _typeProvider.dynamicType; | 745 DartType dynamicType = _typeProvider.dynamicType; |
| 743 FormalParameter p1 = AstFactory.namedFormalParameter( | 746 FormalParameter p1 = AstTestFactory.namedFormalParameter( |
| 744 AstFactory.simpleFormalParameter3("p1"), _resolvedInteger(0)); | 747 AstTestFactory.simpleFormalParameter3("p1"), _resolvedInteger(0)); |
| 745 _setType(p1, dynamicType); | 748 _setType(p1, dynamicType); |
| 746 FormalParameter p2 = AstFactory.namedFormalParameter( | 749 FormalParameter p2 = AstTestFactory.namedFormalParameter( |
| 747 AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0)); | 750 AstTestFactory.simpleFormalParameter3("p2"), _resolvedInteger(0)); |
| 748 _setType(p2, dynamicType); | 751 _setType(p2, dynamicType); |
| 749 FunctionExpression node = _resolvedFunctionExpression( | 752 FunctionExpression node = _resolvedFunctionExpression( |
| 750 AstFactory.formalParameterList([p1, p2]), | 753 AstTestFactory.formalParameterList([p1, p2]), |
| 751 AstFactory.blockFunctionBody2()); | 754 AstTestFactory.blockFunctionBody2()); |
| 752 _analyze5(p1); | 755 _analyze5(p1); |
| 753 _analyze5(p2); | 756 _analyze5(p2); |
| 754 DartType resultType = _analyze(node); | 757 DartType resultType = _analyze(node); |
| 755 Map<String, DartType> expectedNamedTypes = new HashMap<String, DartType>(); | 758 Map<String, DartType> expectedNamedTypes = new HashMap<String, DartType>(); |
| 756 expectedNamedTypes["p1"] = dynamicType; | 759 expectedNamedTypes["p1"] = dynamicType; |
| 757 expectedNamedTypes["p2"] = dynamicType; | 760 expectedNamedTypes["p2"] = dynamicType; |
| 758 _assertFunctionType( | 761 _assertFunctionType( |
| 759 dynamicType, null, null, expectedNamedTypes, resultType); | 762 dynamicType, null, null, expectedNamedTypes, resultType); |
| 760 _listener.assertNoErrors(); | 763 _listener.assertNoErrors(); |
| 761 } | 764 } |
| 762 | 765 |
| 763 void test_visitFunctionExpression_named_expression() { | 766 void test_visitFunctionExpression_named_expression() { |
| 764 // ({p : 0}) -> 0; | 767 // ({p : 0}) -> 0; |
| 765 DartType dynamicType = _typeProvider.dynamicType; | 768 DartType dynamicType = _typeProvider.dynamicType; |
| 766 FormalParameter p = AstFactory.namedFormalParameter( | 769 FormalParameter p = AstTestFactory.namedFormalParameter( |
| 767 AstFactory.simpleFormalParameter3("p"), _resolvedInteger(0)); | 770 AstTestFactory.simpleFormalParameter3("p"), _resolvedInteger(0)); |
| 768 _setType(p, dynamicType); | 771 _setType(p, dynamicType); |
| 769 FunctionExpression node = _resolvedFunctionExpression( | 772 FunctionExpression node = _resolvedFunctionExpression( |
| 770 AstFactory.formalParameterList([p]), | 773 AstTestFactory.formalParameterList([p]), |
| 771 AstFactory.expressionFunctionBody(_resolvedInteger(0))); | 774 AstTestFactory.expressionFunctionBody(_resolvedInteger(0))); |
| 772 _analyze5(p); | 775 _analyze5(p); |
| 773 DartType resultType = _analyze(node); | 776 DartType resultType = _analyze(node); |
| 774 Map<String, DartType> expectedNamedTypes = new HashMap<String, DartType>(); | 777 Map<String, DartType> expectedNamedTypes = new HashMap<String, DartType>(); |
| 775 expectedNamedTypes["p"] = dynamicType; | 778 expectedNamedTypes["p"] = dynamicType; |
| 776 _assertFunctionType( | 779 _assertFunctionType( |
| 777 _typeProvider.intType, null, null, expectedNamedTypes, resultType); | 780 _typeProvider.intType, null, null, expectedNamedTypes, resultType); |
| 778 _listener.assertNoErrors(); | 781 _listener.assertNoErrors(); |
| 779 } | 782 } |
| 780 | 783 |
| 781 void test_visitFunctionExpression_normal_block() { | 784 void test_visitFunctionExpression_normal_block() { |
| 782 // (p1, p2) {} | 785 // (p1, p2) {} |
| 783 DartType dynamicType = _typeProvider.dynamicType; | 786 DartType dynamicType = _typeProvider.dynamicType; |
| 784 FormalParameter p1 = AstFactory.simpleFormalParameter3("p1"); | 787 FormalParameter p1 = AstTestFactory.simpleFormalParameter3("p1"); |
| 785 _setType(p1, dynamicType); | 788 _setType(p1, dynamicType); |
| 786 FormalParameter p2 = AstFactory.simpleFormalParameter3("p2"); | 789 FormalParameter p2 = AstTestFactory.simpleFormalParameter3("p2"); |
| 787 _setType(p2, dynamicType); | 790 _setType(p2, dynamicType); |
| 788 FunctionExpression node = _resolvedFunctionExpression( | 791 FunctionExpression node = _resolvedFunctionExpression( |
| 789 AstFactory.formalParameterList([p1, p2]), | 792 AstTestFactory.formalParameterList([p1, p2]), |
| 790 AstFactory.blockFunctionBody2()); | 793 AstTestFactory.blockFunctionBody2()); |
| 791 _analyze5(p1); | 794 _analyze5(p1); |
| 792 _analyze5(p2); | 795 _analyze5(p2); |
| 793 DartType resultType = _analyze(node); | 796 DartType resultType = _analyze(node); |
| 794 _assertFunctionType(dynamicType, <DartType>[dynamicType, dynamicType], null, | 797 _assertFunctionType(dynamicType, <DartType>[dynamicType, dynamicType], null, |
| 795 null, resultType); | 798 null, resultType); |
| 796 _listener.assertNoErrors(); | 799 _listener.assertNoErrors(); |
| 797 } | 800 } |
| 798 | 801 |
| 799 void test_visitFunctionExpression_normal_expression() { | 802 void test_visitFunctionExpression_normal_expression() { |
| 800 // (p1, p2) -> 0 | 803 // (p1, p2) -> 0 |
| 801 DartType dynamicType = _typeProvider.dynamicType; | 804 DartType dynamicType = _typeProvider.dynamicType; |
| 802 FormalParameter p = AstFactory.simpleFormalParameter3("p"); | 805 FormalParameter p = AstTestFactory.simpleFormalParameter3("p"); |
| 803 _setType(p, dynamicType); | 806 _setType(p, dynamicType); |
| 804 FunctionExpression node = _resolvedFunctionExpression( | 807 FunctionExpression node = _resolvedFunctionExpression( |
| 805 AstFactory.formalParameterList([p]), | 808 AstTestFactory.formalParameterList([p]), |
| 806 AstFactory.expressionFunctionBody(_resolvedInteger(0))); | 809 AstTestFactory.expressionFunctionBody(_resolvedInteger(0))); |
| 807 _analyze5(p); | 810 _analyze5(p); |
| 808 DartType resultType = _analyze(node); | 811 DartType resultType = _analyze(node); |
| 809 _assertFunctionType( | 812 _assertFunctionType( |
| 810 _typeProvider.intType, <DartType>[dynamicType], null, null, resultType); | 813 _typeProvider.intType, <DartType>[dynamicType], null, null, resultType); |
| 811 _listener.assertNoErrors(); | 814 _listener.assertNoErrors(); |
| 812 } | 815 } |
| 813 | 816 |
| 814 void test_visitFunctionExpression_normalAndNamed_block() { | 817 void test_visitFunctionExpression_normalAndNamed_block() { |
| 815 // (p1, {p2 : 0}) {} | 818 // (p1, {p2 : 0}) {} |
| 816 DartType dynamicType = _typeProvider.dynamicType; | 819 DartType dynamicType = _typeProvider.dynamicType; |
| 817 FormalParameter p1 = AstFactory.simpleFormalParameter3("p1"); | 820 FormalParameter p1 = AstTestFactory.simpleFormalParameter3("p1"); |
| 818 _setType(p1, dynamicType); | 821 _setType(p1, dynamicType); |
| 819 FormalParameter p2 = AstFactory.namedFormalParameter( | 822 FormalParameter p2 = AstTestFactory.namedFormalParameter( |
| 820 AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0)); | 823 AstTestFactory.simpleFormalParameter3("p2"), _resolvedInteger(0)); |
| 821 _setType(p2, dynamicType); | 824 _setType(p2, dynamicType); |
| 822 FunctionExpression node = _resolvedFunctionExpression( | 825 FunctionExpression node = _resolvedFunctionExpression( |
| 823 AstFactory.formalParameterList([p1, p2]), | 826 AstTestFactory.formalParameterList([p1, p2]), |
| 824 AstFactory.blockFunctionBody2()); | 827 AstTestFactory.blockFunctionBody2()); |
| 825 _analyze5(p2); | 828 _analyze5(p2); |
| 826 DartType resultType = _analyze(node); | 829 DartType resultType = _analyze(node); |
| 827 Map<String, DartType> expectedNamedTypes = new HashMap<String, DartType>(); | 830 Map<String, DartType> expectedNamedTypes = new HashMap<String, DartType>(); |
| 828 expectedNamedTypes["p2"] = dynamicType; | 831 expectedNamedTypes["p2"] = dynamicType; |
| 829 _assertFunctionType(dynamicType, <DartType>[dynamicType], null, | 832 _assertFunctionType(dynamicType, <DartType>[dynamicType], null, |
| 830 expectedNamedTypes, resultType); | 833 expectedNamedTypes, resultType); |
| 831 _listener.assertNoErrors(); | 834 _listener.assertNoErrors(); |
| 832 } | 835 } |
| 833 | 836 |
| 834 void test_visitFunctionExpression_normalAndNamed_expression() { | 837 void test_visitFunctionExpression_normalAndNamed_expression() { |
| 835 // (p1, {p2 : 0}) -> 0 | 838 // (p1, {p2 : 0}) -> 0 |
| 836 DartType dynamicType = _typeProvider.dynamicType; | 839 DartType dynamicType = _typeProvider.dynamicType; |
| 837 FormalParameter p1 = AstFactory.simpleFormalParameter3("p1"); | 840 FormalParameter p1 = AstTestFactory.simpleFormalParameter3("p1"); |
| 838 _setType(p1, dynamicType); | 841 _setType(p1, dynamicType); |
| 839 FormalParameter p2 = AstFactory.namedFormalParameter( | 842 FormalParameter p2 = AstTestFactory.namedFormalParameter( |
| 840 AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0)); | 843 AstTestFactory.simpleFormalParameter3("p2"), _resolvedInteger(0)); |
| 841 _setType(p2, dynamicType); | 844 _setType(p2, dynamicType); |
| 842 FunctionExpression node = _resolvedFunctionExpression( | 845 FunctionExpression node = _resolvedFunctionExpression( |
| 843 AstFactory.formalParameterList([p1, p2]), | 846 AstTestFactory.formalParameterList([p1, p2]), |
| 844 AstFactory.expressionFunctionBody(_resolvedInteger(0))); | 847 AstTestFactory.expressionFunctionBody(_resolvedInteger(0))); |
| 845 _analyze5(p2); | 848 _analyze5(p2); |
| 846 DartType resultType = _analyze(node); | 849 DartType resultType = _analyze(node); |
| 847 Map<String, DartType> expectedNamedTypes = new HashMap<String, DartType>(); | 850 Map<String, DartType> expectedNamedTypes = new HashMap<String, DartType>(); |
| 848 expectedNamedTypes["p2"] = dynamicType; | 851 expectedNamedTypes["p2"] = dynamicType; |
| 849 _assertFunctionType(_typeProvider.intType, <DartType>[dynamicType], null, | 852 _assertFunctionType(_typeProvider.intType, <DartType>[dynamicType], null, |
| 850 expectedNamedTypes, resultType); | 853 expectedNamedTypes, resultType); |
| 851 _listener.assertNoErrors(); | 854 _listener.assertNoErrors(); |
| 852 } | 855 } |
| 853 | 856 |
| 854 void test_visitFunctionExpression_normalAndPositional_block() { | 857 void test_visitFunctionExpression_normalAndPositional_block() { |
| 855 // (p1, [p2 = 0]) {} | 858 // (p1, [p2 = 0]) {} |
| 856 DartType dynamicType = _typeProvider.dynamicType; | 859 DartType dynamicType = _typeProvider.dynamicType; |
| 857 FormalParameter p1 = AstFactory.simpleFormalParameter3("p1"); | 860 FormalParameter p1 = AstTestFactory.simpleFormalParameter3("p1"); |
| 858 _setType(p1, dynamicType); | 861 _setType(p1, dynamicType); |
| 859 FormalParameter p2 = AstFactory.positionalFormalParameter( | 862 FormalParameter p2 = AstTestFactory.positionalFormalParameter( |
| 860 AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0)); | 863 AstTestFactory.simpleFormalParameter3("p2"), _resolvedInteger(0)); |
| 861 _setType(p2, dynamicType); | 864 _setType(p2, dynamicType); |
| 862 FunctionExpression node = _resolvedFunctionExpression( | 865 FunctionExpression node = _resolvedFunctionExpression( |
| 863 AstFactory.formalParameterList([p1, p2]), | 866 AstTestFactory.formalParameterList([p1, p2]), |
| 864 AstFactory.blockFunctionBody2()); | 867 AstTestFactory.blockFunctionBody2()); |
| 865 _analyze5(p1); | 868 _analyze5(p1); |
| 866 _analyze5(p2); | 869 _analyze5(p2); |
| 867 DartType resultType = _analyze(node); | 870 DartType resultType = _analyze(node); |
| 868 _assertFunctionType(dynamicType, <DartType>[dynamicType], | 871 _assertFunctionType(dynamicType, <DartType>[dynamicType], |
| 869 <DartType>[dynamicType], null, resultType); | 872 <DartType>[dynamicType], null, resultType); |
| 870 _listener.assertNoErrors(); | 873 _listener.assertNoErrors(); |
| 871 } | 874 } |
| 872 | 875 |
| 873 void test_visitFunctionExpression_normalAndPositional_expression() { | 876 void test_visitFunctionExpression_normalAndPositional_expression() { |
| 874 // (p1, [p2 = 0]) -> 0 | 877 // (p1, [p2 = 0]) -> 0 |
| 875 DartType dynamicType = _typeProvider.dynamicType; | 878 DartType dynamicType = _typeProvider.dynamicType; |
| 876 FormalParameter p1 = AstFactory.simpleFormalParameter3("p1"); | 879 FormalParameter p1 = AstTestFactory.simpleFormalParameter3("p1"); |
| 877 _setType(p1, dynamicType); | 880 _setType(p1, dynamicType); |
| 878 FormalParameter p2 = AstFactory.positionalFormalParameter( | 881 FormalParameter p2 = AstTestFactory.positionalFormalParameter( |
| 879 AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0)); | 882 AstTestFactory.simpleFormalParameter3("p2"), _resolvedInteger(0)); |
| 880 _setType(p2, dynamicType); | 883 _setType(p2, dynamicType); |
| 881 FunctionExpression node = _resolvedFunctionExpression( | 884 FunctionExpression node = _resolvedFunctionExpression( |
| 882 AstFactory.formalParameterList([p1, p2]), | 885 AstTestFactory.formalParameterList([p1, p2]), |
| 883 AstFactory.expressionFunctionBody(_resolvedInteger(0))); | 886 AstTestFactory.expressionFunctionBody(_resolvedInteger(0))); |
| 884 _analyze5(p1); | 887 _analyze5(p1); |
| 885 _analyze5(p2); | 888 _analyze5(p2); |
| 886 DartType resultType = _analyze(node); | 889 DartType resultType = _analyze(node); |
| 887 _assertFunctionType(_typeProvider.intType, <DartType>[dynamicType], | 890 _assertFunctionType(_typeProvider.intType, <DartType>[dynamicType], |
| 888 <DartType>[dynamicType], null, resultType); | 891 <DartType>[dynamicType], null, resultType); |
| 889 _listener.assertNoErrors(); | 892 _listener.assertNoErrors(); |
| 890 } | 893 } |
| 891 | 894 |
| 892 void test_visitFunctionExpression_positional_block() { | 895 void test_visitFunctionExpression_positional_block() { |
| 893 // ([p1 = 0, p2 = 0]) {} | 896 // ([p1 = 0, p2 = 0]) {} |
| 894 DartType dynamicType = _typeProvider.dynamicType; | 897 DartType dynamicType = _typeProvider.dynamicType; |
| 895 FormalParameter p1 = AstFactory.positionalFormalParameter( | 898 FormalParameter p1 = AstTestFactory.positionalFormalParameter( |
| 896 AstFactory.simpleFormalParameter3("p1"), _resolvedInteger(0)); | 899 AstTestFactory.simpleFormalParameter3("p1"), _resolvedInteger(0)); |
| 897 _setType(p1, dynamicType); | 900 _setType(p1, dynamicType); |
| 898 FormalParameter p2 = AstFactory.positionalFormalParameter( | 901 FormalParameter p2 = AstTestFactory.positionalFormalParameter( |
| 899 AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0)); | 902 AstTestFactory.simpleFormalParameter3("p2"), _resolvedInteger(0)); |
| 900 _setType(p2, dynamicType); | 903 _setType(p2, dynamicType); |
| 901 FunctionExpression node = _resolvedFunctionExpression( | 904 FunctionExpression node = _resolvedFunctionExpression( |
| 902 AstFactory.formalParameterList([p1, p2]), | 905 AstTestFactory.formalParameterList([p1, p2]), |
| 903 AstFactory.blockFunctionBody2()); | 906 AstTestFactory.blockFunctionBody2()); |
| 904 _analyze5(p1); | 907 _analyze5(p1); |
| 905 _analyze5(p2); | 908 _analyze5(p2); |
| 906 DartType resultType = _analyze(node); | 909 DartType resultType = _analyze(node); |
| 907 _assertFunctionType(dynamicType, null, <DartType>[dynamicType, dynamicType], | 910 _assertFunctionType(dynamicType, null, <DartType>[dynamicType, dynamicType], |
| 908 null, resultType); | 911 null, resultType); |
| 909 _listener.assertNoErrors(); | 912 _listener.assertNoErrors(); |
| 910 } | 913 } |
| 911 | 914 |
| 912 void test_visitFunctionExpression_positional_expression() { | 915 void test_visitFunctionExpression_positional_expression() { |
| 913 // ([p1 = 0, p2 = 0]) -> 0 | 916 // ([p1 = 0, p2 = 0]) -> 0 |
| 914 DartType dynamicType = _typeProvider.dynamicType; | 917 DartType dynamicType = _typeProvider.dynamicType; |
| 915 FormalParameter p = AstFactory.positionalFormalParameter( | 918 FormalParameter p = AstTestFactory.positionalFormalParameter( |
| 916 AstFactory.simpleFormalParameter3("p"), _resolvedInteger(0)); | 919 AstTestFactory.simpleFormalParameter3("p"), _resolvedInteger(0)); |
| 917 _setType(p, dynamicType); | 920 _setType(p, dynamicType); |
| 918 FunctionExpression node = _resolvedFunctionExpression( | 921 FunctionExpression node = _resolvedFunctionExpression( |
| 919 AstFactory.formalParameterList([p]), | 922 AstTestFactory.formalParameterList([p]), |
| 920 AstFactory.expressionFunctionBody(_resolvedInteger(0))); | 923 AstTestFactory.expressionFunctionBody(_resolvedInteger(0))); |
| 921 _analyze5(p); | 924 _analyze5(p); |
| 922 DartType resultType = _analyze(node); | 925 DartType resultType = _analyze(node); |
| 923 _assertFunctionType( | 926 _assertFunctionType( |
| 924 _typeProvider.intType, null, <DartType>[dynamicType], null, resultType); | 927 _typeProvider.intType, null, <DartType>[dynamicType], null, resultType); |
| 925 _listener.assertNoErrors(); | 928 _listener.assertNoErrors(); |
| 926 } | 929 } |
| 927 | 930 |
| 928 void test_visitIndexExpression_getter() { | 931 void test_visitIndexExpression_getter() { |
| 929 // List a; | 932 // List a; |
| 930 // a[2] | 933 // a[2] |
| 931 InterfaceType listType = _typeProvider.listType; | 934 InterfaceType listType = _typeProvider.listType; |
| 932 SimpleIdentifier identifier = _resolvedVariable(listType, "a"); | 935 SimpleIdentifier identifier = _resolvedVariable(listType, "a"); |
| 933 IndexExpression node = | 936 IndexExpression node = |
| 934 AstFactory.indexExpression(identifier, _resolvedInteger(2)); | 937 AstTestFactory.indexExpression(identifier, _resolvedInteger(2)); |
| 935 MethodElement indexMethod = listType.element.methods[0]; | 938 MethodElement indexMethod = listType.element.methods[0]; |
| 936 node.staticElement = indexMethod; | 939 node.staticElement = indexMethod; |
| 937 expect(_analyze(node), same(listType.typeArguments[0])); | 940 expect(_analyze(node), same(listType.typeArguments[0])); |
| 938 _listener.assertNoErrors(); | 941 _listener.assertNoErrors(); |
| 939 } | 942 } |
| 940 | 943 |
| 941 void test_visitIndexExpression_setter() { | 944 void test_visitIndexExpression_setter() { |
| 942 // List a; | 945 // List a; |
| 943 // a[2] = 0 | 946 // a[2] = 0 |
| 944 InterfaceType listType = _typeProvider.listType; | 947 InterfaceType listType = _typeProvider.listType; |
| 945 SimpleIdentifier identifier = _resolvedVariable(listType, "a"); | 948 SimpleIdentifier identifier = _resolvedVariable(listType, "a"); |
| 946 IndexExpression node = | 949 IndexExpression node = |
| 947 AstFactory.indexExpression(identifier, _resolvedInteger(2)); | 950 AstTestFactory.indexExpression(identifier, _resolvedInteger(2)); |
| 948 MethodElement indexMethod = listType.element.methods[1]; | 951 MethodElement indexMethod = listType.element.methods[1]; |
| 949 node.staticElement = indexMethod; | 952 node.staticElement = indexMethod; |
| 950 AstFactory.assignmentExpression(node, TokenType.EQ, AstFactory.integer(0)); | 953 AstTestFactory.assignmentExpression( |
| 954 node, TokenType.EQ, AstTestFactory.integer(0)); |
| 951 expect(_analyze(node), same(listType.typeArguments[0])); | 955 expect(_analyze(node), same(listType.typeArguments[0])); |
| 952 _listener.assertNoErrors(); | 956 _listener.assertNoErrors(); |
| 953 } | 957 } |
| 954 | 958 |
| 955 void test_visitIndexExpression_typeParameters() { | 959 void test_visitIndexExpression_typeParameters() { |
| 956 // List<int> list = ... | 960 // List<int> list = ... |
| 957 // list[0] | 961 // list[0] |
| 958 InterfaceType intType = _typeProvider.intType; | 962 InterfaceType intType = _typeProvider.intType; |
| 959 InterfaceType listType = _typeProvider.listType; | 963 InterfaceType listType = _typeProvider.listType; |
| 960 // (int) -> E | 964 // (int) -> E |
| 961 MethodElement methodElement = getMethod(listType, "[]"); | 965 MethodElement methodElement = getMethod(listType, "[]"); |
| 962 // "list" has type List<int> | 966 // "list" has type List<int> |
| 963 SimpleIdentifier identifier = AstFactory.identifier3("list"); | 967 SimpleIdentifier identifier = AstTestFactory.identifier3("list"); |
| 964 InterfaceType listOfIntType = listType.instantiate(<DartType>[intType]); | 968 InterfaceType listOfIntType = listType.instantiate(<DartType>[intType]); |
| 965 identifier.staticType = listOfIntType; | 969 identifier.staticType = listOfIntType; |
| 966 // list[0] has MethodElement element (int) -> E | 970 // list[0] has MethodElement element (int) -> E |
| 967 IndexExpression indexExpression = | 971 IndexExpression indexExpression = |
| 968 AstFactory.indexExpression(identifier, AstFactory.integer(0)); | 972 AstTestFactory.indexExpression(identifier, AstTestFactory.integer(0)); |
| 969 MethodElement indexMethod = MethodMember.from(methodElement, listOfIntType); | 973 MethodElement indexMethod = MethodMember.from(methodElement, listOfIntType); |
| 970 indexExpression.staticElement = indexMethod; | 974 indexExpression.staticElement = indexMethod; |
| 971 // analyze and assert result of the index expression | 975 // analyze and assert result of the index expression |
| 972 expect(_analyze(indexExpression), same(intType)); | 976 expect(_analyze(indexExpression), same(intType)); |
| 973 _listener.assertNoErrors(); | 977 _listener.assertNoErrors(); |
| 974 } | 978 } |
| 975 | 979 |
| 976 void test_visitIndexExpression_typeParameters_inSetterContext() { | 980 void test_visitIndexExpression_typeParameters_inSetterContext() { |
| 977 // List<int> list = ... | 981 // List<int> list = ... |
| 978 // list[0] = 0; | 982 // list[0] = 0; |
| 979 InterfaceType intType = _typeProvider.intType; | 983 InterfaceType intType = _typeProvider.intType; |
| 980 InterfaceType listType = _typeProvider.listType; | 984 InterfaceType listType = _typeProvider.listType; |
| 981 // (int, E) -> void | 985 // (int, E) -> void |
| 982 MethodElement methodElement = getMethod(listType, "[]="); | 986 MethodElement methodElement = getMethod(listType, "[]="); |
| 983 // "list" has type List<int> | 987 // "list" has type List<int> |
| 984 SimpleIdentifier identifier = AstFactory.identifier3("list"); | 988 SimpleIdentifier identifier = AstTestFactory.identifier3("list"); |
| 985 InterfaceType listOfIntType = listType.instantiate(<DartType>[intType]); | 989 InterfaceType listOfIntType = listType.instantiate(<DartType>[intType]); |
| 986 identifier.staticType = listOfIntType; | 990 identifier.staticType = listOfIntType; |
| 987 // list[0] has MethodElement element (int) -> E | 991 // list[0] has MethodElement element (int) -> E |
| 988 IndexExpression indexExpression = | 992 IndexExpression indexExpression = |
| 989 AstFactory.indexExpression(identifier, AstFactory.integer(0)); | 993 AstTestFactory.indexExpression(identifier, AstTestFactory.integer(0)); |
| 990 MethodElement indexMethod = MethodMember.from(methodElement, listOfIntType); | 994 MethodElement indexMethod = MethodMember.from(methodElement, listOfIntType); |
| 991 indexExpression.staticElement = indexMethod; | 995 indexExpression.staticElement = indexMethod; |
| 992 // list[0] should be in a setter context | 996 // list[0] should be in a setter context |
| 993 AstFactory.assignmentExpression( | 997 AstTestFactory.assignmentExpression( |
| 994 indexExpression, TokenType.EQ, AstFactory.integer(0)); | 998 indexExpression, TokenType.EQ, AstTestFactory.integer(0)); |
| 995 // analyze and assert result of the index expression | 999 // analyze and assert result of the index expression |
| 996 expect(_analyze(indexExpression), same(intType)); | 1000 expect(_analyze(indexExpression), same(intType)); |
| 997 _listener.assertNoErrors(); | 1001 _listener.assertNoErrors(); |
| 998 } | 1002 } |
| 999 | 1003 |
| 1000 void test_visitInstanceCreationExpression_named() { | 1004 void test_visitInstanceCreationExpression_named() { |
| 1001 // new C.m() | 1005 // new C.m() |
| 1002 ClassElementImpl classElement = ElementFactory.classElement2("C"); | 1006 ClassElementImpl classElement = ElementFactory.classElement2("C"); |
| 1003 String constructorName = "m"; | 1007 String constructorName = "m"; |
| 1004 ConstructorElementImpl constructor = | 1008 ConstructorElementImpl constructor = |
| 1005 ElementFactory.constructorElement2(classElement, constructorName); | 1009 ElementFactory.constructorElement2(classElement, constructorName); |
| 1006 classElement.constructors = <ConstructorElement>[constructor]; | 1010 classElement.constructors = <ConstructorElement>[constructor]; |
| 1007 InstanceCreationExpression node = AstFactory.instanceCreationExpression2( | 1011 InstanceCreationExpression node = AstTestFactory |
| 1008 null, | 1012 .instanceCreationExpression2( |
| 1009 AstFactory.typeName(classElement), | 1013 null, |
| 1010 [AstFactory.identifier3(constructorName)]); | 1014 AstTestFactory.typeName(classElement), |
| 1015 [AstTestFactory.identifier3(constructorName)]); |
| 1011 node.staticElement = constructor; | 1016 node.staticElement = constructor; |
| 1012 expect(_analyze(node), same(classElement.type)); | 1017 expect(_analyze(node), same(classElement.type)); |
| 1013 _listener.assertNoErrors(); | 1018 _listener.assertNoErrors(); |
| 1014 } | 1019 } |
| 1015 | 1020 |
| 1016 void test_visitInstanceCreationExpression_typeParameters() { | 1021 void test_visitInstanceCreationExpression_typeParameters() { |
| 1017 // new C<I>() | 1022 // new C<I>() |
| 1018 ClassElementImpl elementC = ElementFactory.classElement2("C", ["E"]); | 1023 ClassElementImpl elementC = ElementFactory.classElement2("C", ["E"]); |
| 1019 ClassElementImpl elementI = ElementFactory.classElement2("I"); | 1024 ClassElementImpl elementI = ElementFactory.classElement2("I"); |
| 1020 ConstructorElementImpl constructor = | 1025 ConstructorElementImpl constructor = |
| 1021 ElementFactory.constructorElement2(elementC, null); | 1026 ElementFactory.constructorElement2(elementC, null); |
| 1022 elementC.constructors = <ConstructorElement>[constructor]; | 1027 elementC.constructors = <ConstructorElement>[constructor]; |
| 1023 TypeName typeName = | 1028 TypeName typeName = |
| 1024 AstFactory.typeName(elementC, [AstFactory.typeName(elementI)]); | 1029 AstTestFactory.typeName(elementC, [AstTestFactory.typeName(elementI)]); |
| 1025 typeName.type = elementC.type.instantiate(<DartType>[elementI.type]); | 1030 typeName.type = elementC.type.instantiate(<DartType>[elementI.type]); |
| 1026 InstanceCreationExpression node = | 1031 InstanceCreationExpression node = |
| 1027 AstFactory.instanceCreationExpression2(null, typeName); | 1032 AstTestFactory.instanceCreationExpression2(null, typeName); |
| 1028 node.staticElement = constructor; | 1033 node.staticElement = constructor; |
| 1029 InterfaceType interfaceType = _analyze(node) as InterfaceType; | 1034 InterfaceType interfaceType = _analyze(node) as InterfaceType; |
| 1030 List<DartType> typeArgs = interfaceType.typeArguments; | 1035 List<DartType> typeArgs = interfaceType.typeArguments; |
| 1031 expect(typeArgs.length, 1); | 1036 expect(typeArgs.length, 1); |
| 1032 expect(typeArgs[0], elementI.type); | 1037 expect(typeArgs[0], elementI.type); |
| 1033 _listener.assertNoErrors(); | 1038 _listener.assertNoErrors(); |
| 1034 } | 1039 } |
| 1035 | 1040 |
| 1036 void test_visitInstanceCreationExpression_unnamed() { | 1041 void test_visitInstanceCreationExpression_unnamed() { |
| 1037 // new C() | 1042 // new C() |
| 1038 ClassElementImpl classElement = ElementFactory.classElement2("C"); | 1043 ClassElementImpl classElement = ElementFactory.classElement2("C"); |
| 1039 ConstructorElementImpl constructor = | 1044 ConstructorElementImpl constructor = |
| 1040 ElementFactory.constructorElement2(classElement, null); | 1045 ElementFactory.constructorElement2(classElement, null); |
| 1041 classElement.constructors = <ConstructorElement>[constructor]; | 1046 classElement.constructors = <ConstructorElement>[constructor]; |
| 1042 InstanceCreationExpression node = AstFactory.instanceCreationExpression2( | 1047 InstanceCreationExpression node = |
| 1043 null, AstFactory.typeName(classElement)); | 1048 AstTestFactory.instanceCreationExpression2( |
| 1049 null, AstTestFactory.typeName(classElement)); |
| 1044 node.staticElement = constructor; | 1050 node.staticElement = constructor; |
| 1045 expect(_analyze(node), same(classElement.type)); | 1051 expect(_analyze(node), same(classElement.type)); |
| 1046 _listener.assertNoErrors(); | 1052 _listener.assertNoErrors(); |
| 1047 } | 1053 } |
| 1048 | 1054 |
| 1049 void test_visitIntegerLiteral() { | 1055 void test_visitIntegerLiteral() { |
| 1050 // 42 | 1056 // 42 |
| 1051 Expression node = _resolvedInteger(42); | 1057 Expression node = _resolvedInteger(42); |
| 1052 expect(_analyze(node), same(_typeProvider.intType)); | 1058 expect(_analyze(node), same(_typeProvider.intType)); |
| 1053 _listener.assertNoErrors(); | 1059 _listener.assertNoErrors(); |
| 1054 } | 1060 } |
| 1055 | 1061 |
| 1056 void test_visitIsExpression_negated() { | 1062 void test_visitIsExpression_negated() { |
| 1057 // a is! String | 1063 // a is! String |
| 1058 Expression node = AstFactory.isExpression( | 1064 Expression node = AstTestFactory.isExpression( |
| 1059 _resolvedString("a"), true, AstFactory.typeName4("String")); | 1065 _resolvedString("a"), true, AstTestFactory.typeName4("String")); |
| 1060 expect(_analyze(node), same(_typeProvider.boolType)); | 1066 expect(_analyze(node), same(_typeProvider.boolType)); |
| 1061 _listener.assertNoErrors(); | 1067 _listener.assertNoErrors(); |
| 1062 } | 1068 } |
| 1063 | 1069 |
| 1064 void test_visitIsExpression_notNegated() { | 1070 void test_visitIsExpression_notNegated() { |
| 1065 // a is String | 1071 // a is String |
| 1066 Expression node = AstFactory.isExpression( | 1072 Expression node = AstTestFactory.isExpression( |
| 1067 _resolvedString("a"), false, AstFactory.typeName4("String")); | 1073 _resolvedString("a"), false, AstTestFactory.typeName4("String")); |
| 1068 expect(_analyze(node), same(_typeProvider.boolType)); | 1074 expect(_analyze(node), same(_typeProvider.boolType)); |
| 1069 _listener.assertNoErrors(); | 1075 _listener.assertNoErrors(); |
| 1070 } | 1076 } |
| 1071 | 1077 |
| 1072 void test_visitListLiteral_empty() { | 1078 void test_visitListLiteral_empty() { |
| 1073 // [] | 1079 // [] |
| 1074 Expression node = AstFactory.listLiteral(); | 1080 Expression node = AstTestFactory.listLiteral(); |
| 1075 DartType resultType = _analyze(node); | 1081 DartType resultType = _analyze(node); |
| 1076 _assertType2( | 1082 _assertType2( |
| 1077 _typeProvider.listType | 1083 _typeProvider.listType |
| 1078 .instantiate(<DartType>[_typeProvider.dynamicType]), | 1084 .instantiate(<DartType>[_typeProvider.dynamicType]), |
| 1079 resultType); | 1085 resultType); |
| 1080 _listener.assertNoErrors(); | 1086 _listener.assertNoErrors(); |
| 1081 } | 1087 } |
| 1082 | 1088 |
| 1083 void test_visitListLiteral_nonEmpty() { | 1089 void test_visitListLiteral_nonEmpty() { |
| 1084 // [0] | 1090 // [0] |
| 1085 Expression node = AstFactory.listLiteral([_resolvedInteger(0)]); | 1091 Expression node = AstTestFactory.listLiteral([_resolvedInteger(0)]); |
| 1086 DartType resultType = _analyze(node); | 1092 DartType resultType = _analyze(node); |
| 1087 _assertType2( | 1093 _assertType2( |
| 1088 _typeProvider.listType | 1094 _typeProvider.listType |
| 1089 .instantiate(<DartType>[_typeProvider.dynamicType]), | 1095 .instantiate(<DartType>[_typeProvider.dynamicType]), |
| 1090 resultType); | 1096 resultType); |
| 1091 _listener.assertNoErrors(); | 1097 _listener.assertNoErrors(); |
| 1092 } | 1098 } |
| 1093 | 1099 |
| 1094 void test_visitListLiteral_unresolved() { | 1100 void test_visitListLiteral_unresolved() { |
| 1095 _analyzer = _createAnalyzer(strongMode: true); | 1101 _analyzer = _createAnalyzer(strongMode: true); |
| 1096 // [a] // where 'a' is not resolved | 1102 // [a] // where 'a' is not resolved |
| 1097 Identifier identifier = AstFactory.identifier3('a'); | 1103 Identifier identifier = AstTestFactory.identifier3('a'); |
| 1098 Expression node = AstFactory.listLiteral([identifier]); | 1104 Expression node = AstTestFactory.listLiteral([identifier]); |
| 1099 DartType resultType = _analyze(node); | 1105 DartType resultType = _analyze(node); |
| 1100 _assertType2( | 1106 _assertType2( |
| 1101 _typeProvider.listType | 1107 _typeProvider.listType |
| 1102 .instantiate(<DartType>[_typeProvider.dynamicType]), | 1108 .instantiate(<DartType>[_typeProvider.dynamicType]), |
| 1103 resultType); | 1109 resultType); |
| 1104 _listener.assertNoErrors(); | 1110 _listener.assertNoErrors(); |
| 1105 } | 1111 } |
| 1106 | 1112 |
| 1107 void test_visitListLiteral_unresolved_multiple() { | 1113 void test_visitListLiteral_unresolved_multiple() { |
| 1108 _analyzer = _createAnalyzer(strongMode: true); | 1114 _analyzer = _createAnalyzer(strongMode: true); |
| 1109 // [0, a, 1] // where 'a' is not resolved | 1115 // [0, a, 1] // where 'a' is not resolved |
| 1110 Identifier identifier = AstFactory.identifier3('a'); | 1116 Identifier identifier = AstTestFactory.identifier3('a'); |
| 1111 Expression node = AstFactory | 1117 Expression node = AstTestFactory |
| 1112 .listLiteral([_resolvedInteger(0), identifier, _resolvedInteger(1)]); | 1118 .listLiteral([_resolvedInteger(0), identifier, _resolvedInteger(1)]); |
| 1113 DartType resultType = _analyze(node); | 1119 DartType resultType = _analyze(node); |
| 1114 _assertType2( | 1120 _assertType2( |
| 1115 _typeProvider.listType.instantiate(<DartType>[_typeProvider.intType]), | 1121 _typeProvider.listType.instantiate(<DartType>[_typeProvider.intType]), |
| 1116 resultType); | 1122 resultType); |
| 1117 _listener.assertNoErrors(); | 1123 _listener.assertNoErrors(); |
| 1118 } | 1124 } |
| 1119 | 1125 |
| 1120 void test_visitMapLiteral_empty() { | 1126 void test_visitMapLiteral_empty() { |
| 1121 // {} | 1127 // {} |
| 1122 Expression node = AstFactory.mapLiteral2(); | 1128 Expression node = AstTestFactory.mapLiteral2(); |
| 1123 DartType resultType = _analyze(node); | 1129 DartType resultType = _analyze(node); |
| 1124 _assertType2( | 1130 _assertType2( |
| 1125 _typeProvider.mapType.instantiate( | 1131 _typeProvider.mapType.instantiate( |
| 1126 <DartType>[_typeProvider.dynamicType, _typeProvider.dynamicType]), | 1132 <DartType>[_typeProvider.dynamicType, _typeProvider.dynamicType]), |
| 1127 resultType); | 1133 resultType); |
| 1128 _listener.assertNoErrors(); | 1134 _listener.assertNoErrors(); |
| 1129 } | 1135 } |
| 1130 | 1136 |
| 1131 void test_visitMapLiteral_nonEmpty() { | 1137 void test_visitMapLiteral_nonEmpty() { |
| 1132 // {"k" : 0} | 1138 // {"k" : 0} |
| 1133 Expression node = AstFactory | 1139 Expression node = AstTestFactory.mapLiteral2( |
| 1134 .mapLiteral2([AstFactory.mapLiteralEntry("k", _resolvedInteger(0))]); | 1140 [AstTestFactory.mapLiteralEntry("k", _resolvedInteger(0))]); |
| 1135 DartType resultType = _analyze(node); | 1141 DartType resultType = _analyze(node); |
| 1136 _assertType2( | 1142 _assertType2( |
| 1137 _typeProvider.mapType.instantiate( | 1143 _typeProvider.mapType.instantiate( |
| 1138 <DartType>[_typeProvider.dynamicType, _typeProvider.dynamicType]), | 1144 <DartType>[_typeProvider.dynamicType, _typeProvider.dynamicType]), |
| 1139 resultType); | 1145 resultType); |
| 1140 _listener.assertNoErrors(); | 1146 _listener.assertNoErrors(); |
| 1141 } | 1147 } |
| 1142 | 1148 |
| 1143 void test_visitMethodInvocation_then() { | 1149 void test_visitMethodInvocation_then() { |
| 1144 // then() | 1150 // then() |
| 1145 Expression node = AstFactory.methodInvocation(null, "then"); | 1151 Expression node = AstTestFactory.methodInvocation(null, "then"); |
| 1146 _analyze(node); | 1152 _analyze(node); |
| 1147 _listener.assertNoErrors(); | 1153 _listener.assertNoErrors(); |
| 1148 } | 1154 } |
| 1149 | 1155 |
| 1150 void test_visitNamedExpression() { | 1156 void test_visitNamedExpression() { |
| 1151 // n: a | 1157 // n: a |
| 1152 Expression node = AstFactory.namedExpression2("n", _resolvedString("a")); | 1158 Expression node = |
| 1159 AstTestFactory.namedExpression2("n", _resolvedString("a")); |
| 1153 expect(_analyze(node), same(_typeProvider.stringType)); | 1160 expect(_analyze(node), same(_typeProvider.stringType)); |
| 1154 _listener.assertNoErrors(); | 1161 _listener.assertNoErrors(); |
| 1155 } | 1162 } |
| 1156 | 1163 |
| 1157 void test_visitNullLiteral() { | 1164 void test_visitNullLiteral() { |
| 1158 // null | 1165 // null |
| 1159 Expression node = AstFactory.nullLiteral(); | 1166 Expression node = AstTestFactory.nullLiteral(); |
| 1160 expect(_analyze(node), same(_typeProvider.bottomType)); | 1167 expect(_analyze(node), same(_typeProvider.bottomType)); |
| 1161 _listener.assertNoErrors(); | 1168 _listener.assertNoErrors(); |
| 1162 } | 1169 } |
| 1163 | 1170 |
| 1164 void test_visitParenthesizedExpression() { | 1171 void test_visitParenthesizedExpression() { |
| 1165 // (0) | 1172 // (0) |
| 1166 Expression node = AstFactory.parenthesizedExpression(_resolvedInteger(0)); | 1173 Expression node = |
| 1174 AstTestFactory.parenthesizedExpression(_resolvedInteger(0)); |
| 1167 expect(_analyze(node), same(_typeProvider.intType)); | 1175 expect(_analyze(node), same(_typeProvider.intType)); |
| 1168 _listener.assertNoErrors(); | 1176 _listener.assertNoErrors(); |
| 1169 } | 1177 } |
| 1170 | 1178 |
| 1171 void test_visitPostfixExpression_minusMinus() { | 1179 void test_visitPostfixExpression_minusMinus() { |
| 1172 // 0-- | 1180 // 0-- |
| 1173 PostfixExpression node = AstFactory.postfixExpression( | 1181 PostfixExpression node = AstTestFactory.postfixExpression( |
| 1174 _resolvedInteger(0), TokenType.MINUS_MINUS); | 1182 _resolvedInteger(0), TokenType.MINUS_MINUS); |
| 1175 expect(_analyze(node), same(_typeProvider.intType)); | 1183 expect(_analyze(node), same(_typeProvider.intType)); |
| 1176 _listener.assertNoErrors(); | 1184 _listener.assertNoErrors(); |
| 1177 } | 1185 } |
| 1178 | 1186 |
| 1179 void test_visitPostfixExpression_plusPlus() { | 1187 void test_visitPostfixExpression_plusPlus() { |
| 1180 // 0++ | 1188 // 0++ |
| 1181 PostfixExpression node = | 1189 PostfixExpression node = AstTestFactory.postfixExpression( |
| 1182 AstFactory.postfixExpression(_resolvedInteger(0), TokenType.PLUS_PLUS); | 1190 _resolvedInteger(0), TokenType.PLUS_PLUS); |
| 1183 expect(_analyze(node), same(_typeProvider.intType)); | 1191 expect(_analyze(node), same(_typeProvider.intType)); |
| 1184 _listener.assertNoErrors(); | 1192 _listener.assertNoErrors(); |
| 1185 } | 1193 } |
| 1186 | 1194 |
| 1187 void test_visitPrefixedIdentifier_getter() { | 1195 void test_visitPrefixedIdentifier_getter() { |
| 1188 DartType boolType = _typeProvider.boolType; | 1196 DartType boolType = _typeProvider.boolType; |
| 1189 PropertyAccessorElementImpl getter = | 1197 PropertyAccessorElementImpl getter = |
| 1190 ElementFactory.getterElement("b", false, boolType); | 1198 ElementFactory.getterElement("b", false, boolType); |
| 1191 PrefixedIdentifier node = AstFactory.identifier5("a", "b"); | 1199 PrefixedIdentifier node = AstTestFactory.identifier5("a", "b"); |
| 1192 node.identifier.staticElement = getter; | 1200 node.identifier.staticElement = getter; |
| 1193 expect(_analyze(node), same(boolType)); | 1201 expect(_analyze(node), same(boolType)); |
| 1194 _listener.assertNoErrors(); | 1202 _listener.assertNoErrors(); |
| 1195 } | 1203 } |
| 1196 | 1204 |
| 1197 void test_visitPrefixedIdentifier_setter() { | 1205 void test_visitPrefixedIdentifier_setter() { |
| 1198 DartType boolType = _typeProvider.boolType; | 1206 DartType boolType = _typeProvider.boolType; |
| 1199 FieldElementImpl field = | 1207 FieldElementImpl field = |
| 1200 ElementFactory.fieldElement("b", false, false, false, boolType); | 1208 ElementFactory.fieldElement("b", false, false, false, boolType); |
| 1201 PropertyAccessorElement setter = field.setter; | 1209 PropertyAccessorElement setter = field.setter; |
| 1202 PrefixedIdentifier node = AstFactory.identifier5("a", "b"); | 1210 PrefixedIdentifier node = AstTestFactory.identifier5("a", "b"); |
| 1203 node.identifier.staticElement = setter; | 1211 node.identifier.staticElement = setter; |
| 1204 expect(_analyze(node), same(boolType)); | 1212 expect(_analyze(node), same(boolType)); |
| 1205 _listener.assertNoErrors(); | 1213 _listener.assertNoErrors(); |
| 1206 } | 1214 } |
| 1207 | 1215 |
| 1208 void test_visitPrefixedIdentifier_variable() { | 1216 void test_visitPrefixedIdentifier_variable() { |
| 1209 VariableElementImpl variable = ElementFactory.localVariableElement2("b"); | 1217 VariableElementImpl variable = ElementFactory.localVariableElement2("b"); |
| 1210 variable.type = _typeProvider.boolType; | 1218 variable.type = _typeProvider.boolType; |
| 1211 PrefixedIdentifier node = AstFactory.identifier5("a", "b"); | 1219 PrefixedIdentifier node = AstTestFactory.identifier5("a", "b"); |
| 1212 node.identifier.staticElement = variable; | 1220 node.identifier.staticElement = variable; |
| 1213 expect(_analyze(node), same(_typeProvider.boolType)); | 1221 expect(_analyze(node), same(_typeProvider.boolType)); |
| 1214 _listener.assertNoErrors(); | 1222 _listener.assertNoErrors(); |
| 1215 } | 1223 } |
| 1216 | 1224 |
| 1217 void test_visitPrefixExpression_bang() { | 1225 void test_visitPrefixExpression_bang() { |
| 1218 // !0 | 1226 // !0 |
| 1219 PrefixExpression node = | 1227 PrefixExpression node = |
| 1220 AstFactory.prefixExpression(TokenType.BANG, _resolvedInteger(0)); | 1228 AstTestFactory.prefixExpression(TokenType.BANG, _resolvedInteger(0)); |
| 1221 expect(_analyze(node), same(_typeProvider.boolType)); | 1229 expect(_analyze(node), same(_typeProvider.boolType)); |
| 1222 _listener.assertNoErrors(); | 1230 _listener.assertNoErrors(); |
| 1223 } | 1231 } |
| 1224 | 1232 |
| 1225 void test_visitPrefixExpression_minus() { | 1233 void test_visitPrefixExpression_minus() { |
| 1226 // -0 | 1234 // -0 |
| 1227 PrefixExpression node = | 1235 PrefixExpression node = |
| 1228 AstFactory.prefixExpression(TokenType.MINUS, _resolvedInteger(0)); | 1236 AstTestFactory.prefixExpression(TokenType.MINUS, _resolvedInteger(0)); |
| 1229 MethodElement minusMethod = getMethod(_typeProvider.numType, "-"); | 1237 MethodElement minusMethod = getMethod(_typeProvider.numType, "-"); |
| 1230 node.staticElement = minusMethod; | 1238 node.staticElement = minusMethod; |
| 1231 expect(_analyze(node), same(_typeProvider.numType)); | 1239 expect(_analyze(node), same(_typeProvider.numType)); |
| 1232 _listener.assertNoErrors(); | 1240 _listener.assertNoErrors(); |
| 1233 } | 1241 } |
| 1234 | 1242 |
| 1235 void test_visitPrefixExpression_minusMinus() { | 1243 void test_visitPrefixExpression_minusMinus() { |
| 1236 // --0 | 1244 // --0 |
| 1237 PrefixExpression node = | 1245 PrefixExpression node = AstTestFactory.prefixExpression( |
| 1238 AstFactory.prefixExpression(TokenType.MINUS_MINUS, _resolvedInteger(0)); | 1246 TokenType.MINUS_MINUS, _resolvedInteger(0)); |
| 1239 MethodElement minusMethod = getMethod(_typeProvider.numType, "-"); | 1247 MethodElement minusMethod = getMethod(_typeProvider.numType, "-"); |
| 1240 node.staticElement = minusMethod; | 1248 node.staticElement = minusMethod; |
| 1241 expect(_analyze(node), same(_typeProvider.intType)); | 1249 expect(_analyze(node), same(_typeProvider.intType)); |
| 1242 _listener.assertNoErrors(); | 1250 _listener.assertNoErrors(); |
| 1243 } | 1251 } |
| 1244 | 1252 |
| 1245 void test_visitPrefixExpression_not() { | 1253 void test_visitPrefixExpression_not() { |
| 1246 // !true | 1254 // !true |
| 1247 Expression node = AstFactory.prefixExpression( | 1255 Expression node = AstTestFactory.prefixExpression( |
| 1248 TokenType.BANG, AstFactory.booleanLiteral(true)); | 1256 TokenType.BANG, AstTestFactory.booleanLiteral(true)); |
| 1249 expect(_analyze(node), same(_typeProvider.boolType)); | 1257 expect(_analyze(node), same(_typeProvider.boolType)); |
| 1250 _listener.assertNoErrors(); | 1258 _listener.assertNoErrors(); |
| 1251 } | 1259 } |
| 1252 | 1260 |
| 1253 void test_visitPrefixExpression_plusPlus() { | 1261 void test_visitPrefixExpression_plusPlus() { |
| 1254 // ++0 | 1262 // ++0 |
| 1255 PrefixExpression node = | 1263 PrefixExpression node = AstTestFactory.prefixExpression( |
| 1256 AstFactory.prefixExpression(TokenType.PLUS_PLUS, _resolvedInteger(0)); | 1264 TokenType.PLUS_PLUS, _resolvedInteger(0)); |
| 1257 MethodElement plusMethod = getMethod(_typeProvider.numType, "+"); | 1265 MethodElement plusMethod = getMethod(_typeProvider.numType, "+"); |
| 1258 node.staticElement = plusMethod; | 1266 node.staticElement = plusMethod; |
| 1259 expect(_analyze(node), same(_typeProvider.intType)); | 1267 expect(_analyze(node), same(_typeProvider.intType)); |
| 1260 _listener.assertNoErrors(); | 1268 _listener.assertNoErrors(); |
| 1261 } | 1269 } |
| 1262 | 1270 |
| 1263 void test_visitPrefixExpression_tilde() { | 1271 void test_visitPrefixExpression_tilde() { |
| 1264 // ~0 | 1272 // ~0 |
| 1265 PrefixExpression node = | 1273 PrefixExpression node = |
| 1266 AstFactory.prefixExpression(TokenType.TILDE, _resolvedInteger(0)); | 1274 AstTestFactory.prefixExpression(TokenType.TILDE, _resolvedInteger(0)); |
| 1267 MethodElement tildeMethod = getMethod(_typeProvider.intType, "~"); | 1275 MethodElement tildeMethod = getMethod(_typeProvider.intType, "~"); |
| 1268 node.staticElement = tildeMethod; | 1276 node.staticElement = tildeMethod; |
| 1269 expect(_analyze(node), same(_typeProvider.intType)); | 1277 expect(_analyze(node), same(_typeProvider.intType)); |
| 1270 _listener.assertNoErrors(); | 1278 _listener.assertNoErrors(); |
| 1271 } | 1279 } |
| 1272 | 1280 |
| 1273 void test_visitPropertyAccess_propagated_getter() { | 1281 void test_visitPropertyAccess_propagated_getter() { |
| 1274 DartType boolType = _typeProvider.boolType; | 1282 DartType boolType = _typeProvider.boolType; |
| 1275 PropertyAccessorElementImpl getter = | 1283 PropertyAccessorElementImpl getter = |
| 1276 ElementFactory.getterElement("b", false, boolType); | 1284 ElementFactory.getterElement("b", false, boolType); |
| 1277 PropertyAccess node = | 1285 PropertyAccess node = |
| 1278 AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b"); | 1286 AstTestFactory.propertyAccess2(AstTestFactory.identifier3("a"), "b"); |
| 1279 node.propertyName.propagatedElement = getter; | 1287 node.propertyName.propagatedElement = getter; |
| 1280 expect(_analyze2(node, false), same(boolType)); | 1288 expect(_analyze2(node, false), same(boolType)); |
| 1281 _listener.assertNoErrors(); | 1289 _listener.assertNoErrors(); |
| 1282 } | 1290 } |
| 1283 | 1291 |
| 1284 void test_visitPropertyAccess_propagated_setter() { | 1292 void test_visitPropertyAccess_propagated_setter() { |
| 1285 DartType boolType = _typeProvider.boolType; | 1293 DartType boolType = _typeProvider.boolType; |
| 1286 FieldElementImpl field = | 1294 FieldElementImpl field = |
| 1287 ElementFactory.fieldElement("b", false, false, false, boolType); | 1295 ElementFactory.fieldElement("b", false, false, false, boolType); |
| 1288 PropertyAccessorElement setter = field.setter; | 1296 PropertyAccessorElement setter = field.setter; |
| 1289 PropertyAccess node = | 1297 PropertyAccess node = |
| 1290 AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b"); | 1298 AstTestFactory.propertyAccess2(AstTestFactory.identifier3("a"), "b"); |
| 1291 node.propertyName.propagatedElement = setter; | 1299 node.propertyName.propagatedElement = setter; |
| 1292 expect(_analyze2(node, false), same(boolType)); | 1300 expect(_analyze2(node, false), same(boolType)); |
| 1293 _listener.assertNoErrors(); | 1301 _listener.assertNoErrors(); |
| 1294 } | 1302 } |
| 1295 | 1303 |
| 1296 void test_visitPropertyAccess_static_getter() { | 1304 void test_visitPropertyAccess_static_getter() { |
| 1297 DartType boolType = _typeProvider.boolType; | 1305 DartType boolType = _typeProvider.boolType; |
| 1298 PropertyAccessorElementImpl getter = | 1306 PropertyAccessorElementImpl getter = |
| 1299 ElementFactory.getterElement("b", false, boolType); | 1307 ElementFactory.getterElement("b", false, boolType); |
| 1300 PropertyAccess node = | 1308 PropertyAccess node = |
| 1301 AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b"); | 1309 AstTestFactory.propertyAccess2(AstTestFactory.identifier3("a"), "b"); |
| 1302 node.propertyName.staticElement = getter; | 1310 node.propertyName.staticElement = getter; |
| 1303 expect(_analyze(node), same(boolType)); | 1311 expect(_analyze(node), same(boolType)); |
| 1304 _listener.assertNoErrors(); | 1312 _listener.assertNoErrors(); |
| 1305 } | 1313 } |
| 1306 | 1314 |
| 1307 void test_visitPropertyAccess_static_setter() { | 1315 void test_visitPropertyAccess_static_setter() { |
| 1308 DartType boolType = _typeProvider.boolType; | 1316 DartType boolType = _typeProvider.boolType; |
| 1309 FieldElementImpl field = | 1317 FieldElementImpl field = |
| 1310 ElementFactory.fieldElement("b", false, false, false, boolType); | 1318 ElementFactory.fieldElement("b", false, false, false, boolType); |
| 1311 PropertyAccessorElement setter = field.setter; | 1319 PropertyAccessorElement setter = field.setter; |
| 1312 PropertyAccess node = | 1320 PropertyAccess node = |
| 1313 AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b"); | 1321 AstTestFactory.propertyAccess2(AstTestFactory.identifier3("a"), "b"); |
| 1314 node.propertyName.staticElement = setter; | 1322 node.propertyName.staticElement = setter; |
| 1315 expect(_analyze(node), same(boolType)); | 1323 expect(_analyze(node), same(boolType)); |
| 1316 _listener.assertNoErrors(); | 1324 _listener.assertNoErrors(); |
| 1317 } | 1325 } |
| 1318 | 1326 |
| 1319 void test_visitSimpleIdentifier_dynamic() { | 1327 void test_visitSimpleIdentifier_dynamic() { |
| 1320 // "dynamic" | 1328 // "dynamic" |
| 1321 SimpleIdentifier identifier = AstFactory.identifier3('dynamic'); | 1329 SimpleIdentifier identifier = AstTestFactory.identifier3('dynamic'); |
| 1322 DynamicElementImpl element = DynamicElementImpl.instance; | 1330 DynamicElementImpl element = DynamicElementImpl.instance; |
| 1323 identifier.staticElement = element; | 1331 identifier.staticElement = element; |
| 1324 identifier.staticType = _typeProvider.typeType; | 1332 identifier.staticType = _typeProvider.typeType; |
| 1325 expect(_analyze(identifier), same(_typeProvider.typeType)); | 1333 expect(_analyze(identifier), same(_typeProvider.typeType)); |
| 1326 _listener.assertNoErrors(); | 1334 _listener.assertNoErrors(); |
| 1327 } | 1335 } |
| 1328 | 1336 |
| 1329 void test_visitSimpleStringLiteral() { | 1337 void test_visitSimpleStringLiteral() { |
| 1330 // "a" | 1338 // "a" |
| 1331 Expression node = _resolvedString("a"); | 1339 Expression node = _resolvedString("a"); |
| 1332 expect(_analyze(node), same(_typeProvider.stringType)); | 1340 expect(_analyze(node), same(_typeProvider.stringType)); |
| 1333 _listener.assertNoErrors(); | 1341 _listener.assertNoErrors(); |
| 1334 } | 1342 } |
| 1335 | 1343 |
| 1336 void test_visitStringInterpolation() { | 1344 void test_visitStringInterpolation() { |
| 1337 // "a${'b'}c" | 1345 // "a${'b'}c" |
| 1338 Expression node = AstFactory.string([ | 1346 Expression node = AstTestFactory.string([ |
| 1339 AstFactory.interpolationString("a", "a"), | 1347 AstTestFactory.interpolationString("a", "a"), |
| 1340 AstFactory.interpolationExpression(_resolvedString("b")), | 1348 AstTestFactory.interpolationExpression(_resolvedString("b")), |
| 1341 AstFactory.interpolationString("c", "c") | 1349 AstTestFactory.interpolationString("c", "c") |
| 1342 ]); | 1350 ]); |
| 1343 expect(_analyze(node), same(_typeProvider.stringType)); | 1351 expect(_analyze(node), same(_typeProvider.stringType)); |
| 1344 _listener.assertNoErrors(); | 1352 _listener.assertNoErrors(); |
| 1345 } | 1353 } |
| 1346 | 1354 |
| 1347 void test_visitSuperExpression() { | 1355 void test_visitSuperExpression() { |
| 1348 // super | 1356 // super |
| 1349 InterfaceType superType = ElementFactory.classElement2("A").type; | 1357 InterfaceType superType = ElementFactory.classElement2("A").type; |
| 1350 InterfaceType thisType = ElementFactory.classElement("B", superType).type; | 1358 InterfaceType thisType = ElementFactory.classElement("B", superType).type; |
| 1351 Expression node = AstFactory.superExpression(); | 1359 Expression node = AstTestFactory.superExpression(); |
| 1352 expect(_analyze3(node, thisType), same(thisType)); | 1360 expect(_analyze3(node, thisType), same(thisType)); |
| 1353 _listener.assertNoErrors(); | 1361 _listener.assertNoErrors(); |
| 1354 } | 1362 } |
| 1355 | 1363 |
| 1356 void test_visitSymbolLiteral() { | 1364 void test_visitSymbolLiteral() { |
| 1357 expect(_analyze(AstFactory.symbolLiteral(["a"])), | 1365 expect(_analyze(AstTestFactory.symbolLiteral(["a"])), |
| 1358 same(_typeProvider.symbolType)); | 1366 same(_typeProvider.symbolType)); |
| 1359 } | 1367 } |
| 1360 | 1368 |
| 1361 void test_visitThisExpression() { | 1369 void test_visitThisExpression() { |
| 1362 // this | 1370 // this |
| 1363 InterfaceType thisType = ElementFactory | 1371 InterfaceType thisType = ElementFactory |
| 1364 .classElement("B", ElementFactory.classElement2("A").type) | 1372 .classElement("B", ElementFactory.classElement2("A").type) |
| 1365 .type; | 1373 .type; |
| 1366 Expression node = AstFactory.thisExpression(); | 1374 Expression node = AstTestFactory.thisExpression(); |
| 1367 expect(_analyze3(node, thisType), same(thisType)); | 1375 expect(_analyze3(node, thisType), same(thisType)); |
| 1368 _listener.assertNoErrors(); | 1376 _listener.assertNoErrors(); |
| 1369 } | 1377 } |
| 1370 | 1378 |
| 1371 void test_visitThrowExpression_withoutValue() { | 1379 void test_visitThrowExpression_withoutValue() { |
| 1372 // throw | 1380 // throw |
| 1373 Expression node = AstFactory.throwExpression(); | 1381 Expression node = AstTestFactory.throwExpression(); |
| 1374 expect(_analyze(node), same(_typeProvider.bottomType)); | 1382 expect(_analyze(node), same(_typeProvider.bottomType)); |
| 1375 _listener.assertNoErrors(); | 1383 _listener.assertNoErrors(); |
| 1376 } | 1384 } |
| 1377 | 1385 |
| 1378 void test_visitThrowExpression_withValue() { | 1386 void test_visitThrowExpression_withValue() { |
| 1379 // throw 0 | 1387 // throw 0 |
| 1380 Expression node = AstFactory.throwExpression2(_resolvedInteger(0)); | 1388 Expression node = AstTestFactory.throwExpression2(_resolvedInteger(0)); |
| 1381 expect(_analyze(node), same(_typeProvider.bottomType)); | 1389 expect(_analyze(node), same(_typeProvider.bottomType)); |
| 1382 _listener.assertNoErrors(); | 1390 _listener.assertNoErrors(); |
| 1383 } | 1391 } |
| 1384 | 1392 |
| 1385 /** | 1393 /** |
| 1386 * Return the type associated with the given expression after the static type
analyzer has | 1394 * Return the type associated with the given expression after the static type
analyzer has |
| 1387 * computed a type for it. | 1395 * computed a type for it. |
| 1388 * | 1396 * |
| 1389 * @param node the expression with which the type is associated | 1397 * @param node the expression with which the type is associated |
| 1390 * @return the type associated with the expression | 1398 * @return the type associated with the expression |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1555 | 1563 |
| 1556 /** | 1564 /** |
| 1557 * Return a simple identifier that has been resolved to a variable element wit
h the given type. | 1565 * Return a simple identifier that has been resolved to a variable element wit
h the given type. |
| 1558 * | 1566 * |
| 1559 * @param type the type of the variable being represented | 1567 * @param type the type of the variable being represented |
| 1560 * @param variableName the name of the variable | 1568 * @param variableName the name of the variable |
| 1561 * @return a simple identifier that has been resolved to a variable element wi
th the given type | 1569 * @return a simple identifier that has been resolved to a variable element wi
th the given type |
| 1562 */ | 1570 */ |
| 1563 SimpleIdentifier _propagatedVariable( | 1571 SimpleIdentifier _propagatedVariable( |
| 1564 InterfaceType type, String variableName) { | 1572 InterfaceType type, String variableName) { |
| 1565 SimpleIdentifier identifier = AstFactory.identifier3(variableName); | 1573 SimpleIdentifier identifier = AstTestFactory.identifier3(variableName); |
| 1566 VariableElementImpl element = | 1574 VariableElementImpl element = |
| 1567 ElementFactory.localVariableElement(identifier); | 1575 ElementFactory.localVariableElement(identifier); |
| 1568 element.type = type; | 1576 element.type = type; |
| 1569 identifier.staticType = _typeProvider.dynamicType; | 1577 identifier.staticType = _typeProvider.dynamicType; |
| 1570 identifier.propagatedElement = element; | 1578 identifier.propagatedElement = element; |
| 1571 identifier.propagatedType = type; | 1579 identifier.propagatedType = type; |
| 1572 return identifier; | 1580 return identifier; |
| 1573 } | 1581 } |
| 1574 | 1582 |
| 1575 /** | 1583 /** |
| 1576 * Return a boolean literal with the given [value] that has been resolved to | 1584 * Return a boolean literal with the given [value] that has been resolved to |
| 1577 * the correct type. | 1585 * the correct type. |
| 1578 */ | 1586 */ |
| 1579 BooleanLiteral _resolvedBool(bool value) { | 1587 BooleanLiteral _resolvedBool(bool value) { |
| 1580 BooleanLiteral literal = AstFactory.booleanLiteral(value); | 1588 BooleanLiteral literal = AstTestFactory.booleanLiteral(value); |
| 1581 literal.staticType = _typeProvider.intType; | 1589 literal.staticType = _typeProvider.intType; |
| 1582 return literal; | 1590 return literal; |
| 1583 } | 1591 } |
| 1584 | 1592 |
| 1585 /** | 1593 /** |
| 1586 * Return an integer literal that has been resolved to the correct type. | 1594 * Return an integer literal that has been resolved to the correct type. |
| 1587 * | 1595 * |
| 1588 * @param value the value of the literal | 1596 * @param value the value of the literal |
| 1589 * @return an integer literal that has been resolved to the correct type | 1597 * @return an integer literal that has been resolved to the correct type |
| 1590 */ | 1598 */ |
| 1591 DoubleLiteral _resolvedDouble(double value) { | 1599 DoubleLiteral _resolvedDouble(double value) { |
| 1592 DoubleLiteral literal = AstFactory.doubleLiteral(value); | 1600 DoubleLiteral literal = AstTestFactory.doubleLiteral(value); |
| 1593 literal.staticType = _typeProvider.doubleType; | 1601 literal.staticType = _typeProvider.doubleType; |
| 1594 return literal; | 1602 return literal; |
| 1595 } | 1603 } |
| 1596 | 1604 |
| 1597 /** | 1605 /** |
| 1598 * Create a function expression that has an element associated with it, where
the element has an | 1606 * Create a function expression that has an element associated with it, where
the element has an |
| 1599 * incomplete type associated with it (just like the one | 1607 * incomplete type associated with it (just like the one |
| 1600 * [ElementBuilder.visitFunctionExpression] would have built if we had | 1608 * [ElementBuilder.visitFunctionExpression] would have built if we had |
| 1601 * run it). | 1609 * run it). |
| 1602 * | 1610 * |
| 1603 * @param parameters the parameters to the function | 1611 * @param parameters the parameters to the function |
| 1604 * @param body the body of the function | 1612 * @param body the body of the function |
| 1605 * @return a resolved function expression | 1613 * @return a resolved function expression |
| 1606 */ | 1614 */ |
| 1607 FunctionExpression _resolvedFunctionExpression( | 1615 FunctionExpression _resolvedFunctionExpression( |
| 1608 FormalParameterList parameters, FunctionBody body) { | 1616 FormalParameterList parameters, FunctionBody body) { |
| 1609 List<ParameterElement> parameterElements = new List<ParameterElement>(); | 1617 List<ParameterElement> parameterElements = new List<ParameterElement>(); |
| 1610 for (FormalParameter parameter in parameters.parameters) { | 1618 for (FormalParameter parameter in parameters.parameters) { |
| 1611 ParameterElementImpl element = | 1619 ParameterElementImpl element = |
| 1612 new ParameterElementImpl.forNode(parameter.identifier); | 1620 new ParameterElementImpl.forNode(parameter.identifier); |
| 1613 element.parameterKind = parameter.kind; | 1621 element.parameterKind = parameter.kind; |
| 1614 element.type = _typeProvider.dynamicType; | 1622 element.type = _typeProvider.dynamicType; |
| 1615 parameter.identifier.staticElement = element; | 1623 parameter.identifier.staticElement = element; |
| 1616 parameterElements.add(element); | 1624 parameterElements.add(element); |
| 1617 } | 1625 } |
| 1618 FunctionExpression node = AstFactory.functionExpression2(parameters, body); | 1626 FunctionExpression node = |
| 1627 AstTestFactory.functionExpression2(parameters, body); |
| 1619 FunctionElementImpl element = new FunctionElementImpl.forNode(null); | 1628 FunctionElementImpl element = new FunctionElementImpl.forNode(null); |
| 1620 element.parameters = parameterElements; | 1629 element.parameters = parameterElements; |
| 1621 element.type = new FunctionTypeImpl(element); | 1630 element.type = new FunctionTypeImpl(element); |
| 1622 node.element = element; | 1631 node.element = element; |
| 1623 return node; | 1632 return node; |
| 1624 } | 1633 } |
| 1625 | 1634 |
| 1626 /** | 1635 /** |
| 1627 * Return an integer literal that has been resolved to the correct type. | 1636 * Return an integer literal that has been resolved to the correct type. |
| 1628 * | 1637 * |
| 1629 * @param value the value of the literal | 1638 * @param value the value of the literal |
| 1630 * @return an integer literal that has been resolved to the correct type | 1639 * @return an integer literal that has been resolved to the correct type |
| 1631 */ | 1640 */ |
| 1632 IntegerLiteral _resolvedInteger(int value) { | 1641 IntegerLiteral _resolvedInteger(int value) { |
| 1633 IntegerLiteral literal = AstFactory.integer(value); | 1642 IntegerLiteral literal = AstTestFactory.integer(value); |
| 1634 literal.staticType = _typeProvider.intType; | 1643 literal.staticType = _typeProvider.intType; |
| 1635 return literal; | 1644 return literal; |
| 1636 } | 1645 } |
| 1637 | 1646 |
| 1638 /** | 1647 /** |
| 1639 * Return a string literal that has been resolved to the correct type. | 1648 * Return a string literal that has been resolved to the correct type. |
| 1640 * | 1649 * |
| 1641 * @param value the value of the literal | 1650 * @param value the value of the literal |
| 1642 * @return a string literal that has been resolved to the correct type | 1651 * @return a string literal that has been resolved to the correct type |
| 1643 */ | 1652 */ |
| 1644 SimpleStringLiteral _resolvedString(String value) { | 1653 SimpleStringLiteral _resolvedString(String value) { |
| 1645 SimpleStringLiteral string = AstFactory.string2(value); | 1654 SimpleStringLiteral string = AstTestFactory.string2(value); |
| 1646 string.staticType = _typeProvider.stringType; | 1655 string.staticType = _typeProvider.stringType; |
| 1647 return string; | 1656 return string; |
| 1648 } | 1657 } |
| 1649 | 1658 |
| 1650 /** | 1659 /** |
| 1651 * Return a simple identifier that has been resolved to a variable element wit
h the given type. | 1660 * Return a simple identifier that has been resolved to a variable element wit
h the given type. |
| 1652 * | 1661 * |
| 1653 * @param type the type of the variable being represented | 1662 * @param type the type of the variable being represented |
| 1654 * @param variableName the name of the variable | 1663 * @param variableName the name of the variable |
| 1655 * @return a simple identifier that has been resolved to a variable element wi
th the given type | 1664 * @return a simple identifier that has been resolved to a variable element wi
th the given type |
| 1656 */ | 1665 */ |
| 1657 SimpleIdentifier _resolvedVariable(InterfaceType type, String variableName) { | 1666 SimpleIdentifier _resolvedVariable(InterfaceType type, String variableName) { |
| 1658 SimpleIdentifier identifier = AstFactory.identifier3(variableName); | 1667 SimpleIdentifier identifier = AstTestFactory.identifier3(variableName); |
| 1659 VariableElementImpl element = | 1668 VariableElementImpl element = |
| 1660 ElementFactory.localVariableElement(identifier); | 1669 ElementFactory.localVariableElement(identifier); |
| 1661 element.type = type; | 1670 element.type = type; |
| 1662 identifier.staticElement = element; | 1671 identifier.staticElement = element; |
| 1663 identifier.staticType = type; | 1672 identifier.staticType = type; |
| 1664 return identifier; | 1673 return identifier; |
| 1665 } | 1674 } |
| 1666 | 1675 |
| 1667 /** | 1676 /** |
| 1668 * Set the type of the given parameter to the given type. | 1677 * Set the type of the given parameter to the given type. |
| 1669 * | 1678 * |
| 1670 * @param parameter the parameter whose type is to be set | 1679 * @param parameter the parameter whose type is to be set |
| 1671 * @param type the new type of the given parameter | 1680 * @param type the new type of the given parameter |
| 1672 */ | 1681 */ |
| 1673 void _setType(FormalParameter parameter, DartType type) { | 1682 void _setType(FormalParameter parameter, DartType type) { |
| 1674 SimpleIdentifier identifier = parameter.identifier; | 1683 SimpleIdentifier identifier = parameter.identifier; |
| 1675 Element element = identifier.staticElement; | 1684 Element element = identifier.staticElement; |
| 1676 if (element is! ParameterElement) { | 1685 if (element is! ParameterElement) { |
| 1677 element = new ParameterElementImpl.forNode(identifier); | 1686 element = new ParameterElementImpl.forNode(identifier); |
| 1678 identifier.staticElement = element; | 1687 identifier.staticElement = element; |
| 1679 } | 1688 } |
| 1680 (element as ParameterElementImpl).type = type; | 1689 (element as ParameterElementImpl).type = type; |
| 1681 } | 1690 } |
| 1682 } | 1691 } |
| OLD | NEW |