OLD | NEW |
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 test.edit.refactoring; | 5 library test.edit.refactoring; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 | 8 |
9 import 'package:analysis_server/plugin/protocol/protocol.dart'; | 9 import 'package:analysis_server/plugin/protocol/protocol.dart'; |
10 import 'package:analysis_server/src/edit/edit_domain.dart'; | 10 import 'package:analysis_server/src/edit/edit_domain.dart'; |
11 import 'package:analysis_server/src/services/index/index.dart'; | 11 import 'package:analysis_server/src/services/index/index.dart'; |
| 12 import 'package:analyzer/task/dart.dart'; |
12 import 'package:plugin/manager.dart'; | 13 import 'package:plugin/manager.dart'; |
13 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 14 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
14 import 'package:unittest/unittest.dart' hide ERROR; | 15 import 'package:unittest/unittest.dart' hide ERROR; |
15 | 16 |
16 import '../analysis_abstract.dart'; | 17 import '../analysis_abstract.dart'; |
17 import '../mocks.dart'; | 18 import '../mocks.dart'; |
18 import '../utils.dart'; | 19 import '../utils.dart'; |
19 | 20 |
20 main() { | 21 main() { |
21 initializeTestEnvironment(); | 22 initializeTestEnvironment(); |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 String search, String suffix, String name, bool extractAll) { | 264 String search, String suffix, String name, bool extractAll) { |
264 int offset = findOffset(search + suffix); | 265 int offset = findOffset(search + suffix); |
265 int length = search.length; | 266 int length = search.length; |
266 return sendExtractRequest(offset, length, name, extractAll); | 267 return sendExtractRequest(offset, length, name, extractAll); |
267 } | 268 } |
268 | 269 |
269 void tearDown() { | 270 void tearDown() { |
270 test_simulateRefactoringException_init = false; | 271 test_simulateRefactoringException_init = false; |
271 test_simulateRefactoringException_final = false; | 272 test_simulateRefactoringException_final = false; |
272 test_simulateRefactoringException_change = false; | 273 test_simulateRefactoringException_change = false; |
273 test_simulateRefactoringReset_afterInitialConditions = false; | |
274 test_simulateRefactoringReset_afterFinalConditions = false; | |
275 test_simulateRefactoringReset_afterCreateChange = false; | |
276 super.tearDown(); | 274 super.tearDown(); |
277 } | 275 } |
278 | 276 |
| 277 test_analysis_onlyOneFile() async { |
| 278 shouldWaitForFullAnalysis = false; |
| 279 String otherFile = '$testFolder/other.dart'; |
| 280 addFile( |
| 281 otherFile, |
| 282 r''' |
| 283 foo(int myName) {} |
| 284 '''); |
| 285 addTestFile(''' |
| 286 import 'other.dart'; |
| 287 main() { |
| 288 foo(1 + 2); |
| 289 } |
| 290 '''); |
| 291 // Start refactoring. |
| 292 EditGetRefactoringResult result = await getRefactoringResult(() { |
| 293 return sendStringRequest('1 + 2', 'res', true); |
| 294 }); |
| 295 // We get the refactoring feedback.... |
| 296 ExtractLocalVariableFeedback feedback = result.feedback; |
| 297 expect(feedback.names, contains('myName')); |
| 298 // ...even though other.dart is not fully analyzed. |
| 299 var otherSource = server.getContextSourcePair(otherFile).source; |
| 300 var otherUnit = new LibrarySpecificUnit(otherSource, otherSource); |
| 301 expect(testContext.getResult(otherUnit, RESOLVED_UNIT), isNull); |
| 302 } |
| 303 |
279 test_coveringExpressions() { | 304 test_coveringExpressions() { |
280 addTestFile(''' | 305 addTestFile(''' |
281 main() { | 306 main() { |
282 var v = 111 + 222 + 333; | 307 var v = 111 + 222 + 333; |
283 } | 308 } |
284 '''); | 309 '''); |
285 return getRefactoringResult(() { | 310 return getRefactoringResult(() { |
286 return sendExtractRequest(testCode.indexOf('222 +'), 0, 'res', true); | 311 return sendExtractRequest(testCode.indexOf('222 +'), 0, 'res', true); |
287 }).then((result) { | 312 }).then((result) { |
288 ExtractLocalVariableFeedback feedback = result.feedback; | 313 ExtractLocalVariableFeedback feedback = result.feedback; |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
384 '''); | 409 '''); |
385 return getRefactoringResult(() { | 410 return getRefactoringResult(() { |
386 return sendStringRequest('1 + 2', 'res', true); | 411 return sendStringRequest('1 + 2', 'res', true); |
387 }).then((result) { | 412 }).then((result) { |
388 ExtractLocalVariableFeedback feedback = result.feedback; | 413 ExtractLocalVariableFeedback feedback = result.feedback; |
389 expect(feedback.offsets, [findOffset('1 + 2'), findOffset('1 + 2')]); | 414 expect(feedback.offsets, [findOffset('1 + 2'), findOffset('1 + 2')]); |
390 expect(feedback.lengths, [5, 6]); | 415 expect(feedback.lengths, [5, 6]); |
391 }); | 416 }); |
392 } | 417 } |
393 | 418 |
394 test_reset_afterCreateChange() { | 419 test_resetOnFileChange() async { |
395 test_simulateRefactoringReset_afterCreateChange = true; | 420 String otherFile = '$testFolder/other.dart'; |
| 421 addFile(otherFile, '// other 1'); |
396 addTestFile(''' | 422 addTestFile(''' |
397 main() { | 423 main() { |
398 print(1 + 2); | 424 foo(1 + 2); |
399 } | 425 } |
| 426 foo(int myName) {} |
400 '''); | 427 '''); |
401 return waitForTasksFinished().then((_) { | 428 // Send the first request. |
402 return sendStringRequest('1 + 2', 'res', true).then((response) { | 429 { |
403 _expectRefactoringRequestCancelled(response); | 430 EditGetRefactoringResult result = await getRefactoringResult(() { |
| 431 return sendStringRequest('1 + 2', 'res', true); |
404 }); | 432 }); |
405 }); | 433 ExtractLocalVariableFeedback feedback = result.feedback; |
406 } | 434 expect(feedback.names, contains('myName')); |
407 | 435 } |
408 test_reset_afterFinalConditions() { | 436 int initialResetCount = test_resetCount; |
409 test_simulateRefactoringReset_afterFinalConditions = true; | 437 // Update the other.dart file. |
410 addTestFile(''' | 438 // The refactoring is not reset, because it's a different file. |
| 439 addFile(otherFile, '// other 2'); |
| 440 await pumpEventQueue(); |
| 441 expect(test_resetCount, initialResetCount); |
| 442 // Update the test.dart file. |
| 443 modifyTestFile(''' |
411 main() { | 444 main() { |
412 print(1 + 2); | 445 foo(1 + 2); |
413 } | 446 } |
| 447 foo(int otherName) {} |
414 '''); | 448 '''); |
415 return waitForTasksFinished().then((_) { | 449 // The refactoring was reset. |
416 return sendStringRequest('1 + 2', 'res', true).then((response) { | 450 await pumpEventQueue(); |
417 _expectRefactoringRequestCancelled(response); | 451 expect(test_resetCount, initialResetCount + 1); |
| 452 // Send the second request, with the same kind, file and offset. |
| 453 { |
| 454 EditGetRefactoringResult result = await getRefactoringResult(() { |
| 455 return sendStringRequest('1 + 2', 'res', true); |
418 }); | 456 }); |
419 }); | 457 ExtractLocalVariableFeedback feedback = result.feedback; |
420 } | 458 // The refactoring was reset, so we don't get stale results. |
421 | 459 expect(feedback.names, contains('otherName')); |
422 test_reset_afterInitialConditions() { | 460 } |
423 test_simulateRefactoringReset_afterInitialConditions = true; | |
424 addTestFile(''' | |
425 main() { | |
426 print(1 + 2); | |
427 } | |
428 '''); | |
429 return waitForTasksFinished().then((_) { | |
430 return sendStringRequest('1 + 2', 'res', true).then((response) { | |
431 _expectRefactoringRequestCancelled(response); | |
432 }); | |
433 }); | |
434 } | 461 } |
435 | 462 |
436 test_serverError_change() { | 463 test_serverError_change() { |
437 test_simulateRefactoringException_change = true; | 464 test_simulateRefactoringException_change = true; |
438 addTestFile(''' | 465 addTestFile(''' |
439 main() { | 466 main() { |
440 print(1 + 2); | 467 print(1 + 2); |
441 } | 468 } |
442 '''); | 469 '''); |
443 return waitForTasksFinished().then((_) { | 470 return waitForTasksFinished().then((_) { |
(...skipping 26 matching lines...) Expand all Loading... |
470 print(1 + 2); | 497 print(1 + 2); |
471 } | 498 } |
472 '''); | 499 '''); |
473 return waitForTasksFinished().then((_) { | 500 return waitForTasksFinished().then((_) { |
474 return sendStringRequest('1 + 2', 'res', true).then((response) { | 501 return sendStringRequest('1 + 2', 'res', true).then((response) { |
475 expect(response.error, isNotNull); | 502 expect(response.error, isNotNull); |
476 expect(response.error.code, RequestErrorCode.SERVER_ERROR); | 503 expect(response.error.code, RequestErrorCode.SERVER_ERROR); |
477 }); | 504 }); |
478 }); | 505 }); |
479 } | 506 } |
480 | |
481 void _expectRefactoringRequestCancelled(Response response) { | |
482 expect(response.error, isNotNull); | |
483 expect(response, | |
484 isResponseFailure('0', RequestErrorCode.REFACTORING_REQUEST_CANCELLED)); | |
485 } | |
486 } | 507 } |
487 | 508 |
488 @reflectiveTest | 509 @reflectiveTest |
489 class ExtractMethodTest extends _AbstractGetRefactoring_Test { | 510 class ExtractMethodTest extends _AbstractGetRefactoring_Test { |
490 int offset; | 511 int offset; |
491 int length; | 512 int length; |
492 String name = 'res'; | 513 String name = 'res'; |
493 ExtractMethodOptions options; | 514 ExtractMethodOptions options; |
494 | 515 |
495 test_expression() { | 516 test_expression() { |
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
923 } | 944 } |
924 '''); | 945 '''); |
925 await waitForTasksFinished(); | 946 await waitForTasksFinished(); |
926 await getRefactoringsAtString('// not an element'); | 947 await getRefactoringsAtString('// not an element'); |
927 expect(kinds, isNot(contains(RefactoringKind.RENAME))); | 948 expect(kinds, isNot(contains(RefactoringKind.RENAME))); |
928 } | 949 } |
929 } | 950 } |
930 | 951 |
931 @reflectiveTest | 952 @reflectiveTest |
932 class InlineLocalTest extends _AbstractGetRefactoring_Test { | 953 class InlineLocalTest extends _AbstractGetRefactoring_Test { |
| 954 test_analysis_onlyOneFile() async { |
| 955 shouldWaitForFullAnalysis = false; |
| 956 String otherFile = '$testFolder/other.dart'; |
| 957 addFile( |
| 958 otherFile, |
| 959 r''' |
| 960 foo(int p) {} |
| 961 '''); |
| 962 addTestFile(''' |
| 963 import 'other.dart'; |
| 964 main() { |
| 965 int res = 1 + 2; |
| 966 foo(res); |
| 967 foo(res); |
| 968 } |
| 969 '''); |
| 970 // Start refactoring. |
| 971 EditGetRefactoringResult result = await getRefactoringResult(() { |
| 972 return _sendInlineRequest('res ='); |
| 973 }); |
| 974 // We get the refactoring feedback.... |
| 975 InlineLocalVariableFeedback feedback = result.feedback; |
| 976 expect(feedback.occurrences, 2); |
| 977 // ...even though other.dart is not fully analyzed. |
| 978 var otherSource = server.getContextSourcePair(otherFile).source; |
| 979 var otherUnit = new LibrarySpecificUnit(otherSource, otherSource); |
| 980 expect(testContext.getResult(otherUnit, RESOLVED_UNIT), isNull); |
| 981 } |
| 982 |
933 test_feedback() { | 983 test_feedback() { |
934 addTestFile(''' | 984 addTestFile(''' |
935 main() { | 985 main() { |
936 int test = 42; | 986 int test = 42; |
937 print(test); | 987 print(test); |
938 print(test); | 988 print(test); |
939 } | 989 } |
940 '''); | 990 '''); |
941 return getRefactoringResult(() { | 991 return getRefactoringResult(() { |
942 return _sendInlineRequest('test ='); | 992 return _sendInlineRequest('test ='); |
(...skipping 28 matching lines...) Expand all Loading... |
971 return _sendInlineRequest('test + 2'); | 1021 return _sendInlineRequest('test + 2'); |
972 }, | 1022 }, |
973 ''' | 1023 ''' |
974 main() { | 1024 main() { |
975 int a = 42 + 2; | 1025 int a = 42 + 2; |
976 print(42); | 1026 print(42); |
977 } | 1027 } |
978 '''); | 1028 '''); |
979 } | 1029 } |
980 | 1030 |
| 1031 test_resetOnFileChange() async { |
| 1032 String otherFile = '$testFolder/other.dart'; |
| 1033 addFile(otherFile, '// other 1'); |
| 1034 addTestFile(''' |
| 1035 main() { |
| 1036 int res = 1 + 2; |
| 1037 print(res); |
| 1038 } |
| 1039 '''); |
| 1040 // Send the first request. |
| 1041 await getRefactoringResult(() { |
| 1042 return _sendInlineRequest('res = '); |
| 1043 }); |
| 1044 int initialResetCount = test_resetCount; |
| 1045 // Update the other.dart file. |
| 1046 // The refactoring is not reset, because it's a different file. |
| 1047 addFile(otherFile, '// other 2'); |
| 1048 await pumpEventQueue(); |
| 1049 expect(test_resetCount, initialResetCount); |
| 1050 // Update the test.dart file. |
| 1051 modifyTestFile(''' |
| 1052 main() { |
| 1053 print(1 + 2); |
| 1054 } |
| 1055 '''); |
| 1056 // The refactoring was reset. |
| 1057 await pumpEventQueue(); |
| 1058 expect(test_resetCount, initialResetCount + 1); |
| 1059 } |
| 1060 |
981 Future<Response> _sendInlineRequest(String search) { | 1061 Future<Response> _sendInlineRequest(String search) { |
982 Request request = new EditGetRefactoringParams( | 1062 Request request = new EditGetRefactoringParams( |
983 RefactoringKind.INLINE_LOCAL_VARIABLE, | 1063 RefactoringKind.INLINE_LOCAL_VARIABLE, |
984 testFile, | 1064 testFile, |
985 findOffset(search), | 1065 findOffset(search), |
986 0, | 1066 0, |
987 false) | 1067 false) |
988 .toRequest('0'); | 1068 .toRequest('0'); |
989 return serverChannel.sendRequest(request); | 1069 return serverChannel.sendRequest(request); |
990 } | 1070 } |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1157 Future<Response> sendRenameRequest(String search, String newName, | 1237 Future<Response> sendRenameRequest(String search, String newName, |
1158 {String id: '0', bool validateOnly: false}) { | 1238 {String id: '0', bool validateOnly: false}) { |
1159 RenameOptions options = newName != null ? new RenameOptions(newName) : null; | 1239 RenameOptions options = newName != null ? new RenameOptions(newName) : null; |
1160 Request request = new EditGetRefactoringParams(RefactoringKind.RENAME, | 1240 Request request = new EditGetRefactoringParams(RefactoringKind.RENAME, |
1161 testFile, findOffset(search), 0, validateOnly, | 1241 testFile, findOffset(search), 0, validateOnly, |
1162 options: options) | 1242 options: options) |
1163 .toRequest(id); | 1243 .toRequest(id); |
1164 return serverChannel.sendRequest(request); | 1244 return serverChannel.sendRequest(request); |
1165 } | 1245 } |
1166 | 1246 |
| 1247 void tearDown() { |
| 1248 test_simulateRefactoringReset_afterInitialConditions = false; |
| 1249 test_simulateRefactoringReset_afterFinalConditions = false; |
| 1250 test_simulateRefactoringReset_afterCreateChange = false; |
| 1251 super.tearDown(); |
| 1252 } |
| 1253 |
1167 test_cancelPendingRequest() async { | 1254 test_cancelPendingRequest() async { |
1168 addTestFile(''' | 1255 addTestFile(''' |
1169 main() { | 1256 main() { |
1170 int test = 0; | 1257 int test = 0; |
1171 print(test); | 1258 print(test); |
1172 } | 1259 } |
1173 '''); | 1260 '''); |
1174 // send the "1" request, but don't wait for it | 1261 // send the "1" request, but don't wait for it |
1175 Future<Response> futureA = sendRenameRequest('test =', 'nameA', id: '1'); | 1262 Future<Response> futureA = sendRenameRequest('test =', 'nameA', id: '1'); |
1176 // send the "2" request and wait for it | 1263 // send the "2" request and wait for it |
(...skipping 549 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1726 return getRefactoringResult(() { | 1813 return getRefactoringResult(() { |
1727 return sendRenameRequest('test = 0', 'newName'); | 1814 return sendRenameRequest('test = 0', 'newName'); |
1728 }).then((result) { | 1815 }).then((result) { |
1729 List<RefactoringProblem> problems = result.finalProblems; | 1816 List<RefactoringProblem> problems = result.finalProblems; |
1730 expect(problems, hasLength(1)); | 1817 expect(problems, hasLength(1)); |
1731 assertResultProblemsError( | 1818 assertResultProblemsError( |
1732 problems, "Duplicate local variable 'newName'."); | 1819 problems, "Duplicate local variable 'newName'."); |
1733 }); | 1820 }); |
1734 } | 1821 } |
1735 | 1822 |
| 1823 test_reset_afterCreateChange() { |
| 1824 test_simulateRefactoringReset_afterCreateChange = true; |
| 1825 addTestFile(''' |
| 1826 test() {} |
| 1827 main() { |
| 1828 test(); |
| 1829 } |
| 1830 '''); |
| 1831 return waitForTasksFinished().then((_) { |
| 1832 return sendRenameRequest('test() {}', 'newName').then((response) { |
| 1833 _expectRefactoringRequestCancelled(response); |
| 1834 }); |
| 1835 }); |
| 1836 } |
| 1837 |
| 1838 test_reset_afterFinalConditions() { |
| 1839 test_simulateRefactoringReset_afterFinalConditions = true; |
| 1840 addTestFile(''' |
| 1841 test() {} |
| 1842 main() { |
| 1843 test(); |
| 1844 } |
| 1845 '''); |
| 1846 return waitForTasksFinished().then((_) { |
| 1847 return sendRenameRequest('test() {}', 'newName').then((response) { |
| 1848 _expectRefactoringRequestCancelled(response); |
| 1849 }); |
| 1850 }); |
| 1851 } |
| 1852 |
| 1853 test_reset_afterInitialConditions() { |
| 1854 test_simulateRefactoringReset_afterInitialConditions = true; |
| 1855 addTestFile(''' |
| 1856 test() {} |
| 1857 main() { |
| 1858 test(); |
| 1859 } |
| 1860 '''); |
| 1861 return waitForTasksFinished().then((_) { |
| 1862 return sendRenameRequest('test() {}', 'newName').then((response) { |
| 1863 _expectRefactoringRequestCancelled(response); |
| 1864 }); |
| 1865 }); |
| 1866 } |
| 1867 |
1736 test_resetOnAnalysis() { | 1868 test_resetOnAnalysis() { |
1737 addTestFile(''' | 1869 addTestFile(''' |
1738 main() { | 1870 main() { |
1739 int initialName = 0; | 1871 int initialName = 0; |
1740 print(initialName); | 1872 print(initialName); |
1741 } | 1873 } |
1742 '''); | 1874 '''); |
1743 // send the first request | 1875 // send the first request |
1744 return getRefactoringResult(() { | 1876 return getRefactoringResult(() { |
1745 return sendRenameRequest('initialName =', 'newName', validateOnly: true); | 1877 return sendRenameRequest('initialName =', 'newName', validateOnly: true); |
(...skipping 14 matching lines...) Expand all Loading... |
1760 validateOnly: true); | 1892 validateOnly: true); |
1761 }).then((result) { | 1893 }).then((result) { |
1762 RenameFeedback feedback = result.feedback; | 1894 RenameFeedback feedback = result.feedback; |
1763 // the refactoring was reset, so we don't get a stale result | 1895 // the refactoring was reset, so we don't get a stale result |
1764 expect(feedback.oldName, 'otherName'); | 1896 expect(feedback.oldName, 'otherName'); |
1765 }); | 1897 }); |
1766 }); | 1898 }); |
1767 }); | 1899 }); |
1768 } | 1900 } |
1769 | 1901 |
| 1902 void _expectRefactoringRequestCancelled(Response response) { |
| 1903 expect(response.error, isNotNull); |
| 1904 expect(response, |
| 1905 isResponseFailure('0', RequestErrorCode.REFACTORING_REQUEST_CANCELLED)); |
| 1906 } |
| 1907 |
1770 SourceEdit _findEditWithId(SourceChange change, String id) { | 1908 SourceEdit _findEditWithId(SourceChange change, String id) { |
1771 SourceEdit potentialEdit; | 1909 SourceEdit potentialEdit; |
1772 change.edits.forEach((fileEdit) { | 1910 change.edits.forEach((fileEdit) { |
1773 fileEdit.edits.forEach((edit) { | 1911 fileEdit.edits.forEach((edit) { |
1774 if (edit.id == id) { | 1912 if (edit.id == id) { |
1775 potentialEdit = edit; | 1913 potentialEdit = edit; |
1776 } | 1914 } |
1777 }); | 1915 }); |
1778 }); | 1916 }); |
1779 return potentialEdit; | 1917 return potentialEdit; |
1780 } | 1918 } |
1781 } | 1919 } |
1782 | 1920 |
1783 @reflectiveTest | 1921 @reflectiveTest |
1784 class _AbstractGetRefactoring_Test extends AbstractAnalysisTest { | 1922 class _AbstractGetRefactoring_Test extends AbstractAnalysisTest { |
| 1923 bool shouldWaitForFullAnalysis = true; |
| 1924 |
1785 /** | 1925 /** |
1786 * Asserts that [problems] has a single ERROR problem. | 1926 * Asserts that [problems] has a single ERROR problem. |
1787 */ | 1927 */ |
1788 void assertResultProblemsError(List<RefactoringProblem> problems, | 1928 void assertResultProblemsError(List<RefactoringProblem> problems, |
1789 [String message]) { | 1929 [String message]) { |
1790 RefactoringProblem problem = problems[0]; | 1930 RefactoringProblem problem = problems[0]; |
1791 expect(problem.severity, RefactoringProblemSeverity.ERROR, | 1931 expect(problem.severity, RefactoringProblemSeverity.ERROR, |
1792 reason: problem.toString()); | 1932 reason: problem.toString()); |
1793 if (message != null) { | 1933 if (message != null) { |
1794 expect(problem.message, message); | 1934 expect(problem.message, message); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1858 fail('No SourceFileEdit for $testFile in $change'); | 1998 fail('No SourceFileEdit for $testFile in $change'); |
1859 } | 1999 } |
1860 | 2000 |
1861 @override | 2001 @override |
1862 Index createIndex() { | 2002 Index createIndex() { |
1863 return createMemoryIndex(); | 2003 return createMemoryIndex(); |
1864 } | 2004 } |
1865 | 2005 |
1866 Future<EditGetRefactoringResult> getRefactoringResult( | 2006 Future<EditGetRefactoringResult> getRefactoringResult( |
1867 Future<Response> requestSender()) async { | 2007 Future<Response> requestSender()) async { |
1868 await waitForTasksFinished(); | 2008 if (shouldWaitForFullAnalysis) { |
| 2009 await waitForTasksFinished(); |
| 2010 } |
1869 Response response = await requestSender(); | 2011 Response response = await requestSender(); |
1870 return new EditGetRefactoringResult.fromResponse(response); | 2012 return new EditGetRefactoringResult.fromResponse(response); |
1871 } | 2013 } |
1872 | 2014 |
1873 Future<Response> sendRequest( | 2015 Future<Response> sendRequest( |
1874 RefactoringKind kind, int offset, int length, RefactoringOptions options, | 2016 RefactoringKind kind, int offset, int length, RefactoringOptions options, |
1875 [bool validateOnly = false]) { | 2017 [bool validateOnly = false]) { |
1876 Request request = new EditGetRefactoringParams( | 2018 Request request = new EditGetRefactoringParams( |
1877 kind, testFile, offset, length, validateOnly, | 2019 kind, testFile, offset, length, validateOnly, |
1878 options: options) | 2020 options: options) |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1922 .toRequest('0'); | 2064 .toRequest('0'); |
1923 return _assertErrorResponseNoIndex(request); | 2065 return _assertErrorResponseNoIndex(request); |
1924 } | 2066 } |
1925 | 2067 |
1926 _assertErrorResponseNoIndex(Request request) async { | 2068 _assertErrorResponseNoIndex(Request request) async { |
1927 Response response = await serverChannel.sendRequest(request); | 2069 Response response = await serverChannel.sendRequest(request); |
1928 expect(response.error, isNotNull); | 2070 expect(response.error, isNotNull); |
1929 expect(response.error.code, RequestErrorCode.NO_INDEX_GENERATED); | 2071 expect(response.error.code, RequestErrorCode.NO_INDEX_GENERATED); |
1930 } | 2072 } |
1931 } | 2073 } |
OLD | NEW |