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.strong_mode_test; | 5 library analyzer.test.generated.strong_mode_test; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 | 8 |
9 import 'package:analyzer/dart/ast/ast.dart'; | 9 import 'package:analyzer/dart/ast/ast.dart'; |
10 import 'package:analyzer/dart/ast/standard_resolution_map.dart'; | 10 import 'package:analyzer/dart/ast/standard_resolution_map.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/src/dart/element/element.dart'; | 13 import 'package:analyzer/src/dart/element/element.dart'; |
14 import 'package:analyzer/src/error/codes.dart'; | 14 import 'package:analyzer/src/error/codes.dart'; |
15 import 'package:analyzer/src/generated/engine.dart'; | 15 import 'package:analyzer/src/generated/engine.dart'; |
16 import 'package:analyzer/src/generated/source_io.dart'; | 16 import 'package:analyzer/src/generated/source_io.dart'; |
17 import 'package:analyzer/src/task/strong/ast_properties.dart'; | |
17 import 'package:front_end/src/base/errors.dart'; | 18 import 'package:front_end/src/base/errors.dart'; |
18 import 'package:test/test.dart'; | 19 import 'package:test/test.dart'; |
19 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 20 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
20 | 21 |
21 import '../utils.dart'; | 22 import '../utils.dart'; |
22 import 'resolver_test_case.dart'; | 23 import 'resolver_test_case.dart'; |
23 | 24 |
24 main() { | 25 main() { |
25 defineReflectiveSuite(() { | 26 defineReflectiveSuite(() { |
26 defineReflectiveTests(StrongModeLocalInferenceTest); | 27 defineReflectiveTests(StrongModeLocalInferenceTest); |
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
413 } | 414 } |
414 '''; | 415 '''; |
415 CompilationUnit unit = await resolveSource(code); | 416 CompilationUnit unit = await resolveSource(code); |
416 ConstructorDeclaration constructor = | 417 ConstructorDeclaration constructor = |
417 AstFinder.getConstructorInClass(unit, "A", null); | 418 AstFinder.getConstructorInClass(unit, "A", null); |
418 ConstructorFieldInitializer assignment = constructor.initializers[0]; | 419 ConstructorFieldInitializer assignment = constructor.initializers[0]; |
419 Expression exp = assignment.expression; | 420 Expression exp = assignment.expression; |
420 _isListOf(_isString)(exp.staticType); | 421 _isListOf(_isString)(exp.staticType); |
421 } | 422 } |
422 | 423 |
424 test_covarianceChecks() async { | |
425 var source = addSource(r''' | |
426 class C<T> { | |
427 add(T t) {} | |
428 forEach(void f(T t)) {} | |
429 } | |
430 class D extends C<int> { | |
431 add(int t) {} | |
432 forEach(void f(int t)) {} | |
433 } | |
434 class E extends C<int> { | |
435 add(Object t) {} | |
436 forEach(void f(Null t)) {} | |
437 } | |
438 '''); | |
439 var unit = (await computeAnalysisResult(source)).unit; | |
440 assertNoErrors(source); | |
441 var cAdd = AstFinder.getMethodInClass(unit, "C", "add"); | |
442 var covariantC = getClassCovariantParameters(AstFinder.getClass(unit, "C")); | |
443 expect(covariantC.toList(), [cAdd.element.parameters[0]]); | |
444 | |
445 var dAdd = AstFinder.getMethodInClass(unit, "D", "add"); | |
446 var covariantD = getClassCovariantParameters(AstFinder.getClass(unit, "D")); | |
447 expect(covariantD.toList(), [dAdd.element.parameters[0]]); | |
448 | |
449 var covariantE = getClassCovariantParameters(AstFinder.getClass(unit, "E")); | |
450 expect(covariantE.toList(), []); | |
451 } | |
452 | |
453 test_covarianceChecks_genericMethods() async { | |
454 var source = addSource(r''' | |
455 class C<T> { | |
456 add<S>(T t) {} | |
457 forEach<S>(S f(T t)) {} | |
458 } | |
459 class D extends C<int> { | |
460 add<S>(int t) {} | |
461 forEach<S>(S f(int t)) {} | |
462 } | |
463 class E extends C<int> { | |
464 add<S>(Object t) {} | |
465 forEach<S>(S f(Null t)) {} | |
466 } | |
467 '''); | |
468 var unit = (await computeAnalysisResult(source)).unit; | |
469 assertNoErrors(source); | |
470 | |
471 var cAdd = AstFinder.getMethodInClass(unit, "C", "add"); | |
472 var covariantC = getClassCovariantParameters(AstFinder.getClass(unit, "C")); | |
473 expect(covariantC.toList(), [cAdd.element.parameters[0]]); | |
474 | |
475 var dAdd = AstFinder.getMethodInClass(unit, "D", "add"); | |
476 var covariantD = getClassCovariantParameters(AstFinder.getClass(unit, "D")); | |
477 expect(covariantD.toList(), [dAdd.element.parameters[0]]); | |
478 | |
479 var covariantE = getClassCovariantParameters(AstFinder.getClass(unit, "E")); | |
480 expect(covariantE.toList(), []); | |
481 } | |
482 | |
483 test_covarianceChecks_superclass() async { | |
484 var source = addSource(r''' | |
485 class C<T> { | |
486 add(T t) {} | |
487 forEach(void f(T t)) {} | |
488 } | |
489 class D { | |
490 add(int t) {} | |
491 forEach(void f(int t)) {} | |
492 } | |
493 class E extends D implements C<int> {} | |
494 '''); | |
495 var unit = (await computeAnalysisResult(source)).unit; | |
496 assertNoErrors(source); | |
497 var cAdd = AstFinder.getMethodInClass(unit, "C", "add"); | |
498 var covariantC = getClassCovariantParameters(AstFinder.getClass(unit, "C")); | |
499 expect(covariantC.toList(), [cAdd.element.parameters[0]]); | |
500 | |
501 var dAdd = AstFinder.getMethodInClass(unit, "D", "add"); | |
502 var covariantD = getClassCovariantParameters(AstFinder.getClass(unit, "D")); | |
503 expect(covariantD, null); | |
504 | |
505 var classE = AstFinder.getClass(unit, "E"); | |
506 var covariantE = getClassCovariantParameters(classE); | |
507 var superCovariantE = getSuperclassCovariantParameters(classE); | |
508 expect(covariantE.toList(), []); | |
509 expect(superCovariantE.toList(), [dAdd.element.parameters[0]]); | |
510 } | |
511 | |
512 @soloTest | |
Leaf
2017/06/28 18:12:29
remove?
Jennifer Messerly
2017/07/05 20:11:20
Done.
| |
513 test_covarianceChecks_returnFunction() async { | |
514 var source = addSource(r''' | |
515 | |
516 typedef F<T>(T t); | |
517 typedef T R<T>(); | |
518 class C<T> { | |
519 F<T> f; | |
520 F<T> get g => null; | |
521 F<T> m1() => null; | |
522 R<F<T>> m2() => null; | |
523 | |
524 casts(C<T> other, T t, F<T> fT, R<F<T>> rfT) { | |
525 fT = f; | |
526 fT = g; | |
527 fT = m1(); | |
528 rfT = m2(); | |
529 | |
530 f(t); | |
531 g(t); | |
532 (f)(t); | |
533 (g)(t); | |
534 m1()(t); | |
535 m2()()(t); | |
536 | |
537 fT = this.f; | |
538 fT = this.g; | |
539 fT = this.m1(); | |
540 rfT = this.m2(); | |
541 | |
542 this.f(t); | |
543 this.g(t); | |
544 (this.f)(t); | |
545 (this.g)(t); | |
546 this.m1()(t); | |
547 this.m2()()(t); | |
548 | |
549 fT = other.f; | |
550 fT = other.g; | |
551 fT = other.m1(); | |
552 rfT = other.m2(); | |
553 | |
554 other.f(t); | |
555 other.g(t); | |
556 (other.f)(t); | |
557 (other.g)(t); | |
558 other.m1()(t); | |
559 other.m2()()(t); | |
560 } | |
561 } | |
562 class D extends C<int> {} | |
563 | |
564 D d; | |
565 C<Object> c; | |
566 F<Object> f; | |
567 F<Null> fN; | |
568 R<F<Object>> rf; | |
569 R<F<Null>> rfN; | |
570 R<R<F<Object>>> rrf; | |
571 R<R<F<Null>>> rrfN; | |
572 Object obj; | |
573 F<int> fi; | |
574 R<F<int>> rfi; | |
575 R<R<F<int>>> rrfi; | |
576 | |
577 casts() { | |
578 f = c.f; | |
579 f = c.g; | |
580 rf = c.m1; | |
581 rrf = c.m2; | |
582 f = c.m1(); | |
583 rf = c.m2(); | |
584 c.m2()(); | |
585 | |
586 c.f(obj); | |
587 c.g(obj); | |
588 (c.f)(obj); | |
589 (c.g)(obj); | |
590 (c.m1)(); | |
591 c.m1()(obj); | |
592 (c.m2)(); | |
593 } | |
594 | |
595 noCasts() { | |
596 c.f; | |
597 c.g; | |
598 c.m1; | |
599 c.m1(); | |
600 c.m2(); | |
601 | |
602 fN = c.f; | |
603 fN = c.g; | |
604 rfN = c.m1; | |
605 rrfN = c.m2; | |
606 fN = c.m1(); | |
607 rfN = c.m2(); | |
608 fN = c.m2()(); | |
609 | |
610 fi = d.f; | |
611 fi = d.g; | |
612 rfi = d.m1; | |
613 fi = d.m1(); | |
614 rrfi = d.m2; | |
615 rfi = d.m2(); | |
616 fi = d.m2()(); | |
617 d.f(42); | |
618 d.g(42); | |
619 (d.f)(42); | |
620 (d.g)(42); | |
621 d.m1()(42); | |
622 d.m2()()(42); | |
623 } | |
624 '''); | |
625 var unit = (await computeAnalysisResult(source)).unit; | |
626 assertNoErrors(source); | |
627 | |
628 void expectCast(Statement statement, bool hasCast) { | |
629 var expr = (statement as ExpressionStatement).expression; | |
630 Expression value; | |
631 if (expr is AssignmentExpression) { | |
632 value = expr.rightHandSide; | |
633 } else { | |
634 value = expr; | |
635 while (value is InvocationExpression) { | |
636 value = (value as InvocationExpression).function; | |
637 } | |
638 // We don't put the cast on the method itself | |
639 if (value is SimpleIdentifier && value.name.startsWith('m')) { | |
640 value = value.parent; | |
641 } | |
642 } | |
643 while (value is ParenthesizedExpression) { | |
644 value = (value as ParenthesizedExpression).expression; | |
645 } | |
646 var parent = value.parent; | |
647 var cast = parent is MethodInvocation && value == parent.methodName | |
648 ? getImplicitOperationCast(value) | |
649 : getImplicitCast(value); | |
650 expect(cast, hasCast ? isNotNull : isNull, | |
651 reason: '`$expr` should ' + | |
652 (hasCast ? '' : 'not ') + | |
653 'have a cast on `$value`.'); | |
654 } | |
655 | |
656 for (var s in AstFinder.getStatementsInMethod(unit, 'C', 'casts')) { | |
657 expectCast(s, true); | |
658 } | |
659 for (var s in AstFinder.getStatementsInTopLevelFunction(unit, 'noCasts')) { | |
660 expectCast(s, false); | |
661 } | |
662 for (var s in AstFinder.getStatementsInTopLevelFunction(unit, 'casts')) { | |
663 expectCast(s, true); | |
664 } | |
665 } | |
666 | |
423 test_factoryConstructor_propagation() async { | 667 test_factoryConstructor_propagation() async { |
424 String code = r''' | 668 String code = r''' |
425 class A<T> { | 669 class A<T> { |
426 factory A() { return new B(); } | 670 factory A() { return new B(); } |
427 } | 671 } |
428 class B<S> extends A<S> {} | 672 class B<S> extends A<S> {} |
429 '''; | 673 '''; |
430 CompilationUnit unit = await resolveSource(code); | 674 CompilationUnit unit = await resolveSource(code); |
431 | 675 |
432 ConstructorDeclaration constructor = | 676 ConstructorDeclaration constructor = |
(...skipping 3490 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3923 var v = x; | 4167 var v = x; |
3924 v; // marker | 4168 v; // marker |
3925 } | 4169 } |
3926 int x = 3; | 4170 int x = 3; |
3927 '''; | 4171 '''; |
3928 CompilationUnit unit = await resolveSource(code); | 4172 CompilationUnit unit = await resolveSource(code); |
3929 assertPropagatedAssignedType(code, unit, typeProvider.intType, null); | 4173 assertPropagatedAssignedType(code, unit, typeProvider.intType, null); |
3930 assertTypeOfMarkedExpression(code, unit, typeProvider.intType, null); | 4174 assertTypeOfMarkedExpression(code, unit, typeProvider.intType, null); |
3931 } | 4175 } |
3932 } | 4176 } |
OLD | NEW |