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

Side by Side Diff: pkg/analyzer/test/generated/resolver_test.dart

Issue 1386033003: Issue 24503. Disable type overrides for properties. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « pkg/analyzer/lib/src/generated/resolver.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library engine.resolver_test; 5 library engine.resolver_test;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 8
9 import 'package:analyzer/src/context/context.dart' as newContext; 9 import 'package:analyzer/src/context/context.dart' as newContext;
10 import 'package:analyzer/src/generated/ast.dart'; 10 import 'package:analyzer/src/generated/ast.dart';
(...skipping 977 matching lines...) Expand 10 before | Expand all | Expand 10 after
988 ]); 988 ]);
989 verify([source]); 989 verify([source]);
990 } 990 }
991 991
992 void test_fieldTypeMismatch_generic() { 992 void test_fieldTypeMismatch_generic() {
993 Source source = addSource(r''' 993 Source source = addSource(r'''
994 class C<T> { 994 class C<T> {
995 final T x = y; 995 final T x = y;
996 const C(); 996 const C();
997 } 997 }
998 const y = 1; 998 const int y = 1;
999 var v = const C<String>(); 999 var v = const C<String>();
1000 '''); 1000 ''');
1001 computeLibrarySourceErrors(source); 1001 computeLibrarySourceErrors(source);
1002 assertErrors(source, [ 1002 assertErrors(source, [
1003 CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH, 1003 CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH,
1004 HintCode.INVALID_ASSIGNMENT 1004 StaticTypeWarningCode.INVALID_ASSIGNMENT
1005 ]); 1005 ]);
1006 verify([source]); 1006 verify([source]);
1007 } 1007 }
1008 1008
1009 void test_fieldTypeMismatch_unresolved() { 1009 void test_fieldTypeMismatch_unresolved() {
1010 Source source = addSource(r''' 1010 Source source = addSource(r'''
1011 class A { 1011 class A {
1012 const A(x) : y = x; 1012 const A(x) : y = x;
1013 final Unresolved y; 1013 final Unresolved y;
1014 } 1014 }
1015 var v = const A('foo');'''); 1015 var v = const A('foo');''');
1016 computeLibrarySourceErrors(source); 1016 computeLibrarySourceErrors(source);
1017 assertErrors(source, [ 1017 assertErrors(source, [
1018 CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH, 1018 CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH,
1019 StaticWarningCode.UNDEFINED_CLASS 1019 StaticWarningCode.UNDEFINED_CLASS
1020 ]); 1020 ]);
1021 verify([source]); 1021 verify([source]);
1022 } 1022 }
1023 1023
1024 void test_fieldTypeOk_generic() { 1024 void test_fieldTypeOk_generic() {
1025 Source source = addSource(r''' 1025 Source source = addSource(r'''
1026 class C<T> { 1026 class C<T> {
1027 final T x = y; 1027 final T x = y;
1028 const C(); 1028 const C();
1029 } 1029 }
1030 const y = 1; 1030 const int y = 1;
1031 var v = const C<int>(); 1031 var v = const C<int>();
1032 '''); 1032 ''');
1033 computeLibrarySourceErrors(source); 1033 computeLibrarySourceErrors(source);
1034 assertErrors(source, [HintCode.INVALID_ASSIGNMENT]); 1034 assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
1035 verify([source]); 1035 verify([source]);
1036 } 1036 }
1037 1037
1038 void test_fieldTypeOk_null() { 1038 void test_fieldTypeOk_null() {
1039 Source source = addSource(r''' 1039 Source source = addSource(r'''
1040 class A { 1040 class A {
1041 const A(x) : y = x; 1041 const A(x) : y = x;
1042 final int y; 1042 final int y;
1043 } 1043 }
1044 var v = const A(null);'''); 1044 var v = const A(null);''');
(...skipping 8922 matching lines...) Expand 10 before | Expand all | Expand 10 after
9967 } 9967 }
9968 } 9968 }
9969 } 9969 }
9970 9970
9971 class SourceContainer_ChangeSetTest_test_toString implements SourceContainer { 9971 class SourceContainer_ChangeSetTest_test_toString implements SourceContainer {
9972 @override 9972 @override
9973 bool contains(Source source) => false; 9973 bool contains(Source source) => false;
9974 } 9974 }
9975 9975
9976 /** 9976 /**
9977 * Shared infrastructure for [StaticTypeAnalyzer2Test] and
9978 * [StrongModeStaticTypeAnalyzer2Test].
9979 */
9980 class _StaticTypeAnalyzer2TestShared extends ResolverTestCase {
9981 String testCode;
9982 Source testSource;
9983 CompilationUnit testUnit;
9984
9985 SimpleIdentifier _findIdentifier(String search) {
9986 SimpleIdentifier identifier = EngineTestCase.findNode(
9987 testUnit, testCode, search, (node) => node is SimpleIdentifier);
9988 return identifier;
9989 }
9990
9991 void _resolveTestUnit(String code) {
9992 testCode = code;
9993 testSource = addSource(testCode);
9994 LibraryElement library = resolve2(testSource);
9995 assertNoErrors(testSource);
9996 verify([testSource]);
9997 testUnit = resolveCompilationUnit(testSource, library);
9998 }
9999 }
10000
10001 /**
10002 * Like [StaticTypeAnalyzerTest], but as end-to-end tests. 9977 * Like [StaticTypeAnalyzerTest], but as end-to-end tests.
10003 */ 9978 */
10004 @reflectiveTest 9979 @reflectiveTest
10005 class StaticTypeAnalyzer2Test extends _StaticTypeAnalyzer2TestShared { 9980 class StaticTypeAnalyzer2Test extends _StaticTypeAnalyzer2TestShared {
10006 void test_FunctionExpressionInvocation_block() { 9981 void test_FunctionExpressionInvocation_block() {
10007 String code = r''' 9982 String code = r'''
10008 main() { 9983 main() {
10009 var foo = (() { return 1; })(); 9984 var foo = (() { return 1; })();
10010 } 9985 }
10011 '''; 9986 ''';
(...skipping 1896 matching lines...) Expand 10 before | Expand all | Expand 10 after
11908 * Strong mode static analyzer end to end tests 11883 * Strong mode static analyzer end to end tests
11909 */ 11884 */
11910 @reflectiveTest 11885 @reflectiveTest
11911 class StrongModeStaticTypeAnalyzer2Test extends _StaticTypeAnalyzer2TestShared { 11886 class StrongModeStaticTypeAnalyzer2Test extends _StaticTypeAnalyzer2TestShared {
11912 void setUp() { 11887 void setUp() {
11913 AnalysisOptionsImpl options = new AnalysisOptionsImpl(); 11888 AnalysisOptionsImpl options = new AnalysisOptionsImpl();
11914 options.strongMode = true; 11889 options.strongMode = true;
11915 resetWithOptions(options); 11890 resetWithOptions(options);
11916 } 11891 }
11917 11892
11918 void test_ternaryOperator_null_right() { 11893 void test_dynamicObjectGetter_hashCode() {
11919 String code = r''' 11894 String code = r'''
11920 main() { 11895 main() {
11921 var foo = (true) ? 3 : null; 11896 dynamic a = null;
11897 var foo = a.hashCode;
11922 } 11898 }
11923 '''; 11899 ''';
11924 _resolveTestUnit(code); 11900 _resolveTestUnit(code);
11925 11901
11926 SimpleIdentifier identifier = _findIdentifier('foo'); 11902 SimpleIdentifier identifier = _findIdentifier('foo');
11927 VariableDeclaration declaration = 11903 VariableDeclaration declaration =
11928 identifier.getAncestor((node) => node is VariableDeclaration); 11904 identifier.getAncestor((node) => node is VariableDeclaration);
11929 expect(declaration.initializer.staticType.name, 'int'); 11905 expect(declaration.initializer.staticType.name, 'int');
11930 expect(declaration.initializer.propagatedType, isNull); 11906 expect(declaration.initializer.propagatedType, isNull);
11931 } 11907 }
11932 11908
11933 void test_ternaryOperator_null_left() { 11909 void test_dynamicObjectMethod_toString() {
11934 String code = r''' 11910 String code = r'''
11935 main() { 11911 main() {
11936 var foo = (true) ? null : 3; 11912 dynamic a = null;
11913 var foo = a.toString();
11937 } 11914 }
11938 '''; 11915 ''';
11939 _resolveTestUnit(code); 11916 _resolveTestUnit(code);
11940 11917
11941 SimpleIdentifier identifier = _findIdentifier('foo'); 11918 SimpleIdentifier identifier = _findIdentifier('foo');
11942 VariableDeclaration declaration = 11919 VariableDeclaration declaration =
11943 identifier.getAncestor((node) => node is VariableDeclaration); 11920 identifier.getAncestor((node) => node is VariableDeclaration);
11944 expect(declaration.initializer.staticType.name, 'int'); 11921 expect(declaration.initializer.staticType.name, 'String');
11945 expect(declaration.initializer.propagatedType, isNull); 11922 expect(declaration.initializer.propagatedType, isNull);
11946 } 11923 }
11947 11924
11948 void test_dynamicObjectMethod_toString() { 11925 void test_pseudoGeneric_max_doubleDouble() {
11949 String code = r''' 11926 String code = r'''
11927 import 'dart:math';
11950 main() { 11928 main() {
11951 dynamic a = null; 11929 var foo = max(1.0, 2.0);
11952 var foo = a.toString();
11953 } 11930 }
11954 '''; 11931 ''';
11955 _resolveTestUnit(code); 11932 _resolveTestUnit(code);
11956 11933
11957 SimpleIdentifier identifier = _findIdentifier('foo'); 11934 SimpleIdentifier identifier = _findIdentifier('foo');
11958 VariableDeclaration declaration = 11935 VariableDeclaration declaration =
11959 identifier.getAncestor((node) => node is VariableDeclaration); 11936 identifier.getAncestor((node) => node is VariableDeclaration);
11960 expect(declaration.initializer.staticType.name, 'String'); 11937 expect(declaration.initializer.staticType.name, 'double');
11961 expect(declaration.initializer.propagatedType, isNull); 11938 expect(declaration.initializer.propagatedType, isNull);
11962 } 11939 }
11963 11940
11964 void test_dynamicObjectGetter_hashCode() { 11941 void test_pseudoGeneric_max_doubleInt() {
11965 String code = r''' 11942 String code = r'''
11943 import 'dart:math';
11966 main() { 11944 main() {
11967 dynamic a = null; 11945 var foo = max(1.0, 2);
11968 var foo = a.hashCode;
11969 } 11946 }
11970 '''; 11947 ''';
11971 _resolveTestUnit(code); 11948 _resolveTestUnit(code);
11972 11949
11973 SimpleIdentifier identifier = _findIdentifier('foo'); 11950 SimpleIdentifier identifier = _findIdentifier('foo');
11974 VariableDeclaration declaration = 11951 VariableDeclaration declaration =
11975 identifier.getAncestor((node) => node is VariableDeclaration); 11952 identifier.getAncestor((node) => node is VariableDeclaration);
11976 expect(declaration.initializer.staticType.name, 'int'); 11953 expect(declaration.initializer.staticType.name, 'num');
11977 expect(declaration.initializer.propagatedType, isNull); 11954 expect(declaration.initializer.propagatedType, isNull);
11978 } 11955 }
11979 11956
11980 void test_pseudoGeneric_max_intInt() { 11957 void test_pseudoGeneric_max_intDouble() {
11981 String code = r''' 11958 String code = r'''
11982 import 'dart:math'; 11959 import 'dart:math';
11983 main() { 11960 main() {
11984 var foo = max(1, 2); 11961 var foo = max(1, 2.0);
11985 } 11962 }
11986 '''; 11963 ''';
11987 _resolveTestUnit(code); 11964 _resolveTestUnit(code);
11988 11965
11989 SimpleIdentifier identifier = _findIdentifier('foo'); 11966 SimpleIdentifier identifier = _findIdentifier('foo');
11990 VariableDeclaration declaration = 11967 VariableDeclaration declaration =
11991 identifier.getAncestor((node) => node is VariableDeclaration); 11968 identifier.getAncestor((node) => node is VariableDeclaration);
11992 expect(declaration.initializer.staticType.name, 'int'); 11969 expect(declaration.initializer.staticType.name, 'num');
11993 expect(declaration.initializer.propagatedType, isNull); 11970 expect(declaration.initializer.propagatedType, isNull);
11994 } 11971 }
11995 11972
11996 void test_pseudoGeneric_max_doubleDouble() { 11973 void test_pseudoGeneric_max_intInt() {
11997 String code = r''' 11974 String code = r'''
11998 import 'dart:math'; 11975 import 'dart:math';
11999 main() { 11976 main() {
12000 var foo = max(1.0, 2.0); 11977 var foo = max(1, 2);
12001 } 11978 }
12002 '''; 11979 ''';
12003 _resolveTestUnit(code); 11980 _resolveTestUnit(code);
12004 11981
12005 SimpleIdentifier identifier = _findIdentifier('foo'); 11982 SimpleIdentifier identifier = _findIdentifier('foo');
12006 VariableDeclaration declaration = 11983 VariableDeclaration declaration =
12007 identifier.getAncestor((node) => node is VariableDeclaration); 11984 identifier.getAncestor((node) => node is VariableDeclaration);
12008 expect(declaration.initializer.staticType.name, 'double'); 11985 expect(declaration.initializer.staticType.name, 'int');
12009 expect(declaration.initializer.propagatedType, isNull); 11986 expect(declaration.initializer.propagatedType, isNull);
12010 } 11987 }
12011 11988
12012 void test_pseudoGeneric_max_intDouble() { 11989 void test_pseudoGeneric_then() {
12013 String code = r''' 11990 String code = r'''
12014 import 'dart:math'; 11991 import 'dart:async';
11992 String toString(int x) => x.toString();
12015 main() { 11993 main() {
12016 var foo = max(1, 2.0); 11994 Future<int> bar = null;
11995 var foo = bar.then(toString);
12017 } 11996 }
12018 '''; 11997 ''';
12019 _resolveTestUnit(code); 11998 _resolveTestUnit(code);
12020 11999
12021 SimpleIdentifier identifier = _findIdentifier('foo'); 12000 SimpleIdentifier identifier = _findIdentifier('foo');
12022 VariableDeclaration declaration = 12001 VariableDeclaration declaration =
12023 identifier.getAncestor((node) => node is VariableDeclaration); 12002 identifier.getAncestor((node) => node is VariableDeclaration);
12024 expect(declaration.initializer.staticType.name, 'num'); 12003
12004 expect(declaration.initializer.staticType.toString(), "Future<String>");
12025 expect(declaration.initializer.propagatedType, isNull); 12005 expect(declaration.initializer.propagatedType, isNull);
12026 } 12006 }
12027 12007
12028 void test_pseudoGeneric_max_doubleInt() { 12008 void test_ternaryOperator_null_left() {
12029 String code = r''' 12009 String code = r'''
12030 import 'dart:math';
12031 main() { 12010 main() {
12032 var foo = max(1.0, 2); 12011 var foo = (true) ? null : 3;
12033 } 12012 }
12034 '''; 12013 ''';
12035 _resolveTestUnit(code); 12014 _resolveTestUnit(code);
12036 12015
12037 SimpleIdentifier identifier = _findIdentifier('foo'); 12016 SimpleIdentifier identifier = _findIdentifier('foo');
12038 VariableDeclaration declaration = 12017 VariableDeclaration declaration =
12039 identifier.getAncestor((node) => node is VariableDeclaration); 12018 identifier.getAncestor((node) => node is VariableDeclaration);
12040 expect(declaration.initializer.staticType.name, 'num'); 12019 expect(declaration.initializer.staticType.name, 'int');
12041 expect(declaration.initializer.propagatedType, isNull); 12020 expect(declaration.initializer.propagatedType, isNull);
12042 } 12021 }
12043 12022
12044 void test_pseudoGeneric_then() { 12023 void test_ternaryOperator_null_right() {
12045 String code = r''' 12024 String code = r'''
12046 import 'dart:async';
12047 String toString(int x) => x.toString();
12048 main() { 12025 main() {
12049 Future<int> bar = null; 12026 var foo = (true) ? 3 : null;
12050 var foo = bar.then(toString);
12051 } 12027 }
12052 '''; 12028 ''';
12053 _resolveTestUnit(code); 12029 _resolveTestUnit(code);
12054 12030
12055 SimpleIdentifier identifier = _findIdentifier('foo'); 12031 SimpleIdentifier identifier = _findIdentifier('foo');
12056 VariableDeclaration declaration = 12032 VariableDeclaration declaration =
12057 identifier.getAncestor((node) => node is VariableDeclaration); 12033 identifier.getAncestor((node) => node is VariableDeclaration);
12058 12034 expect(declaration.initializer.staticType.name, 'int');
12059 expect(declaration.initializer.staticType.toString(), "Future<String>");
12060 expect(declaration.initializer.propagatedType, isNull); 12035 expect(declaration.initializer.propagatedType, isNull);
12061 } 12036 }
12062 } 12037 }
12063 12038
12064 @reflectiveTest 12039 @reflectiveTest
12065 class StrongModeTypePropagationTest extends ResolverTestCase { 12040 class StrongModeTypePropagationTest extends ResolverTestCase {
12066 @override 12041 @override
12067 void setUp() { 12042 void setUp() {
12068 AnalysisOptionsImpl options = new AnalysisOptionsImpl(); 12043 AnalysisOptionsImpl options = new AnalysisOptionsImpl();
12069 options.strongMode = true; 12044 options.strongMode = true;
(...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after
12548 import 'lib.dart'; 12523 import 'lib.dart';
12549 f(p) { 12524 f(p) {
12550 if (p is A) { 12525 if (p is A) {
12551 return p.v; // marker 12526 return p.v; // marker
12552 } 12527 }
12553 }'''; 12528 }''';
12554 _assertTypeOfMarkedExpression( 12529 _assertTypeOfMarkedExpression(
12555 code, typeProvider.dynamicType, typeProvider.intType); 12530 code, typeProvider.dynamicType, typeProvider.intType);
12556 } 12531 }
12557 12532
12533 void fail_finalPropertyInducingVariable_classMember_instance_unprefixed() {
12534 String code = r'''
12535 class A {
12536 final v = 0;
12537 m() {
12538 v; // marker
12539 }
12540 }''';
12541 _assertTypeOfMarkedExpression(
12542 code, typeProvider.dynamicType, typeProvider.intType);
12543 }
12544
12558 void fail_finalPropertyInducingVariable_classMember_static() { 12545 void fail_finalPropertyInducingVariable_classMember_static() {
12559 addNamedSource( 12546 addNamedSource(
12560 "/lib.dart", 12547 "/lib.dart",
12561 r''' 12548 r'''
12562 class A { 12549 class A {
12563 static final V = 0; 12550 static final V = 0;
12564 }'''); 12551 }''');
12565 String code = r''' 12552 String code = r'''
12566 import 'lib.dart'; 12553 import 'lib.dart';
12567 f() { 12554 f() {
(...skipping 1274 matching lines...) Expand 10 before | Expand all | Expand 10 after
13842 Base x = null; 13829 Base x = null;
13843 if (x is Derived) { 13830 if (x is Derived) {
13844 print(x.y); // GOOD 13831 print(x.y); // GOOD
13845 } 13832 }
13846 x = null; 13833 x = null;
13847 }'''); 13834 }''');
13848 computeLibrarySourceErrors(source); 13835 computeLibrarySourceErrors(source);
13849 assertNoErrors(source); 13836 assertNoErrors(source);
13850 } 13837 }
13851 13838
13839 void test_objectAccessInference_disabled_for_library_prefix() {
13840 String name = 'hashCode';
13841 addNamedSource(
13842 '/helper.dart',
13843 '''
13844 library helper;
13845 dynamic get $name => 42;
13846 ''');
13847 String code = '''
13848 import 'helper.dart' as helper;
13849 main() {
13850 helper.$name; // marker
13851 }''';
13852
13853 SimpleIdentifier id = _findMarkedIdentifier(code, "; // marker");
13854 PrefixedIdentifier prefixedId = id.parent;
13855 expect(id.staticType, typeProvider.dynamicType);
13856 expect(prefixedId.staticType, typeProvider.dynamicType);
13857 }
13858
13859 void test_objectAccessInference_disabled_for_local_getter() {
13860 String name = 'hashCode';
13861 String code = '''
13862 dynamic get $name => null;
13863 main() {
13864 $name; // marker
13865 }''';
13866
13867 SimpleIdentifier getter = _findMarkedIdentifier(code, "; // marker");
13868 expect(getter.staticType, typeProvider.dynamicType);
13869 }
13870
13871 void test_objectAccessInference_enabled_for_cascades() {
13872 String name = 'hashCode';
13873 String code = '''
13874 main() {
13875 dynamic obj;
13876 obj..$name..$name; // marker
13877 }''';
13878 PropertyAccess access = _findMarkedIdentifier(code, "; // marker").parent;
13879 expect(access.staticType, typeProvider.dynamicType);
13880 expect(access.realTarget.staticType, typeProvider.dynamicType);
13881 }
13882
13883 void test_objectMethodInference_disabled_for_library_prefix() {
13884 String name = 'toString';
13885 addNamedSource(
13886 '/helper.dart',
13887 '''
13888 library helper;
13889 dynamic $name = (int x) => x + 42');
13890 ''');
13891 String code = '''
13892 import 'helper.dart' as helper;
13893 main() {
13894 helper.$name(); // marker
13895 }''';
13896 SimpleIdentifier methodName = _findMarkedIdentifier(code, "(); // marker");
13897 MethodInvocation methodInvoke = methodName.parent;
13898 expect(methodName.staticType, null, reason: 'library prefix has no type');
13899 expect(methodInvoke.staticType, typeProvider.dynamicType);
13900 }
13901
13902 void test_objectMethodInference_disabled_for_local_function() {
13903 String name = 'toString';
13904 String code = '''
13905 main() {
13906 dynamic $name = () => null;
13907 $name(); // marker
13908 }''';
13909 SimpleIdentifier identifier = _findMarkedIdentifier(code, "$name = ");
13910 expect(identifier.staticType, typeProvider.dynamicType);
13911
13912 SimpleIdentifier methodName = _findMarkedIdentifier(code, "(); // marker");
13913 MethodInvocation methodInvoke = methodName.parent;
13914 expect(methodName.staticType, typeProvider.dynamicType);
13915 expect(methodInvoke.staticType, typeProvider.dynamicType);
13916 }
13917
13918 void test_objectMethodInference_enabled_for_cascades() {
13919 String name = 'toString';
13920 String code = '''
13921 main() {
13922 dynamic obj;
13923 obj..$name()..$name(); // marker
13924 }''';
13925 SimpleIdentifier methodName = _findMarkedIdentifier(code, "(); // marker");
13926 MethodInvocation methodInvoke = methodName.parent;
13927
13928 expect(methodInvoke.staticType, typeProvider.dynamicType);
13929 expect(methodInvoke.realTarget.staticType, typeProvider.dynamicType);
13930 }
13931
13852 void test_objectMethodOnDynamicExpression_doubleEquals() { 13932 void test_objectMethodOnDynamicExpression_doubleEquals() {
13853 // https://code.google.com/p/dart/issues/detail?id=20342 13933 // https://code.google.com/p/dart/issues/detail?id=20342
13854 // 13934 //
13855 // This was not actually part of Issue 20342, since the spec specifies a 13935 // This was not actually part of Issue 20342, since the spec specifies a
13856 // static type of [bool] for [==] comparison and the implementation 13936 // static type of [bool] for [==] comparison and the implementation
13857 // was already consistent with the spec there. But, it's another 13937 // was already consistent with the spec there. But, it's another
13858 // [Object] method, so it's included here. 13938 // [Object] method, so it's included here.
13859 _assertTypeOfMarkedExpression( 13939 _assertTypeOfMarkedExpression(
13860 r''' 13940 r'''
13861 f1(x) { 13941 f1(x) {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
13895 _assertTypeOfMarkedExpression( 13975 _assertTypeOfMarkedExpression(
13896 r''' 13976 r'''
13897 f1(x) { 13977 f1(x) {
13898 var v = x.toString(); 13978 var v = x.toString();
13899 return v; // marker 13979 return v; // marker
13900 }''', 13980 }''',
13901 null, 13981 null,
13902 typeProvider.stringType); 13982 typeProvider.stringType);
13903 } 13983 }
13904 13984
13905 void test_objectMethodInference_disabled_for_local_function() {
13906 String name = 'toString';
13907 String code = '''
13908 main() {
13909 dynamic $name = () => null;
13910 $name(); // marker
13911 }''';
13912 SimpleIdentifier identifier = _findMarkedIdentifier(code, "$name = ");
13913 expect(identifier.staticType, typeProvider.dynamicType);
13914
13915 SimpleIdentifier methodName = _findMarkedIdentifier(code, "(); // marker");
13916 MethodInvocation methodInvoke = methodName.parent;
13917 expect(methodName.staticType, typeProvider.dynamicType);
13918 expect(methodInvoke.staticType, typeProvider.dynamicType);
13919 }
13920
13921 void test_objectMethodInference_disabled_for_library_prefix() {
13922 String name = 'toString';
13923 addNamedSource('/helper.dart', '''
13924 library helper;
13925 dynamic $name = (int x) => x + 42');
13926 ''');
13927 String code = '''
13928 import 'helper.dart' as helper;
13929 main() {
13930 helper.$name(); // marker
13931 }''';
13932 SimpleIdentifier methodName = _findMarkedIdentifier(code, "(); // marker");
13933 MethodInvocation methodInvoke = methodName.parent;
13934 expect(methodName.staticType, null, reason: 'library prefix has no type');
13935 expect(methodInvoke.staticType, typeProvider.dynamicType);
13936 }
13937
13938 void test_objectMethodInference_enabled_for_cascades() {
13939 String name = 'toString';
13940 String code = '''
13941 main() {
13942 dynamic obj;
13943 obj..$name()..$name(); // marker
13944 }''';
13945 SimpleIdentifier methodName = _findMarkedIdentifier(code, "(); // marker");
13946 MethodInvocation methodInvoke = methodName.parent;
13947
13948 expect(methodInvoke.staticType, typeProvider.dynamicType);
13949 expect(methodInvoke.realTarget.staticType, typeProvider.dynamicType);
13950 }
13951
13952
13953 void test_objectAccessInference_disabled_for_local_getter() {
13954 String name = 'hashCode';
13955 String code = '''
13956 dynamic get $name => null;
13957 main() {
13958 $name; // marker
13959 }''';
13960
13961 SimpleIdentifier getter = _findMarkedIdentifier(code, "; // marker");
13962 expect(getter.staticType, typeProvider.dynamicType);
13963 }
13964
13965 void test_objectAccessInference_disabled_for_library_prefix() {
13966 String name = 'hashCode';
13967 addNamedSource('/helper.dart', '''
13968 library helper;
13969 dynamic get $name => 42;
13970 ''');
13971 String code = '''
13972 import 'helper.dart' as helper;
13973 main() {
13974 helper.$name; // marker
13975 }''';
13976
13977 SimpleIdentifier id = _findMarkedIdentifier(code, "; // marker");
13978 PrefixedIdentifier prefixedId = id.parent;
13979 expect(id.staticType, typeProvider.dynamicType);
13980 expect(prefixedId.staticType, typeProvider.dynamicType);
13981 }
13982
13983 void test_objectAccessInference_enabled_for_cascades() {
13984 String name = 'hashCode';
13985 String code = '''
13986 main() {
13987 dynamic obj;
13988 obj..$name..$name; // marker
13989 }''';
13990 PropertyAccess access = _findMarkedIdentifier(code, "; // marker").parent;
13991 expect(access.staticType, typeProvider.dynamicType);
13992 expect(access.realTarget.staticType, typeProvider.dynamicType);
13993 }
13994
13995 void test_propagatedReturnType_localFunction() { 13985 void test_propagatedReturnType_localFunction() {
13996 String code = r''' 13986 String code = r'''
13997 main() { 13987 main() {
13998 f() => 42; 13988 f() => 42;
13999 var v = f(); 13989 var v = f();
14000 }'''; 13990 }''';
14001 _assertPropagatedAssignedType( 13991 _assertPropagatedAssignedType(
14002 code, typeProvider.dynamicType, typeProvider.intType); 13992 code, typeProvider.dynamicType, typeProvider.intType);
14003 } 13993 }
14004 13994
(...skipping 817 matching lines...) Expand 10 before | Expand all | Expand 10 after
14822 // check propagated type 14812 // check propagated type
14823 FunctionType propagatedType = node.propagatedType as FunctionType; 14813 FunctionType propagatedType = node.propagatedType as FunctionType;
14824 expect(propagatedType.returnType, test.typeProvider.stringType); 14814 expect(propagatedType.returnType, test.typeProvider.stringType);
14825 } on AnalysisException catch (e, stackTrace) { 14815 } on AnalysisException catch (e, stackTrace) {
14826 thrownException[0] = new CaughtException(e, stackTrace); 14816 thrownException[0] = new CaughtException(e, stackTrace);
14827 } 14817 }
14828 } 14818 }
14829 return null; 14819 return null;
14830 } 14820 }
14831 } 14821 }
14822
14823 /**
14824 * Shared infrastructure for [StaticTypeAnalyzer2Test] and
14825 * [StrongModeStaticTypeAnalyzer2Test].
14826 */
14827 class _StaticTypeAnalyzer2TestShared extends ResolverTestCase {
14828 String testCode;
14829 Source testSource;
14830 CompilationUnit testUnit;
14831
14832 SimpleIdentifier _findIdentifier(String search) {
14833 SimpleIdentifier identifier = EngineTestCase.findNode(
14834 testUnit, testCode, search, (node) => node is SimpleIdentifier);
14835 return identifier;
14836 }
14837
14838 void _resolveTestUnit(String code) {
14839 testCode = code;
14840 testSource = addSource(testCode);
14841 LibraryElement library = resolve2(testSource);
14842 assertNoErrors(testSource);
14843 verify([testSource]);
14844 testUnit = resolveCompilationUnit(testSource, library);
14845 }
14846 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/generated/resolver.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698