OLD | NEW |
---|---|
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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.src.summary.summary_common; | 5 library analyzer.test.src.summary.summary_common; |
6 | 6 |
7 import 'package:analyzer/analyzer.dart'; | 7 import 'package:analyzer/analyzer.dart'; |
8 import 'package:analyzer/dart/ast/ast.dart'; | 8 import 'package:analyzer/dart/ast/ast.dart'; |
9 import 'package:analyzer/error/listener.dart'; | 9 import 'package:analyzer/error/listener.dart'; |
10 import 'package:analyzer/src/dart/scanner/reader.dart'; | 10 import 'package:analyzer/src/dart/scanner/reader.dart'; |
(...skipping 831 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
842 signature2 = unlinkedUnits[0].apiSignature; | 842 signature2 = unlinkedUnits[0].apiSignature; |
843 } | 843 } |
844 { | 844 { |
845 serializeLibraryText('class B {}'); | 845 serializeLibraryText('class B {}'); |
846 signature3 = unlinkedUnits[0].apiSignature; | 846 signature3 = unlinkedUnits[0].apiSignature; |
847 } | 847 } |
848 expect(signature2, signature1); | 848 expect(signature2, signature1); |
849 expect(signature3, isNot(signature1)); | 849 expect(signature3, isNot(signature1)); |
850 } | 850 } |
851 | 851 |
852 test_apiSignature_excludeBody_constructor() { | |
853 List<int> signature1; | |
854 List<int> signature2; | |
855 List<int> signature3; | |
856 { | |
857 serializeLibraryText(r''' | |
858 class A { | |
859 A() { | |
860 } | |
861 } | |
862 '''); | |
863 signature1 = unlinkedUnits[0].apiSignature; | |
864 } | |
865 { | |
866 serializeLibraryText(r''' | |
867 class A { | |
868 A() { | |
869 int v1; | |
870 f() { | |
871 double v2; | |
872 } | |
873 } | |
874 } | |
875 '''); | |
876 signature2 = unlinkedUnits[0].apiSignature; | |
877 } | |
878 { | |
879 serializeLibraryText(r''' | |
880 class A { | |
881 A(int p) { | |
882 } | |
883 } | |
884 '''); | |
885 } | |
886 expect(signature2, signature1); | |
887 expect(signature3, isNot(signature1)); | |
888 } | |
889 | |
890 test_apiSignature_excludeBody_method() { | |
891 List<int> signature1; | |
892 List<int> signature2; | |
893 List<int> signature3; | |
894 { | |
895 serializeLibraryText(r''' | |
896 class A { | |
897 m() { | |
898 } | |
899 } | |
900 '''); | |
901 signature1 = unlinkedUnits[0].apiSignature; | |
902 } | |
903 { | |
904 serializeLibraryText(r''' | |
905 class A { | |
906 m() { | |
907 int v1; | |
908 f() { | |
909 double v2; | |
910 } | |
911 } | |
912 } | |
913 '''); | |
914 signature2 = unlinkedUnits[0].apiSignature; | |
915 } | |
916 { | |
917 serializeLibraryText(r''' | |
918 class A { | |
919 m(p) { | |
920 } | |
921 } | |
922 '''); | |
923 } | |
924 expect(signature2, signature1); | |
925 expect(signature3, isNot(signature1)); | |
926 } | |
927 | |
928 test_apiSignature_excludeBody_topLevelFunction() { | |
929 List<int> signature1; | |
930 List<int> signature2; | |
931 List<int> signature3; | |
932 { | |
933 serializeLibraryText('main() {}'); | |
934 signature1 = unlinkedUnits[0].apiSignature; | |
935 } | |
936 { | |
937 serializeLibraryText(r''' | |
938 main() { | |
939 int v1 = 1; | |
940 f() { | |
941 int v2 = 2; | |
942 } | |
943 } | |
944 '''); | |
945 signature2 = unlinkedUnits[0].apiSignature; | |
946 } | |
947 { | |
948 serializeLibraryText('main(p) {}'); | |
949 signature3 = unlinkedUnits[0].apiSignature; | |
950 } | |
951 expect(signature2, signature1); | |
952 expect(signature3, isNot(signature1)); | |
953 } | |
954 | |
852 test_bottom_reference_shared() { | 955 test_bottom_reference_shared() { |
853 if (skipFullyLinkedData) { | 956 if (skipFullyLinkedData) { |
854 return; | 957 return; |
855 } | 958 } |
856 // The synthetic executables for both `x` and `y` have type `() => `Bottom`. | 959 // The synthetic executables for both `x` and `y` have type `() => `Bottom`. |
857 // Verify that they both use the same reference to `Bottom`. | 960 // Verify that they both use the same reference to `Bottom`. |
858 serializeLibraryText('int x = null; int y = null;'); | 961 serializeLibraryText('int x = null; int y = null;'); |
859 EntityRef xInitializerReturnType = | 962 EntityRef xInitializerReturnType = |
860 getTypeRefForSlot(findVariable('x').initializer.inferredReturnTypeSlot); | 963 getTypeRefForSlot(findVariable('x').initializer.inferredReturnTypeSlot); |
861 EntityRef yInitializerReturnType = | 964 EntityRef yInitializerReturnType = |
(...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1346 String text = 'class C<T> {}'; | 1449 String text = 'class C<T> {}'; |
1347 UnlinkedClass cls = serializeClassText(text); | 1450 UnlinkedClass cls = serializeClassText(text); |
1348 expect(cls.typeParameters, hasLength(1)); | 1451 expect(cls.typeParameters, hasLength(1)); |
1349 expect(cls.typeParameters[0].name, 'T'); | 1452 expect(cls.typeParameters[0].name, 'T'); |
1350 expect(cls.typeParameters[0].nameOffset, text.indexOf('T')); | 1453 expect(cls.typeParameters[0].nameOffset, text.indexOf('T')); |
1351 expect(cls.typeParameters[0].bound, isNull); | 1454 expect(cls.typeParameters[0].bound, isNull); |
1352 expect(unlinkedUnits[0].publicNamespace.names[0].numTypeParameters, 1); | 1455 expect(unlinkedUnits[0].publicNamespace.names[0].numTypeParameters, 1); |
1353 } | 1456 } |
1354 | 1457 |
1355 test_closure_executable_with_bottom_return_type() { | 1458 test_closure_executable_with_bottom_return_type() { |
1356 UnlinkedExecutable executable = | 1459 UnlinkedVariable variable = serializeVariableText('var v = (() => null);'); |
1357 serializeExecutableText('f() { print((() => null)()); }'); | 1460 UnlinkedExecutable closure; |
1358 expect(executable.localFunctions, hasLength(1)); | 1461 { |
1359 expect(executable.localFunctions[0].returnType, isNull); | 1462 UnlinkedExecutable executable = variable.initializer; |
1463 // UnlinkedExecutable executable = | |
Paul Berry
2016/11/08 20:47:02
Remove commented out code.
| |
1464 // serializeExecutableText('f() { print((() => null)()); }'); | |
1465 expect(executable.localFunctions, hasLength(1)); | |
1466 expect(executable.localFunctions[0].returnType, isNull); | |
1467 closure = executable.localFunctions[0]; | |
1468 } | |
1360 if (strongMode) { | 1469 if (strongMode) { |
1361 // Strong mode infers a type for the closure of `() => dynamic`, so the | 1470 // Strong mode infers a type for the closure of `() => dynamic`, so the |
1362 // inferred return type slot should be empty. | 1471 // inferred return type slot should be empty. |
1363 expect( | 1472 expect(getTypeRefForSlot(closure.inferredReturnTypeSlot), isNull); |
1364 getTypeRefForSlot( | |
1365 executable.localFunctions[0].inferredReturnTypeSlot), | |
1366 isNull); | |
1367 } else { | 1473 } else { |
1368 // Spec mode infers a type for the closure of `() => Bottom`. | 1474 // Spec mode infers a type for the closure of `() => Bottom`. |
1369 checkInferredTypeSlot(executable.localFunctions[0].inferredReturnTypeSlot, | 1475 checkInferredTypeSlot( |
1370 null, null, '*bottom*', | 1476 closure.inferredReturnTypeSlot, null, null, '*bottom*', |
1371 onlyInStrongMode: false); | 1477 onlyInStrongMode: false); |
1372 } | 1478 } |
1373 } | 1479 } |
1374 | 1480 |
1375 test_closure_executable_with_imported_return_type() { | 1481 test_closure_executable_with_imported_return_type() { |
1376 addNamedSource('/a.dart', 'class C { D d; } class D {}'); | 1482 addNamedSource('/a.dart', 'class C { D d; } class D {}'); |
1377 // The closure has type `() => D`; `D` is defined in a library that is | 1483 // The closure has type `() => D`; `D` is defined in a library that is |
1378 // imported. | 1484 // imported. |
1379 UnlinkedExecutable executable = serializeExecutableText( | 1485 UnlinkedExecutable executable = serializeVariableText(r''' |
1380 'import "a.dart"; f() { print((() => new C().d)()); }'); | 1486 import "a.dart"; |
1487 var v = (() { | |
1488 print((() => new C().d)()); | |
1489 }); | |
1490 ''').initializer.localFunctions[0]; | |
1381 expect(executable.localFunctions, hasLength(1)); | 1491 expect(executable.localFunctions, hasLength(1)); |
1382 expect(executable.localFunctions[0].returnType, isNull); | 1492 expect(executable.localFunctions[0].returnType, isNull); |
1383 checkInferredTypeSlot(executable.localFunctions[0].inferredReturnTypeSlot, | 1493 checkInferredTypeSlot(executable.localFunctions[0].inferredReturnTypeSlot, |
1384 absUri('/a.dart'), 'a.dart', 'D', | 1494 absUri('/a.dart'), 'a.dart', 'D', |
1385 onlyInStrongMode: false); | 1495 onlyInStrongMode: false); |
1386 checkHasDependency('a.dart', fullyLinked: false); | 1496 checkHasDependency('a.dart', fullyLinked: false); |
1387 } | 1497 } |
1388 | 1498 |
1389 test_closure_executable_with_return_type_from_closure() { | 1499 test_closure_executable_with_return_type_from_closure() { |
1390 if (skipFullyLinkedData) { | 1500 if (skipFullyLinkedData) { |
(...skipping 22 matching lines...) Expand all Loading... | |
1413 expectedKind: ReferenceKind.topLevelFunction); | 1523 expectedKind: ReferenceKind.topLevelFunction); |
1414 expect( | 1524 expect( |
1415 definingUnit.references[topLevelFunctionIndex].containingReference, 0); | 1525 definingUnit.references[topLevelFunctionIndex].containingReference, 0); |
1416 } | 1526 } |
1417 | 1527 |
1418 test_closure_executable_with_unimported_return_type() { | 1528 test_closure_executable_with_unimported_return_type() { |
1419 addNamedSource('/a.dart', 'import "b.dart"; class C { D d; }'); | 1529 addNamedSource('/a.dart', 'import "b.dart"; class C { D d; }'); |
1420 addNamedSource('/b.dart', 'class D {}'); | 1530 addNamedSource('/b.dart', 'class D {}'); |
1421 // The closure has type `() => D`; `D` is defined in a library that is not | 1531 // The closure has type `() => D`; `D` is defined in a library that is not |
1422 // imported. | 1532 // imported. |
1423 UnlinkedExecutable executable = serializeExecutableText( | 1533 UnlinkedExecutable executable = serializeVariableText(r''' |
1424 'import "a.dart"; f() { print((() => new C().d)()); }'); | 1534 import "a.dart"; |
1535 var v = (() { | |
1536 print((() => new C().d)()); | |
1537 }); | |
1538 ''').initializer.localFunctions[0]; | |
1425 expect(executable.localFunctions, hasLength(1)); | 1539 expect(executable.localFunctions, hasLength(1)); |
1426 expect(executable.localFunctions[0].returnType, isNull); | 1540 expect(executable.localFunctions[0].returnType, isNull); |
1427 checkInferredTypeSlot(executable.localFunctions[0].inferredReturnTypeSlot, | 1541 checkInferredTypeSlot(executable.localFunctions[0].inferredReturnTypeSlot, |
1428 absUri('/b.dart'), 'b.dart', 'D', | 1542 absUri('/b.dart'), 'b.dart', 'D', |
1429 onlyInStrongMode: false); | 1543 onlyInStrongMode: false); |
1430 if (!skipFullyLinkedData) { | 1544 if (!skipFullyLinkedData) { |
1431 checkHasDependency('b.dart', fullyLinked: true); | 1545 checkHasDependency('b.dart', fullyLinked: true); |
1432 } | 1546 } |
1433 } | 1547 } |
1434 | 1548 |
(...skipping 3604 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5039 } | 5153 } |
5040 | 5154 |
5041 test_executable_getter_type_implicit() { | 5155 test_executable_getter_type_implicit() { |
5042 UnlinkedExecutable executable = serializeExecutableText('get f => 1;'); | 5156 UnlinkedExecutable executable = serializeExecutableText('get f => 1;'); |
5043 expect(executable.returnType, isNull); | 5157 expect(executable.returnType, isNull); |
5044 expect(executable.parameters, isEmpty); | 5158 expect(executable.parameters, isEmpty); |
5045 } | 5159 } |
5046 | 5160 |
5047 test_executable_localFunctions() { | 5161 test_executable_localFunctions() { |
5048 String code = r''' | 5162 String code = r''' |
5049 f() { // 1 | 5163 f() { |
5050 f1() {} | 5164 f1() {} |
5051 { // 2 | 5165 { |
5052 f2() {} | 5166 f2() {} |
5053 } // 3 | 5167 } |
5054 } // 4 | 5168 } |
5055 '''; | 5169 '''; |
5056 UnlinkedExecutable executable = serializeExecutableText(code); | 5170 UnlinkedExecutable executable = serializeExecutableText(code); |
5057 List<UnlinkedExecutable> functions = executable.localFunctions; | 5171 List<UnlinkedExecutable> functions = executable.localFunctions; |
5058 expect(functions, hasLength(2)); | 5172 expect(functions, isEmpty); |
5059 { | |
5060 UnlinkedExecutable f1 = functions.singleWhere((v) => v.name == 'f1'); | |
5061 _assertExecutableVisible(code, f1, '{ // 1', '} // 4'); | |
5062 } | |
5063 { | |
5064 UnlinkedExecutable f2 = functions.singleWhere((v) => v.name == 'f2'); | |
5065 _assertExecutableVisible(code, f2, '{ // 2', '} // 3'); | |
5066 } | |
5067 } | 5173 } |
5068 | 5174 |
5069 test_executable_localLabels_inMethod() { | 5175 test_executable_localLabels_inMethod() { |
5070 String code = r''' | 5176 String code = r''' |
5071 class C { | 5177 class C { |
5072 m() { | 5178 m() { |
5073 aaa: while (true) {} | 5179 aaa: while (true) {} |
5074 bbb: while (true) {} | 5180 bbb: while (true) {} |
5075 } | 5181 } |
5076 } | 5182 } |
5077 '''; | 5183 '''; |
5078 UnlinkedExecutable executable = | 5184 UnlinkedExecutable executable = |
5079 findExecutable('m', executables: serializeClassText(code).executables); | 5185 findExecutable('m', executables: serializeClassText(code).executables); |
5080 List<UnlinkedLabel> labels = executable.localLabels; | 5186 List<UnlinkedLabel> labels = executable.localLabels; |
5081 expect(labels, hasLength(2)); | 5187 expect(labels, isEmpty); |
5082 { | |
5083 UnlinkedLabel aaa = labels.singleWhere((l) => l.name == 'aaa'); | |
5084 expect(aaa, isNotNull); | |
5085 expect(aaa.isOnSwitchMember, isFalse); | |
5086 expect(aaa.isOnSwitchStatement, isFalse); | |
5087 } | |
5088 { | |
5089 UnlinkedLabel bbb = labels.singleWhere((l) => l.name == 'bbb'); | |
5090 expect(bbb, isNotNull); | |
5091 expect(bbb.isOnSwitchMember, isFalse); | |
5092 expect(bbb.isOnSwitchStatement, isFalse); | |
5093 } | |
5094 } | 5188 } |
5095 | 5189 |
5096 test_executable_localLabels_inTopLevelFunction() { | 5190 test_executable_localLabels_inTopLevelFunction() { |
5097 String code = r''' | 5191 String code = r''' |
5098 f() { | 5192 f() { |
5099 aaa: while (true) {} | 5193 aaa: while (true) {} |
5100 bbb: switch (42) { | 5194 bbb: switch (42) { |
5101 ccc: case 0: | 5195 ccc: case 0: |
5102 break; | 5196 break; |
5103 ddd: default: | 5197 ddd: default: |
5104 break; | 5198 break; |
5105 } | 5199 } |
5106 } | 5200 } |
5107 '''; | 5201 '''; |
5108 UnlinkedExecutable executable = serializeExecutableText(code); | 5202 UnlinkedExecutable executable = serializeExecutableText(code); |
5109 List<UnlinkedLabel> labels = executable.localLabels; | 5203 List<UnlinkedLabel> labels = executable.localLabels; |
5110 expect(labels, hasLength(4)); | 5204 expect(labels, isEmpty); |
5111 { | |
5112 UnlinkedLabel aaa = labels.singleWhere((l) => l.name == 'aaa'); | |
5113 expect(aaa, isNotNull); | |
5114 expect(aaa.isOnSwitchMember, isFalse); | |
5115 expect(aaa.isOnSwitchStatement, isFalse); | |
5116 } | |
5117 { | |
5118 UnlinkedLabel bbb = labels.singleWhere((l) => l.name == 'bbb'); | |
5119 expect(bbb, isNotNull); | |
5120 expect(bbb.isOnSwitchMember, isFalse); | |
5121 expect(bbb.isOnSwitchStatement, isTrue); | |
5122 } | |
5123 { | |
5124 UnlinkedLabel ccc = labels.singleWhere((l) => l.name == 'ccc'); | |
5125 expect(ccc, isNotNull); | |
5126 expect(ccc.isOnSwitchMember, isTrue); | |
5127 expect(ccc.isOnSwitchStatement, isFalse); | |
5128 } | |
5129 { | |
5130 UnlinkedLabel ccc = labels.singleWhere((l) => l.name == 'ddd'); | |
5131 expect(ccc, isNotNull); | |
5132 expect(ccc.isOnSwitchMember, isTrue); | |
5133 expect(ccc.isOnSwitchStatement, isFalse); | |
5134 } | |
5135 } | 5205 } |
5136 | 5206 |
5137 test_executable_localLabels_inTopLevelGetter() { | 5207 test_executable_localLabels_inTopLevelGetter() { |
5138 String code = r''' | 5208 String code = r''' |
5139 get g { | 5209 get g { |
5140 aaa: while (true) {} | 5210 aaa: while (true) {} |
5141 bbb: while (true) {} | 5211 bbb: while (true) {} |
5142 } | 5212 } |
5143 '''; | 5213 '''; |
5144 UnlinkedExecutable executable = | 5214 UnlinkedExecutable executable = |
5145 serializeExecutableText(code, executableName: 'g'); | 5215 serializeExecutableText(code, executableName: 'g'); |
5146 List<UnlinkedLabel> labels = executable.localLabels; | 5216 List<UnlinkedLabel> labels = executable.localLabels; |
5147 expect(labels, hasLength(2)); | 5217 expect(labels, isEmpty); |
5148 { | |
5149 UnlinkedLabel aaa = labels.singleWhere((l) => l.name == 'aaa'); | |
5150 expect(aaa, isNotNull); | |
5151 expect(aaa.isOnSwitchMember, isFalse); | |
5152 expect(aaa.isOnSwitchStatement, isFalse); | |
5153 } | |
5154 { | |
5155 UnlinkedLabel bbb = labels.singleWhere((l) => l.name == 'bbb'); | |
5156 expect(bbb, isNotNull); | |
5157 expect(bbb.isOnSwitchMember, isFalse); | |
5158 expect(bbb.isOnSwitchStatement, isFalse); | |
5159 } | |
5160 } | 5218 } |
5161 | 5219 |
5162 test_executable_localLabels_namedExpressionLabel() { | 5220 test_executable_localLabels_namedExpressionLabel() { |
5163 String code = r''' | 5221 String code = r''' |
5164 f() { | 5222 f() { |
5165 foo(p: 42); | 5223 foo(p: 42); |
5166 } | 5224 } |
5167 foo({int p}) {} | 5225 foo({int p}) {} |
5168 '''; | 5226 '''; |
5169 UnlinkedExecutable executable = serializeExecutableText(code); | 5227 UnlinkedExecutable executable = serializeExecutableText(code); |
5170 List<UnlinkedLabel> labels = executable.localLabels; | 5228 List<UnlinkedLabel> labels = executable.localLabels; |
5171 expect(labels, isEmpty); | 5229 expect(labels, isEmpty); |
5172 } | 5230 } |
5173 | 5231 |
5174 test_executable_localVariables_catch() { | 5232 test_executable_localVariables_catch() { |
5175 String code = r''' | 5233 String code = r''' |
5176 f() { // 1 | 5234 var v = ( |
5177 try { | 5235 () { // 1 |
5178 throw 42; | 5236 try { |
5179 } on int catch (e, st) { // 2 | 5237 throw 42; |
5180 print(e); | 5238 } on int catch (e, st) { // 2 |
5181 print(st); | 5239 print(e); |
5182 } // 3 | 5240 print(st); |
5183 } // 4 | 5241 } // 3 |
5242 } // 4 | |
5243 ); | |
5184 '''; | 5244 '''; |
5185 UnlinkedExecutable executable = serializeExecutableText(code); | 5245 UnlinkedExecutable executable = |
5246 serializeVariableText(code).initializer.localFunctions[0]; | |
5186 List<UnlinkedVariable> variables = executable.localVariables; | 5247 List<UnlinkedVariable> variables = executable.localVariables; |
5187 expect(variables, hasLength(2)); | 5248 expect(variables, hasLength(2)); |
5188 { | 5249 { |
5189 UnlinkedVariable e = variables.singleWhere((v) => v.name == 'e'); | 5250 UnlinkedVariable e = variables.singleWhere((v) => v.name == 'e'); |
5190 _assertVariableVisible(code, e, 'on int catch (', '} // 3'); | 5251 _assertVariableVisible(code, e, 'on int catch (', '} // 3'); |
5191 checkTypeRef(e.type, 'dart:core', 'dart:core', 'int'); | 5252 checkTypeRef(e.type, 'dart:core', 'dart:core', 'int'); |
5192 } | 5253 } |
5193 { | 5254 { |
5194 UnlinkedVariable st = variables.singleWhere((v) => v.name == 'st'); | 5255 UnlinkedVariable st = variables.singleWhere((v) => v.name == 'st'); |
5195 _assertVariableVisible(code, st, 'on int catch (', '} // 3'); | 5256 _assertVariableVisible(code, st, 'on int catch (', '} // 3'); |
(...skipping 16 matching lines...) Expand all Loading... | |
5212 test_executable_localVariables_empty() { | 5273 test_executable_localVariables_empty() { |
5213 UnlinkedExecutable executable = serializeExecutableText(r''' | 5274 UnlinkedExecutable executable = serializeExecutableText(r''' |
5214 f() { | 5275 f() { |
5215 } | 5276 } |
5216 '''); | 5277 '''); |
5217 expect(executable.localVariables, isEmpty); | 5278 expect(executable.localVariables, isEmpty); |
5218 } | 5279 } |
5219 | 5280 |
5220 test_executable_localVariables_forEachLoop() { | 5281 test_executable_localVariables_forEachLoop() { |
5221 String code = r''' | 5282 String code = r''' |
5222 f() { // 1 | 5283 var v = (() { |
5223 for (int i in <int>[]) { // 2 | 5284 f() { // 1 |
5224 print(i); | 5285 for (int i in <int>[]) { // 2 |
5225 } // 3 | 5286 print(i); |
5226 } // 4 | 5287 } // 3 |
5288 } // 4 | |
5289 }); | |
5227 '''; | 5290 '''; |
5228 UnlinkedExecutable executable = serializeExecutableText(code); | 5291 UnlinkedExecutable executable = serializeVariableText(code) |
5292 .initializer | |
5293 .localFunctions[0] | |
5294 .localFunctions[0]; | |
5229 List<UnlinkedVariable> variables = executable.localVariables; | 5295 List<UnlinkedVariable> variables = executable.localVariables; |
5230 expect(variables, hasLength(1)); | 5296 expect(variables, hasLength(1)); |
5231 { | 5297 { |
5232 UnlinkedVariable i = variables.singleWhere((v) => v.name == 'i'); | 5298 UnlinkedVariable i = variables.singleWhere((v) => v.name == 'i'); |
5233 _assertVariableVisible(code, i, 'for', '} // 3'); | 5299 _assertVariableVisible(code, i, 'for', '} // 3'); |
5234 checkTypeRef(i.type, 'dart:core', 'dart:core', 'int'); | 5300 checkTypeRef(i.type, 'dart:core', 'dart:core', 'int'); |
5235 } | 5301 } |
5236 } | 5302 } |
5237 | 5303 |
5238 test_executable_localVariables_forEachLoop_outside() { | 5304 test_executable_localVariables_forEachLoop_outside() { |
5239 String code = r''' | 5305 String code = r''' |
5240 f() { // 1 | 5306 var v = (() { |
5241 int i; | 5307 f() { // 1 |
5242 for (i in <int>[]) { | 5308 int i; |
5243 print(i); | 5309 for (i in <int>[]) { |
5244 } | 5310 print(i); |
5245 } // 4 | 5311 } |
5312 } // 4 | |
5313 }); | |
5246 '''; | 5314 '''; |
5247 UnlinkedExecutable executable = serializeExecutableText(code); | 5315 UnlinkedExecutable executable = serializeVariableText(code) |
5316 .initializer | |
5317 .localFunctions[0] | |
5318 .localFunctions[0]; | |
5248 List<UnlinkedVariable> variables = executable.localVariables; | 5319 List<UnlinkedVariable> variables = executable.localVariables; |
5249 expect(variables, hasLength(1)); | 5320 expect(variables, hasLength(1)); |
5250 { | 5321 { |
5251 UnlinkedVariable i = variables.singleWhere((v) => v.name == 'i'); | 5322 UnlinkedVariable i = variables.singleWhere((v) => v.name == 'i'); |
5252 _assertVariableVisible(code, i, '{ // 1', '} // 4'); | 5323 _assertVariableVisible(code, i, '{ // 1', '} // 4'); |
5253 checkTypeRef(i.type, 'dart:core', 'dart:core', 'int'); | 5324 checkTypeRef(i.type, 'dart:core', 'dart:core', 'int'); |
5254 } | 5325 } |
5255 } | 5326 } |
5256 | 5327 |
5257 test_executable_localVariables_forLoop() { | 5328 test_executable_localVariables_forLoop() { |
5258 String code = r''' | 5329 String code = r''' |
5259 f() { // 1 | 5330 var v = (() { |
5260 for (int i = 0, j = 0; i < 10; i++, j++) { // 2 | 5331 f() { // 1 |
5261 print(i); | 5332 for (int i = 0, j = 0; i < 10; i++, j++) { // 2 |
5262 } // 3 | 5333 print(i); |
5263 } // 4 | 5334 } // 3 |
5335 } // 4 | |
5336 }); | |
5264 '''; | 5337 '''; |
5265 UnlinkedExecutable executable = serializeExecutableText(code); | 5338 UnlinkedExecutable executable = serializeVariableText(code) |
5339 .initializer | |
5340 .localFunctions[0] | |
5341 .localFunctions[0]; | |
5266 List<UnlinkedVariable> variables = executable.localVariables; | 5342 List<UnlinkedVariable> variables = executable.localVariables; |
5267 expect(variables, hasLength(2)); | 5343 expect(variables, hasLength(2)); |
5268 { | 5344 { |
5269 UnlinkedVariable i = variables.singleWhere((v) => v.name == 'i'); | 5345 UnlinkedVariable i = variables.singleWhere((v) => v.name == 'i'); |
5270 _assertVariableVisible(code, i, 'for', '} // 3'); | 5346 _assertVariableVisible(code, i, 'for', '} // 3'); |
5271 checkTypeRef(i.type, 'dart:core', 'dart:core', 'int'); | 5347 checkTypeRef(i.type, 'dart:core', 'dart:core', 'int'); |
5272 } | 5348 } |
5273 { | 5349 { |
5274 UnlinkedVariable i = variables.singleWhere((v) => v.name == 'j'); | 5350 UnlinkedVariable i = variables.singleWhere((v) => v.name == 'j'); |
5275 _assertVariableVisible(code, i, 'for', '} // 3'); | 5351 _assertVariableVisible(code, i, 'for', '} // 3'); |
5276 checkTypeRef(i.type, 'dart:core', 'dart:core', 'int'); | 5352 checkTypeRef(i.type, 'dart:core', 'dart:core', 'int'); |
5277 } | 5353 } |
5278 } | 5354 } |
5279 | 5355 |
5280 test_executable_localVariables_forLoop_noVariables() { | 5356 test_executable_localVariables_forLoop_noVariables() { |
5281 String code = r''' | 5357 String code = r''' |
5282 f() { | 5358 var v = (() { |
5283 for (; true;) {} | 5359 f() { |
5284 } | 5360 for (; true;) {} |
5361 } | |
5362 }); | |
5285 '''; | 5363 '''; |
5286 UnlinkedExecutable executable = serializeExecutableText(code); | 5364 UnlinkedExecutable executable = serializeVariableText(code) |
5365 .initializer | |
5366 .localFunctions[0] | |
5367 .localFunctions[0]; | |
5287 List<UnlinkedVariable> variables = executable.localVariables; | 5368 List<UnlinkedVariable> variables = executable.localVariables; |
5288 expect(variables, isEmpty); | 5369 expect(variables, isEmpty); |
5289 } | 5370 } |
5290 | 5371 |
5291 test_executable_localVariables_inConstructor() { | 5372 test_executable_localVariables_inConstructor() { |
5292 String code = r''' | 5373 String code = r''' |
5293 class C { | 5374 class C { |
5294 C() { // 1 | 5375 C() { |
5295 int v; | 5376 int v; |
5296 } // 2 | 5377 } |
5297 } | 5378 } |
5298 '''; | 5379 '''; |
5299 UnlinkedExecutable executable = | 5380 UnlinkedExecutable executable = |
5300 findExecutable('', executables: serializeClassText(code).executables); | 5381 findExecutable('', executables: serializeClassText(code).executables); |
5301 List<UnlinkedVariable> variables = executable.localVariables; | 5382 List<UnlinkedVariable> variables = executable.localVariables; |
5302 expect(variables, hasLength(1)); | 5383 expect(variables, isEmpty); |
5303 { | |
5304 UnlinkedVariable v = variables.singleWhere((v) => v.name == 'v'); | |
5305 _assertVariableVisible(code, v, '{ // 1', '} // 2'); | |
5306 checkTypeRef(v.type, 'dart:core', 'dart:core', 'int'); | |
5307 } | |
5308 } | 5384 } |
5309 | 5385 |
5310 test_executable_localVariables_inLocalFunctions() { | 5386 test_executable_localVariables_inLocalFunctions() { |
5311 String code = r''' | 5387 String code = r''' |
5312 f() { | 5388 var v = (() { |
5313 f1() { // 1 | 5389 f() { |
5314 int v1 = 1; | 5390 f1() { // 1 |
5315 } // 2 | 5391 int v1 = 1; |
5316 f2() { // 3 | 5392 } // 2 |
5317 int v1 = 1; | 5393 f2() { // 3 |
5318 f3() { // 4 | 5394 int v1 = 1; |
5319 int v2 = 1; | 5395 f3() { // 4 |
5320 } // 5 | 5396 int v2 = 1; |
5321 } // 6 | 5397 } // 5 |
5322 } // 7 | 5398 } // 6 |
5399 } // 7 | |
5400 }); | |
5323 '''; | 5401 '''; |
5324 UnlinkedExecutable executable = serializeExecutableText(code); | 5402 UnlinkedExecutable executable = serializeVariableText(code) |
5403 .initializer | |
5404 .localFunctions[0] | |
5405 .localFunctions[0]; | |
5325 List<UnlinkedExecutable> functions = executable.localFunctions; | 5406 List<UnlinkedExecutable> functions = executable.localFunctions; |
5326 expect(functions, hasLength(2)); | 5407 expect(functions, hasLength(2)); |
5327 // f - f1 | 5408 // f - f1 |
5328 { | 5409 { |
5329 UnlinkedExecutable f1 = functions.singleWhere((v) => v.name == 'f1'); | 5410 UnlinkedExecutable f1 = functions.singleWhere((v) => v.name == 'f1'); |
5330 List<UnlinkedVariable> variables = f1.localVariables; | 5411 List<UnlinkedVariable> variables = f1.localVariables; |
5331 expect(variables, hasLength(1)); | 5412 expect(variables, hasLength(1)); |
5332 // f1 - v1 | 5413 // f1 - v1 |
5333 UnlinkedVariable v1 = variables.singleWhere((v) => v.name == 'v1'); | 5414 UnlinkedVariable v1 = variables.singleWhere((v) => v.name == 'v1'); |
5334 _assertVariableVisible(code, v1, '{ // 1', '} // 2'); | 5415 _assertVariableVisible(code, v1, '{ // 1', '} // 2'); |
(...skipping 20 matching lines...) Expand all Loading... | |
5355 // f - f3 - v2 | 5436 // f - f3 - v2 |
5356 UnlinkedVariable v2 = variables3.singleWhere((v) => v.name == 'v2'); | 5437 UnlinkedVariable v2 = variables3.singleWhere((v) => v.name == 'v2'); |
5357 _assertVariableVisible(code, v2, '{ // 4', '} // 5'); | 5438 _assertVariableVisible(code, v2, '{ // 4', '} // 5'); |
5358 checkTypeRef(v2.type, 'dart:core', 'dart:core', 'int'); | 5439 checkTypeRef(v2.type, 'dart:core', 'dart:core', 'int'); |
5359 } | 5440 } |
5360 } | 5441 } |
5361 | 5442 |
5362 test_executable_localVariables_inMethod() { | 5443 test_executable_localVariables_inMethod() { |
5363 String code = r''' | 5444 String code = r''' |
5364 class C { | 5445 class C { |
5365 m() { // 1 | 5446 m() { |
5366 int v; | 5447 int v; |
5367 f() {} | 5448 f() {} |
5368 } // 2 | 5449 } |
5369 } | 5450 } |
5370 '''; | 5451 '''; |
5371 UnlinkedExecutable executable = | 5452 UnlinkedExecutable executable = |
5372 findExecutable('m', executables: serializeClassText(code).executables); | 5453 findExecutable('m', executables: serializeClassText(code).executables); |
5373 { | 5454 expect(executable.localFunctions, isEmpty); |
5374 List<UnlinkedExecutable> functions = executable.localFunctions; | 5455 expect(executable.localVariables, isEmpty); |
5375 expect(functions, hasLength(1)); | |
5376 UnlinkedExecutable f = functions.singleWhere((v) => v.name == 'f'); | |
5377 _assertExecutableVisible(code, f, '{ // 1', '} // 2'); | |
5378 } | |
5379 { | |
5380 List<UnlinkedVariable> variables = executable.localVariables; | |
5381 expect(variables, hasLength(1)); | |
5382 UnlinkedVariable v = variables.singleWhere((v) => v.name == 'v'); | |
5383 _assertVariableVisible(code, v, '{ // 1', '} // 2'); | |
5384 checkTypeRef(v.type, 'dart:core', 'dart:core', 'int'); | |
5385 } | |
5386 } | 5456 } |
5387 | 5457 |
5388 test_executable_localVariables_inTopLevelFunction() { | 5458 test_executable_localVariables_inTopLevelFunction() { |
5389 String code = r''' | 5459 String code = r''' |
5390 f() { // 1 | 5460 f() { |
5391 int v1 = 1; | 5461 int v1 = 1; |
5392 { // 2 | 5462 { |
5393 int v2 = 2; | 5463 int v2 = 2; |
5394 } // 3 | 5464 } |
5395 var v3 = 3; | 5465 var v3 = 3; |
5396 } // 4 | 5466 } |
5397 '''; | 5467 '''; |
5398 UnlinkedExecutable executable = serializeExecutableText(code); | 5468 UnlinkedExecutable executable = serializeExecutableText(code); |
5399 List<UnlinkedVariable> variables = executable.localVariables; | 5469 List<UnlinkedVariable> variables = executable.localVariables; |
5400 expect(variables, hasLength(3)); | 5470 expect(variables, isEmpty); |
5401 { | |
5402 UnlinkedVariable v1 = variables.singleWhere((v) => v.name == 'v1'); | |
5403 _assertVariableVisible(code, v1, '{ // 1', '} // 4'); | |
5404 checkTypeRef(v1.type, 'dart:core', 'dart:core', 'int'); | |
5405 } | |
5406 { | |
5407 UnlinkedVariable v2 = variables.singleWhere((v) => v.name == 'v2'); | |
5408 _assertVariableVisible(code, v2, '{ // 2', '} // 3'); | |
5409 checkTypeRef(v2.type, 'dart:core', 'dart:core', 'int'); | |
5410 } | |
5411 { | |
5412 UnlinkedVariable v3 = variables.singleWhere((v) => v.name == 'v3'); | |
5413 _assertVariableVisible(code, v3, '{ // 1', '} // 4'); | |
5414 expect(v3.type, isNull); | |
5415 } | |
5416 } | 5471 } |
5417 | 5472 |
5418 test_executable_localVariables_inTopLevelGetter() { | 5473 test_executable_localVariables_inTopLevelGetter() { |
5419 String code = r''' | 5474 String code = r''' |
5420 get g { // 1 | 5475 get g { // 1 |
5421 int v; | 5476 int v; |
5422 f() {} | 5477 f() {} |
5423 } // 2 | 5478 } // 2 |
5424 '''; | 5479 '''; |
5425 UnlinkedExecutable executable = | 5480 UnlinkedExecutable executable = |
5426 serializeExecutableText(code, executableName: 'g'); | 5481 serializeExecutableText(code, executableName: 'g'); |
5427 { | 5482 expect(executable.localFunctions, isEmpty); |
5428 List<UnlinkedExecutable> functions = executable.localFunctions; | 5483 expect(executable.localVariables, isEmpty); |
5429 expect(functions, hasLength(1)); | |
5430 UnlinkedExecutable f = functions.singleWhere((v) => v.name == 'f'); | |
5431 _assertExecutableVisible(code, f, '{ // 1', '} // 2'); | |
5432 } | |
5433 { | |
5434 List<UnlinkedVariable> variables = executable.localVariables; | |
5435 expect(variables, hasLength(1)); | |
5436 UnlinkedVariable v = variables.singleWhere((v) => v.name == 'v'); | |
5437 _assertVariableVisible(code, v, '{ // 1', '} // 2'); | |
5438 checkTypeRef(v.type, 'dart:core', 'dart:core', 'int'); | |
5439 } | |
5440 } | 5484 } |
5441 | 5485 |
5442 test_executable_member_function() { | 5486 test_executable_member_function() { |
5443 UnlinkedExecutable executable = findExecutable('f', | 5487 UnlinkedExecutable executable = findExecutable('f', |
5444 executables: serializeClassText('class C { f() {} }').executables); | 5488 executables: serializeClassText('class C { f() {} }').executables); |
5445 expect(executable.kind, UnlinkedExecutableKind.functionOrMethod); | 5489 expect(executable.kind, UnlinkedExecutableKind.functionOrMethod); |
5446 expect(executable.returnType, isNull); | 5490 expect(executable.returnType, isNull); |
5447 expect(executable.isAsynchronous, isFalse); | 5491 expect(executable.isAsynchronous, isFalse); |
5448 expect(executable.isExternal, isFalse); | 5492 expect(executable.isExternal, isFalse); |
5449 expect(executable.isGenerator, isFalse); | 5493 expect(executable.isGenerator, isFalse); |
(...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5818 UnlinkedExecutable executable = serializeExecutableText('f() {}'); | 5862 UnlinkedExecutable executable = serializeExecutableText('f() {}'); |
5819 expect(executable.parameters, isEmpty); | 5863 expect(executable.parameters, isEmpty); |
5820 } | 5864 } |
5821 | 5865 |
5822 test_executable_param_of_constructor_no_covariance() { | 5866 test_executable_param_of_constructor_no_covariance() { |
5823 UnlinkedExecutable executable = | 5867 UnlinkedExecutable executable = |
5824 serializeClassText('class C { C(x); }').executables[0]; | 5868 serializeClassText('class C { C(x); }').executables[0]; |
5825 expect(executable.parameters[0].inheritsCovariantSlot, 0); | 5869 expect(executable.parameters[0].inheritsCovariantSlot, 0); |
5826 } | 5870 } |
5827 | 5871 |
5828 test_executable_param_of_local_function_no_covariance() { | |
5829 UnlinkedExecutable executable = | |
5830 serializeClassText('class C { m() { f(x) {} } }') | |
5831 .executables[0] | |
5832 .localFunctions[0]; | |
5833 expect(executable.parameters[0].inheritsCovariantSlot, 0); | |
5834 } | |
5835 | |
5836 test_executable_param_of_method_covariance() { | 5872 test_executable_param_of_method_covariance() { |
5837 UnlinkedExecutable executable = | 5873 UnlinkedExecutable executable = |
5838 serializeClassText('class C { m(x) {} }').executables[0]; | 5874 serializeClassText('class C { m(x) {} }').executables[0]; |
5839 expect(executable.parameters[0].inheritsCovariantSlot, isNot(0)); | 5875 expect(executable.parameters[0].inheritsCovariantSlot, isNot(0)); |
5840 } | 5876 } |
5841 | 5877 |
5842 test_executable_param_of_param_no_covariance() { | 5878 test_executable_param_of_param_no_covariance() { |
5843 UnlinkedExecutable executable = | 5879 UnlinkedExecutable executable = |
5844 serializeClassText('class C { m(f(x)) {} }').executables[0]; | 5880 serializeClassText('class C { m(f(x)) {} }').executables[0]; |
5845 expect(executable.parameters[0].parameters[0].inheritsCovariantSlot, 0); | 5881 expect(executable.parameters[0].parameters[0].inheritsCovariantSlot, 0); |
(...skipping 1920 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7766 test_function_inferred_type_implicit_param() { | 7802 test_function_inferred_type_implicit_param() { |
7767 UnlinkedExecutable f = serializeExecutableText('void f(value) {}'); | 7803 UnlinkedExecutable f = serializeExecutableText('void f(value) {}'); |
7768 expect(f.parameters[0].inferredTypeSlot, 0); | 7804 expect(f.parameters[0].inferredTypeSlot, 0); |
7769 } | 7805 } |
7770 | 7806 |
7771 test_function_inferred_type_implicit_return() { | 7807 test_function_inferred_type_implicit_return() { |
7772 UnlinkedExecutable f = serializeExecutableText('f() => null;'); | 7808 UnlinkedExecutable f = serializeExecutableText('f() => null;'); |
7773 expect(f.inferredReturnTypeSlot, 0); | 7809 expect(f.inferredReturnTypeSlot, 0); |
7774 } | 7810 } |
7775 | 7811 |
7776 test_generic_gClass_gMethodStatic() { | |
7777 UnlinkedClass cls = serializeClassText(''' | |
7778 class C<T, U> { | |
7779 static void m<V, W>(V v, W w) { | |
7780 void f<X, Y>(V v, W w, X x, Y y) { | |
7781 } | |
7782 } | |
7783 } | |
7784 '''); | |
7785 UnlinkedExecutable m = cls.executables[0]; | |
7786 UnlinkedExecutable f = m.localFunctions[0]; | |
7787 checkParamTypeRef(m.parameters[0].type, 2); | |
7788 checkParamTypeRef(m.parameters[1].type, 1); | |
7789 checkParamTypeRef(f.parameters[0].type, 4); | |
7790 checkParamTypeRef(f.parameters[1].type, 3); | |
7791 checkParamTypeRef(f.parameters[2].type, 2); | |
7792 checkParamTypeRef(f.parameters[3].type, 1); | |
7793 } | |
7794 | |
7795 test_generic_method_in_generic_class() { | 7812 test_generic_method_in_generic_class() { |
7796 UnlinkedClass cls = serializeClassText( | 7813 UnlinkedClass cls = serializeClassText( |
7797 'class C<T, U> { void m<V, W>(T t, U u, V v, W w) {} }'); | 7814 'class C<T, U> { void m<V, W>(T t, U u, V v, W w) {} }'); |
7798 List<UnlinkedParam> params = cls.executables[0].parameters; | 7815 List<UnlinkedParam> params = cls.executables[0].parameters; |
7799 checkParamTypeRef(params[0].type, 4); | 7816 checkParamTypeRef(params[0].type, 4); |
7800 checkParamTypeRef(params[1].type, 3); | 7817 checkParamTypeRef(params[1].type, 3); |
7801 checkParamTypeRef(params[2].type, 2); | 7818 checkParamTypeRef(params[2].type, 2); |
7802 checkParamTypeRef(params[3].type, 1); | 7819 checkParamTypeRef(params[3].type, 1); |
7803 } | 7820 } |
7804 | 7821 |
(...skipping 1341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
9146 test_method_inferred_type_static_implicit_return() { | 9163 test_method_inferred_type_static_implicit_return() { |
9147 UnlinkedExecutable f = serializeClassText( | 9164 UnlinkedExecutable f = serializeClassText( |
9148 'class C extends D { static f() => null; }' | 9165 'class C extends D { static f() => null; }' |
9149 ' class D { static int f() => null; }', | 9166 ' class D { static int f() => null; }', |
9150 className: 'C') | 9167 className: 'C') |
9151 .executables[0]; | 9168 .executables[0]; |
9152 expect(f.inferredReturnTypeSlot, 0); | 9169 expect(f.inferredReturnTypeSlot, 0); |
9153 } | 9170 } |
9154 | 9171 |
9155 test_nested_generic_functions() { | 9172 test_nested_generic_functions() { |
9156 UnlinkedExecutable executable = serializeExecutableText(''' | 9173 UnlinkedExecutable executable = serializeVariableText(''' |
9157 void f<T, U>() { | 9174 var v = (() { |
9158 void g<V, W>() { | 9175 void f<T, U>() { |
9159 void h<X, Y>() { | 9176 void g<V, W>() { |
9160 T t; | 9177 void h<X, Y>() { |
9161 U u; | 9178 T t; |
9162 V v; | 9179 U u; |
9163 W w; | 9180 V v; |
9164 X x; | 9181 W w; |
9165 Y y; | 9182 X x; |
9183 Y y; | |
9184 } | |
9166 } | 9185 } |
9167 } | 9186 } |
9168 } | 9187 }); |
9169 '''); | 9188 ''').initializer.localFunctions[0].localFunctions[0]; |
9170 expect(executable.typeParameters, hasLength(2)); | 9189 expect(executable.typeParameters, hasLength(2)); |
9171 expect(executable.localFunctions[0].typeParameters, hasLength(2)); | 9190 expect(executable.localFunctions[0].typeParameters, hasLength(2)); |
9172 expect(executable.localFunctions[0].localFunctions[0].typeParameters, | 9191 expect(executable.localFunctions[0].localFunctions[0].typeParameters, |
9173 hasLength(2)); | 9192 hasLength(2)); |
9174 List<UnlinkedVariable> localVariables = | 9193 List<UnlinkedVariable> localVariables = |
9175 executable.localFunctions[0].localFunctions[0].localVariables; | 9194 executable.localFunctions[0].localFunctions[0].localVariables; |
9176 checkParamTypeRef(findVariable('t', variables: localVariables).type, 6); | 9195 checkParamTypeRef(findVariable('t', variables: localVariables).type, 6); |
9177 checkParamTypeRef(findVariable('u', variables: localVariables).type, 5); | 9196 checkParamTypeRef(findVariable('u', variables: localVariables).type, 5); |
9178 checkParamTypeRef(findVariable('v', variables: localVariables).type, 4); | 9197 checkParamTypeRef(findVariable('v', variables: localVariables).type, 4); |
9179 checkParamTypeRef(findVariable('w', variables: localVariables).type, 3); | 9198 checkParamTypeRef(findVariable('w', variables: localVariables).type, 3); |
9180 checkParamTypeRef(findVariable('x', variables: localVariables).type, 2); | 9199 checkParamTypeRef(findVariable('x', variables: localVariables).type, 2); |
9181 checkParamTypeRef(findVariable('y', variables: localVariables).type, 1); | 9200 checkParamTypeRef(findVariable('y', variables: localVariables).type, 1); |
9182 } | 9201 } |
9183 | 9202 |
9184 test_nested_generic_functions_in_generic_class() { | |
9185 UnlinkedClass cls = serializeClassText(''' | |
9186 class C<T, U> { | |
9187 void g<V, W>() { | |
9188 void h<X, Y>() { | |
9189 T t; | |
9190 U u; | |
9191 V v; | |
9192 W w; | |
9193 X x; | |
9194 Y y; | |
9195 } | |
9196 } | |
9197 } | |
9198 '''); | |
9199 expect(cls.typeParameters, hasLength(2)); | |
9200 expect(cls.executables[0].typeParameters, hasLength(2)); | |
9201 expect(cls.executables[0].localFunctions[0].typeParameters, hasLength(2)); | |
9202 List<UnlinkedVariable> localVariables = | |
9203 cls.executables[0].localFunctions[0].localVariables; | |
9204 checkParamTypeRef(findVariable('t', variables: localVariables).type, 6); | |
9205 checkParamTypeRef(findVariable('u', variables: localVariables).type, 5); | |
9206 checkParamTypeRef(findVariable('v', variables: localVariables).type, 4); | |
9207 checkParamTypeRef(findVariable('w', variables: localVariables).type, 3); | |
9208 checkParamTypeRef(findVariable('x', variables: localVariables).type, 2); | |
9209 checkParamTypeRef(findVariable('y', variables: localVariables).type, 1); | |
9210 } | |
9211 | |
9212 test_parameter_visibleRange_abstractMethod() { | 9203 test_parameter_visibleRange_abstractMethod() { |
9213 UnlinkedExecutable m = findExecutable('m', | 9204 UnlinkedExecutable m = findExecutable('m', |
9214 executables: | 9205 executables: |
9215 serializeClassText('abstract class C { m(p); }').executables, | 9206 serializeClassText('abstract class C { m(p); }').executables, |
9216 failIfAbsent: true); | 9207 failIfAbsent: true); |
9217 _assertParameterZeroVisibleRange(m.parameters[0]); | 9208 _assertParameterZeroVisibleRange(m.parameters[0]); |
9218 } | 9209 } |
9219 | 9210 |
9220 test_parameter_visibleRange_function_blockBody() { | 9211 test_parameter_visibleRange_function_blockBody() { |
9221 String text = r''' | 9212 String text = r''' |
9222 f(x) { // 1 | 9213 var v = (() { |
9223 f2(y) { // 2 | 9214 f(x) { // 1 |
9224 } // 3 | 9215 f2(y) { // 2 |
9225 } // 4 | 9216 } // 3 |
9217 } // 4 | |
9218 }); | |
9226 '''; | 9219 '''; |
9227 UnlinkedExecutable f = serializeExecutableText(text); | 9220 var closure = serializeVariableText(text).initializer.localFunctions[0]; |
9221 UnlinkedExecutable f = closure.localFunctions[0]; | |
9228 UnlinkedExecutable f2 = f.localFunctions[0]; | 9222 UnlinkedExecutable f2 = f.localFunctions[0]; |
9229 _assertParameterVisible(text, f.parameters[0], '{ // 1', '} // 4'); | 9223 _assertParameterVisible(text, f.parameters[0], '{ // 1', '} // 4'); |
9230 _assertParameterVisible(text, f2.parameters[0], '{ // 2', '} // 3'); | 9224 _assertParameterVisible(text, f2.parameters[0], '{ // 2', '} // 3'); |
9231 } | 9225 } |
9232 | 9226 |
9233 test_parameter_visibleRange_function_emptyBody() { | 9227 test_parameter_visibleRange_function_emptyBody() { |
9234 UnlinkedExecutable f = serializeExecutableText('external f(x);'); | 9228 UnlinkedExecutable f = serializeExecutableText('external f(x);'); |
9235 _assertParameterZeroVisibleRange(f.parameters[0]); | 9229 _assertParameterZeroVisibleRange(f.parameters[0]); |
9236 } | 9230 } |
9237 | 9231 |
(...skipping 25 matching lines...) Expand all Loading... | |
9263 addNamedSource('/a.dart', 'part of my.lib;'); | 9257 addNamedSource('/a.dart', 'part of my.lib;'); |
9264 String text = 'library my.lib; part "a.dart"; // <-part'; | 9258 String text = 'library my.lib; part "a.dart"; // <-part'; |
9265 serializeLibraryText(text); | 9259 serializeLibraryText(text); |
9266 expect(unlinkedUnits[0].publicNamespace.parts, hasLength(1)); | 9260 expect(unlinkedUnits[0].publicNamespace.parts, hasLength(1)); |
9267 expect(unlinkedUnits[0].publicNamespace.parts[0], 'a.dart'); | 9261 expect(unlinkedUnits[0].publicNamespace.parts[0], 'a.dart'); |
9268 expect(unlinkedUnits[0].parts, hasLength(1)); | 9262 expect(unlinkedUnits[0].parts, hasLength(1)); |
9269 expect(unlinkedUnits[0].parts[0].uriOffset, text.indexOf('"a.dart"')); | 9263 expect(unlinkedUnits[0].parts[0].uriOffset, text.indexOf('"a.dart"')); |
9270 expect(unlinkedUnits[0].parts[0].uriEnd, text.indexOf('; // <-part')); | 9264 expect(unlinkedUnits[0].parts[0].uriEnd, text.indexOf('; // <-part')); |
9271 } | 9265 } |
9272 | 9266 |
9267 test_part_isPartOf() { | |
9268 addNamedSource('/a.dart', 'part of foo; class C {}'); | |
9269 serializeLibraryText('library foo; part "a.dart";'); | |
9270 expect(unlinkedUnits[0].isPartOf, isFalse); | |
9271 expect(unlinkedUnits[1].isPartOf, isTrue); | |
9272 } | |
9273 | |
9273 test_parts_defining_compilation_unit() { | 9274 test_parts_defining_compilation_unit() { |
9274 serializeLibraryText(''); | 9275 serializeLibraryText(''); |
9275 expect(linked.units, hasLength(1)); | 9276 expect(linked.units, hasLength(1)); |
9276 expect(unlinkedUnits[0].publicNamespace.parts, isEmpty); | 9277 expect(unlinkedUnits[0].publicNamespace.parts, isEmpty); |
9277 } | 9278 } |
9278 | 9279 |
9279 test_parts_included() { | 9280 test_parts_included() { |
9280 addNamedSource('/part1.dart', 'part of my.lib;'); | 9281 addNamedSource('/part1.dart', 'part of my.lib;'); |
9281 String partString = '"part1.dart"'; | 9282 String partString = '"part1.dart"'; |
9282 String libraryText = 'library my.lib; part $partString;'; | 9283 String libraryText = 'library my.lib; part $partString;'; |
9283 serializeLibraryText(libraryText); | 9284 serializeLibraryText(libraryText); |
9284 expect(linked.units, hasLength(2)); | 9285 expect(linked.units, hasLength(2)); |
9285 expect(unlinkedUnits[0].publicNamespace.parts, hasLength(1)); | 9286 expect(unlinkedUnits[0].publicNamespace.parts, hasLength(1)); |
9286 expect(unlinkedUnits[0].publicNamespace.parts[0], 'part1.dart'); | 9287 expect(unlinkedUnits[0].publicNamespace.parts[0], 'part1.dart'); |
9287 } | 9288 } |
9288 | 9289 |
9289 test_public_namespace_of_part() { | 9290 test_public_namespace_of_part() { |
9290 addNamedSource('/a.dart', 'part of foo; class C {}'); | 9291 addNamedSource('/a.dart', 'part of foo; class C {}'); |
9291 serializeLibraryText('library foo; part "a.dart";'); | 9292 serializeLibraryText('library foo; part "a.dart";'); |
9292 expect(unlinkedUnits[0].publicNamespace.names, isEmpty); | 9293 expect(unlinkedUnits[0].publicNamespace.names, isEmpty); |
9293 expect(unlinkedUnits[1].publicNamespace.names, hasLength(1)); | 9294 expect(unlinkedUnits[1].publicNamespace.names, hasLength(1)); |
9294 expect(unlinkedUnits[1].publicNamespace.names[0].name, 'C'); | 9295 expect(unlinkedUnits[1].publicNamespace.names[0].name, 'C'); |
9295 } | 9296 } |
9296 | 9297 |
9297 test_part_isPartOf() { | |
9298 addNamedSource('/a.dart', 'part of foo; class C {}'); | |
9299 serializeLibraryText('library foo; part "a.dart";'); | |
9300 expect(unlinkedUnits[0].isPartOf, isFalse); | |
9301 expect(unlinkedUnits[1].isPartOf, isTrue); | |
9302 } | |
9303 | |
9304 test_reference_zero() { | 9298 test_reference_zero() { |
9305 // Element zero of the references table should be populated in a standard | 9299 // Element zero of the references table should be populated in a standard |
9306 // way. | 9300 // way. |
9307 serializeLibraryText(''); | 9301 serializeLibraryText(''); |
9308 UnlinkedReference unlinkedReference0 = unlinkedUnits[0].references[0]; | 9302 UnlinkedReference unlinkedReference0 = unlinkedUnits[0].references[0]; |
9309 expect(unlinkedReference0.name, ''); | 9303 expect(unlinkedReference0.name, ''); |
9310 expect(unlinkedReference0.prefixReference, 0); | 9304 expect(unlinkedReference0.prefixReference, 0); |
9311 LinkedReference linkedReference0 = linked.units[0].references[0]; | 9305 LinkedReference linkedReference0 = linked.units[0].references[0]; |
9312 expect(linkedReference0.containingReference, 0); | 9306 expect(linkedReference0.containingReference, 0); |
9313 expect(linkedReference0.dependency, 0); | 9307 expect(linkedReference0.dependency, 0); |
(...skipping 1057 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
10371 class _PrefixExpectation { | 10365 class _PrefixExpectation { |
10372 final ReferenceKind kind; | 10366 final ReferenceKind kind; |
10373 final String name; | 10367 final String name; |
10374 final String absoluteUri; | 10368 final String absoluteUri; |
10375 final String relativeUri; | 10369 final String relativeUri; |
10376 final int numTypeParameters; | 10370 final int numTypeParameters; |
10377 | 10371 |
10378 _PrefixExpectation(this.kind, this.name, | 10372 _PrefixExpectation(this.kind, this.name, |
10379 {this.absoluteUri, this.relativeUri, this.numTypeParameters: 0}); | 10373 {this.absoluteUri, this.relativeUri, this.numTypeParameters: 0}); |
10380 } | 10374 } |
OLD | NEW |