OLD | NEW |
| (Empty) |
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 | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 library test.services.completion.dart.keyword; | |
6 | |
7 import 'package:analysis_server/plugin/protocol/protocol.dart'; | |
8 import 'package:analysis_server/src/services/completion/dart_completion_manager.
dart'; | |
9 import 'package:analysis_server/src/services/completion/keyword_contributor.dart
'; | |
10 import 'package:analyzer/src/generated/scanner.dart'; | |
11 import 'package:test_reflective_loader/test_reflective_loader.dart'; | |
12 import 'package:unittest/unittest.dart'; | |
13 | |
14 import '../../utils.dart'; | |
15 import 'completion_test_util.dart'; | |
16 | |
17 main() { | |
18 initializeTestEnvironment(); | |
19 defineReflectiveTests(KeywordContributorTest); | |
20 } | |
21 | |
22 @reflectiveTest | |
23 class KeywordContributorTest extends AbstractCompletionTest { | |
24 static const List<Keyword> CLASS_BODY_KEYWORDS = const [ | |
25 Keyword.CONST, | |
26 Keyword.DYNAMIC, | |
27 Keyword.FACTORY, | |
28 Keyword.FINAL, | |
29 Keyword.GET, | |
30 Keyword.OPERATOR, | |
31 Keyword.SET, | |
32 Keyword.STATIC, | |
33 Keyword.VAR, | |
34 Keyword.VOID | |
35 ]; | |
36 | |
37 static const List<Keyword> DECLARATION_KEYWORDS = const [ | |
38 Keyword.ABSTRACT, | |
39 Keyword.CLASS, | |
40 Keyword.CONST, | |
41 Keyword.DYNAMIC, | |
42 Keyword.FINAL, | |
43 Keyword.TYPEDEF, | |
44 Keyword.VAR, | |
45 Keyword.VOID | |
46 ]; | |
47 | |
48 static const List<Keyword> DIRECTIVE_AND_DECLARATION_KEYWORDS = const [ | |
49 Keyword.ABSTRACT, | |
50 Keyword.CLASS, | |
51 Keyword.CONST, | |
52 Keyword.DYNAMIC, | |
53 Keyword.EXPORT, | |
54 Keyword.FINAL, | |
55 Keyword.IMPORT, | |
56 Keyword.PART, | |
57 Keyword.TYPEDEF, | |
58 Keyword.VAR, | |
59 Keyword.VOID | |
60 ]; | |
61 | |
62 static const List<Keyword> DIRECTIVE_DECLARATION_AND_LIBRARY_KEYWORDS = | |
63 const [ | |
64 Keyword.ABSTRACT, | |
65 Keyword.CLASS, | |
66 Keyword.CONST, | |
67 Keyword.DYNAMIC, | |
68 Keyword.EXPORT, | |
69 Keyword.FINAL, | |
70 Keyword.IMPORT, | |
71 Keyword.LIBRARY, | |
72 Keyword.PART, | |
73 Keyword.TYPEDEF, | |
74 Keyword.VAR, | |
75 Keyword.VOID | |
76 ]; | |
77 | |
78 static const List<String> NO_PSEUDO_KEYWORDS = const []; | |
79 | |
80 static const List<Keyword> STMT_START_IN_CLASS = const [ | |
81 Keyword.ASSERT, | |
82 Keyword.CONST, | |
83 Keyword.DO, | |
84 Keyword.FINAL, | |
85 Keyword.FOR, | |
86 Keyword.IF, | |
87 Keyword.NEW, | |
88 Keyword.RETURN, | |
89 Keyword.SUPER, | |
90 Keyword.SWITCH, | |
91 Keyword.THIS, | |
92 Keyword.THROW, | |
93 Keyword.TRY, | |
94 Keyword.VAR, | |
95 Keyword.VOID, | |
96 Keyword.WHILE | |
97 ]; | |
98 | |
99 static const List<Keyword> STMT_START_IN_LOOP_IN_CLASS = const [ | |
100 Keyword.ASSERT, | |
101 Keyword.BREAK, | |
102 Keyword.CONST, | |
103 Keyword.CONTINUE, | |
104 Keyword.DO, | |
105 Keyword.FINAL, | |
106 Keyword.FOR, | |
107 Keyword.IF, | |
108 Keyword.NEW, | |
109 Keyword.RETURN, | |
110 Keyword.SUPER, | |
111 Keyword.SWITCH, | |
112 Keyword.THIS, | |
113 Keyword.THROW, | |
114 Keyword.TRY, | |
115 Keyword.VAR, | |
116 Keyword.VOID, | |
117 Keyword.WHILE | |
118 ]; | |
119 | |
120 static const List<Keyword> STMT_START_IN_SWITCH_IN_CLASS = const [ | |
121 Keyword.ASSERT, | |
122 Keyword.BREAK, | |
123 Keyword.CASE, | |
124 Keyword.CONST, | |
125 Keyword.DEFAULT, | |
126 Keyword.DO, | |
127 Keyword.FINAL, | |
128 Keyword.FOR, | |
129 Keyword.IF, | |
130 Keyword.NEW, | |
131 Keyword.RETURN, | |
132 Keyword.SUPER, | |
133 Keyword.SWITCH, | |
134 Keyword.THIS, | |
135 Keyword.THROW, | |
136 Keyword.TRY, | |
137 Keyword.VAR, | |
138 Keyword.VOID, | |
139 Keyword.WHILE | |
140 ]; | |
141 | |
142 static const List<Keyword> STMT_START_IN_SWITCH_OUTSIDE_CLASS = const [ | |
143 Keyword.ASSERT, | |
144 Keyword.BREAK, | |
145 Keyword.CASE, | |
146 Keyword.CONST, | |
147 Keyword.DEFAULT, | |
148 Keyword.DO, | |
149 Keyword.FINAL, | |
150 Keyword.FOR, | |
151 Keyword.IF, | |
152 Keyword.NEW, | |
153 Keyword.RETURN, | |
154 Keyword.SWITCH, | |
155 Keyword.THROW, | |
156 Keyword.TRY, | |
157 Keyword.VAR, | |
158 Keyword.VOID, | |
159 Keyword.WHILE | |
160 ]; | |
161 | |
162 static const List<Keyword> STMT_START_OUTSIDE_CLASS = const [ | |
163 Keyword.ASSERT, | |
164 Keyword.CONST, | |
165 Keyword.DO, | |
166 Keyword.FINAL, | |
167 Keyword.FOR, | |
168 Keyword.IF, | |
169 Keyword.NEW, | |
170 Keyword.RETURN, | |
171 Keyword.SWITCH, | |
172 Keyword.THROW, | |
173 Keyword.TRY, | |
174 Keyword.VAR, | |
175 Keyword.VOID, | |
176 Keyword.WHILE | |
177 ]; | |
178 | |
179 static const List<Keyword> STMT_START_IN_LOOP_OUTSIDE_CLASS = const [ | |
180 Keyword.ASSERT, | |
181 Keyword.BREAK, | |
182 Keyword.CONST, | |
183 Keyword.CONTINUE, | |
184 Keyword.DO, | |
185 Keyword.FINAL, | |
186 Keyword.FOR, | |
187 Keyword.IF, | |
188 Keyword.NEW, | |
189 Keyword.RETURN, | |
190 Keyword.SWITCH, | |
191 Keyword.THROW, | |
192 Keyword.TRY, | |
193 Keyword.VAR, | |
194 Keyword.VOID, | |
195 Keyword.WHILE | |
196 ]; | |
197 | |
198 static const List<Keyword> EXPRESSION_START_INSTANCE = const [ | |
199 Keyword.CONST, | |
200 Keyword.FALSE, | |
201 Keyword.NEW, | |
202 Keyword.NULL, | |
203 Keyword.SUPER, | |
204 Keyword.THIS, | |
205 Keyword.TRUE, | |
206 ]; | |
207 | |
208 static const List<Keyword> EXPRESSION_START_NO_INSTANCE = const [ | |
209 Keyword.CONST, | |
210 Keyword.FALSE, | |
211 Keyword.NEW, | |
212 Keyword.NULL, | |
213 Keyword.TRUE, | |
214 ]; | |
215 | |
216 void assertSuggestKeywords(Iterable<Keyword> expectedKeywords, | |
217 {List<String> pseudoKeywords: NO_PSEUDO_KEYWORDS, | |
218 int relevance: DART_RELEVANCE_KEYWORD}) { | |
219 Set<String> expectedCompletions = new Set<String>(); | |
220 Map<String, int> expectedOffsets = <String, int>{}; | |
221 Set<String> actualCompletions = new Set<String>(); | |
222 expectedCompletions.addAll(expectedKeywords.map((k) => k.syntax)); | |
223 expectedCompletions.addAll(pseudoKeywords); | |
224 for (CompletionSuggestion s in request.suggestions) { | |
225 if (s.kind == CompletionSuggestionKind.KEYWORD) { | |
226 Keyword k = Keyword.keywords[s.completion]; | |
227 if (k == null && !expectedCompletions.contains(s.completion)) { | |
228 fail('Invalid keyword suggested: ${s.completion}'); | |
229 } else { | |
230 if (!actualCompletions.add(s.completion)) { | |
231 fail('Duplicate keyword suggested: ${s.completion}'); | |
232 } | |
233 } | |
234 } | |
235 } | |
236 if (!_equalSets(expectedCompletions, actualCompletions)) { | |
237 StringBuffer msg = new StringBuffer(); | |
238 msg.writeln('Expected:'); | |
239 _appendCompletions(msg, expectedCompletions, actualCompletions); | |
240 msg.writeln('but found:'); | |
241 _appendCompletions(msg, actualCompletions, expectedCompletions); | |
242 fail(msg.toString()); | |
243 } | |
244 for (CompletionSuggestion s in request.suggestions) { | |
245 if (s.kind == CompletionSuggestionKind.KEYWORD) { | |
246 if (s.completion.startsWith(Keyword.IMPORT.syntax)) { | |
247 int importRelevance = relevance; | |
248 if (importRelevance == DART_RELEVANCE_HIGH && | |
249 s.completion == "import '';") { | |
250 ++importRelevance; | |
251 } | |
252 expect(s.relevance, equals(importRelevance), reason: s.completion); | |
253 } else { | |
254 if (s.completion == Keyword.RETHROW.syntax) { | |
255 expect(s.relevance, equals(relevance - 1), reason: s.completion); | |
256 } else { | |
257 expect(s.relevance, equals(relevance), reason: s.completion); | |
258 } | |
259 } | |
260 int expectedOffset = expectedOffsets[s.completion]; | |
261 if (expectedOffset == null) { | |
262 expectedOffset = s.completion.length; | |
263 } | |
264 expect(s.selectionOffset, equals(expectedOffset)); | |
265 expect(s.selectionLength, equals(0)); | |
266 expect(s.isDeprecated, equals(false)); | |
267 expect(s.isPotential, equals(false)); | |
268 } | |
269 } | |
270 } | |
271 | |
272 fail_import_partial() { | |
273 addTestSource('imp^ import "package:foo/foo.dart"; import "bar.dart";'); | |
274 expect(computeFast(), isTrue); | |
275 // TODO(danrubel) should not suggest declaration keywords | |
276 assertNotSuggested('class'); | |
277 } | |
278 | |
279 fail_import_partial4() { | |
280 addTestSource('^ imp import "package:foo/foo.dart";'); | |
281 expect(computeFast(), isTrue); | |
282 // TODO(danrubel) should not suggest declaration keywords | |
283 assertNotSuggested('class'); | |
284 } | |
285 | |
286 fail_import_partial5() { | |
287 addTestSource('library libA; imp^ import "package:foo/foo.dart";'); | |
288 expect(computeFast(), isTrue); | |
289 // TODO(danrubel) should not suggest declaration keywords | |
290 assertNotSuggested('class'); | |
291 } | |
292 | |
293 fail_import_partial6() { | |
294 addTestSource( | |
295 'library bar; import "zoo.dart"; imp^ import "package:foo/foo.dart";'); | |
296 expect(computeFast(), isTrue); | |
297 // TODO(danrubel) should not suggest declaration keywords | |
298 assertNotSuggested('class'); | |
299 } | |
300 | |
301 @override | |
302 void setUpContributor() { | |
303 contributor = new KeywordContributor(); | |
304 } | |
305 | |
306 test_after_class() { | |
307 addTestSource('class A {} ^'); | |
308 expect(computeFast(), isTrue); | |
309 assertSuggestKeywords(DECLARATION_KEYWORDS, relevance: DART_RELEVANCE_HIGH); | |
310 } | |
311 | |
312 test_after_class2() { | |
313 addTestSource('class A {} c^'); | |
314 expect(computeFast(), isTrue); | |
315 assertSuggestKeywords(DECLARATION_KEYWORDS, relevance: DART_RELEVANCE_HIGH); | |
316 } | |
317 | |
318 test_after_import() { | |
319 addTestSource('import "foo"; ^'); | |
320 expect(computeFast(), isTrue); | |
321 assertSuggestKeywords(DIRECTIVE_AND_DECLARATION_KEYWORDS, | |
322 relevance: DART_RELEVANCE_HIGH); | |
323 } | |
324 | |
325 test_after_import2() { | |
326 addTestSource('import "foo"; c^'); | |
327 expect(computeFast(), isTrue); | |
328 assertSuggestKeywords(DIRECTIVE_AND_DECLARATION_KEYWORDS, | |
329 relevance: DART_RELEVANCE_HIGH); | |
330 } | |
331 | |
332 test_anonymous_function_async() { | |
333 addTestSource('main() {foo(() ^ {}}}'); | |
334 expect(computeFast(), isTrue); | |
335 assertSuggestKeywords([], | |
336 pseudoKeywords: ['async'], relevance: DART_RELEVANCE_HIGH); | |
337 } | |
338 | |
339 test_anonymous_function_async2() { | |
340 addTestSource('main() {foo(() a^ {}}}'); | |
341 expect(computeFast(), isTrue); | |
342 assertSuggestKeywords(STMT_START_OUTSIDE_CLASS, pseudoKeywords: ['async']); | |
343 } | |
344 | |
345 test_anonymous_function_async3() { | |
346 addTestSource('main() {foo(() async ^ {}}}'); | |
347 expect(computeFast(), isTrue); | |
348 assertSuggestKeywords([]); | |
349 } | |
350 | |
351 test_argument() { | |
352 addTestSource('main() {foo(^);}'); | |
353 expect(computeFast(), isTrue); | |
354 assertSuggestKeywords(EXPRESSION_START_NO_INSTANCE); | |
355 } | |
356 | |
357 test_argument2() { | |
358 addTestSource('main() {foo(n^);}'); | |
359 expect(computeFast(), isTrue); | |
360 assertSuggestKeywords(EXPRESSION_START_NO_INSTANCE); | |
361 } | |
362 | |
363 test_argument_literal() { | |
364 addTestSource('main() {foo("^");}'); | |
365 expect(computeFast(), isTrue); | |
366 assertSuggestKeywords([]); | |
367 } | |
368 | |
369 test_argument_named() { | |
370 addTestSource('main() {foo(bar: ^);}'); | |
371 expect(computeFast(), isTrue); | |
372 assertSuggestKeywords(EXPRESSION_START_NO_INSTANCE); | |
373 } | |
374 | |
375 test_argument_named2() { | |
376 addTestSource('main() {foo(bar: n^);}'); | |
377 expect(computeFast(), isTrue); | |
378 assertSuggestKeywords(EXPRESSION_START_NO_INSTANCE); | |
379 } | |
380 | |
381 test_argument_named_literal() { | |
382 addTestSource('main() {foo(bar: "^");}'); | |
383 expect(computeFast(), isTrue); | |
384 assertSuggestKeywords([]); | |
385 } | |
386 | |
387 test_assignment_field() { | |
388 addTestSource('class A {var foo = ^}'); | |
389 expect(computeFast(), isTrue); | |
390 assertSuggestKeywords(EXPRESSION_START_NO_INSTANCE); | |
391 } | |
392 | |
393 test_assignment_field2() { | |
394 addTestSource('class A {var foo = n^}'); | |
395 expect(computeFast(), isTrue); | |
396 assertSuggestKeywords(EXPRESSION_START_NO_INSTANCE); | |
397 } | |
398 | |
399 test_assignment_local() { | |
400 addTestSource('main() {var foo = ^}'); | |
401 expect(computeFast(), isTrue); | |
402 assertSuggestKeywords(EXPRESSION_START_NO_INSTANCE); | |
403 } | |
404 | |
405 test_assignment_local2() { | |
406 addTestSource('main() {var foo = n^}'); | |
407 expect(computeFast(), isTrue); | |
408 assertSuggestKeywords(EXPRESSION_START_NO_INSTANCE); | |
409 } | |
410 | |
411 test_assignment_local2_async() { | |
412 addTestSource('main() async {var foo = n^}'); | |
413 expect(computeFast(), isTrue); | |
414 assertSuggestKeywords(EXPRESSION_START_NO_INSTANCE, | |
415 pseudoKeywords: ['await']); | |
416 } | |
417 | |
418 test_assignment_local_async() { | |
419 addTestSource('main() async {var foo = ^}'); | |
420 expect(computeFast(), isTrue); | |
421 assertSuggestKeywords(EXPRESSION_START_NO_INSTANCE, | |
422 pseudoKeywords: ['await']); | |
423 } | |
424 | |
425 test_before_import() { | |
426 addTestSource('^ import foo;'); | |
427 expect(computeFast(), isTrue); | |
428 assertSuggestKeywords( | |
429 [Keyword.EXPORT, Keyword.IMPORT, Keyword.LIBRARY, Keyword.PART], | |
430 relevance: DART_RELEVANCE_HIGH); | |
431 } | |
432 | |
433 test_catch() { | |
434 addTestSource('main() {try {} catch (e) {^}}}'); | |
435 expect(computeFast(), isTrue); | |
436 var keywords = <Keyword>[]; | |
437 keywords.addAll(STMT_START_OUTSIDE_CLASS); | |
438 keywords.add(Keyword.RETHROW); | |
439 assertSuggestKeywords(keywords, relevance: DART_RELEVANCE_KEYWORD); | |
440 } | |
441 | |
442 test_class() { | |
443 addTestSource('class A e^ { }'); | |
444 expect(computeFast(), isTrue); | |
445 assertSuggestKeywords([Keyword.EXTENDS, Keyword.IMPLEMENTS], | |
446 relevance: DART_RELEVANCE_HIGH); | |
447 } | |
448 | |
449 test_class_body() { | |
450 addTestSource('class A {^}'); | |
451 expect(computeFast(), isTrue); | |
452 assertSuggestKeywords(CLASS_BODY_KEYWORDS); | |
453 } | |
454 | |
455 test_class_body_beginning() { | |
456 addTestSource('class A {^ var foo;}'); | |
457 expect(computeFast(), isTrue); | |
458 assertSuggestKeywords(CLASS_BODY_KEYWORDS); | |
459 } | |
460 | |
461 test_class_body_between() { | |
462 addTestSource('class A {var bar; ^ var foo;}'); | |
463 expect(computeFast(), isTrue); | |
464 assertSuggestKeywords(CLASS_BODY_KEYWORDS); | |
465 } | |
466 | |
467 test_class_body_end() { | |
468 addTestSource('class A {var foo; ^}'); | |
469 expect(computeFast(), isTrue); | |
470 assertSuggestKeywords(CLASS_BODY_KEYWORDS); | |
471 } | |
472 | |
473 test_class_extends() { | |
474 addTestSource('class A extends foo ^'); | |
475 expect(computeFast(), isTrue); | |
476 assertSuggestKeywords([Keyword.IMPLEMENTS, Keyword.WITH], | |
477 relevance: DART_RELEVANCE_HIGH); | |
478 } | |
479 | |
480 test_class_extends2() { | |
481 addTestSource('class A extends foo i^'); | |
482 expect(computeFast(), isTrue); | |
483 assertSuggestKeywords([Keyword.IMPLEMENTS, Keyword.WITH], | |
484 relevance: DART_RELEVANCE_HIGH); | |
485 } | |
486 | |
487 test_class_extends3() { | |
488 addTestSource('class A extends foo i^ { }'); | |
489 expect(computeFast(), isTrue); | |
490 assertSuggestKeywords([Keyword.IMPLEMENTS, Keyword.WITH], | |
491 relevance: DART_RELEVANCE_HIGH); | |
492 } | |
493 | |
494 test_class_extends_name() { | |
495 addTestSource('class A extends ^'); | |
496 expect(computeFast(), isTrue); | |
497 assertSuggestKeywords([]); | |
498 } | |
499 | |
500 test_class_implements() { | |
501 addTestSource('class A ^ implements foo'); | |
502 expect(computeFast(), isTrue); | |
503 assertSuggestKeywords([Keyword.EXTENDS], relevance: DART_RELEVANCE_HIGH); | |
504 } | |
505 | |
506 test_class_implements2() { | |
507 addTestSource('class A e^ implements foo'); | |
508 expect(computeFast(), isTrue); | |
509 // TODO (danrubel) refinement: don't suggest implements | |
510 assertSuggestKeywords([Keyword.EXTENDS, Keyword.IMPLEMENTS], | |
511 relevance: DART_RELEVANCE_HIGH); | |
512 } | |
513 | |
514 test_class_implements3() { | |
515 addTestSource('class A e^ implements foo { }'); | |
516 expect(computeFast(), isTrue); | |
517 // TODO (danrubel) refinement: don't suggest implements | |
518 assertSuggestKeywords([Keyword.EXTENDS, Keyword.IMPLEMENTS], | |
519 relevance: DART_RELEVANCE_HIGH); | |
520 } | |
521 | |
522 test_class_implements_name() { | |
523 addTestSource('class A implements ^'); | |
524 expect(computeFast(), isTrue); | |
525 assertSuggestKeywords([]); | |
526 } | |
527 | |
528 test_class_name() { | |
529 addTestSource('class ^'); | |
530 expect(computeFast(), isTrue); | |
531 assertSuggestKeywords([]); | |
532 } | |
533 | |
534 test_class_noBody() { | |
535 addTestSource('class A ^'); | |
536 expect(computeFast(), isTrue); | |
537 assertSuggestKeywords([Keyword.EXTENDS, Keyword.IMPLEMENTS], | |
538 relevance: DART_RELEVANCE_HIGH); | |
539 } | |
540 | |
541 test_class_noBody2() { | |
542 addTestSource('class A e^'); | |
543 expect(computeFast(), isTrue); | |
544 assertSuggestKeywords([Keyword.EXTENDS, Keyword.IMPLEMENTS], | |
545 relevance: DART_RELEVANCE_HIGH); | |
546 } | |
547 | |
548 test_class_noBody3() { | |
549 addTestSource('class A e^ String foo;'); | |
550 expect(computeFast(), isTrue); | |
551 assertSuggestKeywords([Keyword.EXTENDS, Keyword.IMPLEMENTS], | |
552 relevance: DART_RELEVANCE_HIGH); | |
553 } | |
554 | |
555 test_class_with() { | |
556 addTestSource('class A extends foo with bar ^'); | |
557 expect(computeFast(), isTrue); | |
558 assertSuggestKeywords([Keyword.IMPLEMENTS], relevance: DART_RELEVANCE_HIGH); | |
559 } | |
560 | |
561 test_class_with2() { | |
562 addTestSource('class A extends foo with bar i^'); | |
563 expect(computeFast(), isTrue); | |
564 assertSuggestKeywords([Keyword.IMPLEMENTS], relevance: DART_RELEVANCE_HIGH); | |
565 } | |
566 | |
567 test_class_with3() { | |
568 addTestSource('class A extends foo with bar i^ { }'); | |
569 expect(computeFast(), isTrue); | |
570 assertSuggestKeywords([Keyword.IMPLEMENTS], relevance: DART_RELEVANCE_HIGH); | |
571 } | |
572 | |
573 test_class_with_name() { | |
574 addTestSource('class A extends foo with ^'); | |
575 expect(computeFast(), isTrue); | |
576 assertSuggestKeywords([]); | |
577 } | |
578 | |
579 test_constructor_param() { | |
580 addTestSource('class A { A(^) {});}'); | |
581 expect(computeFast(), isTrue); | |
582 assertSuggestKeywords([Keyword.THIS]); | |
583 } | |
584 | |
585 test_constructor_param2() { | |
586 addTestSource('class A { A(t^) {});}'); | |
587 expect(computeFast(), isTrue); | |
588 assertSuggestKeywords([Keyword.THIS]); | |
589 } | |
590 | |
591 test_do_break_continue() { | |
592 addTestSource('main() {do {^} while (true);}'); | |
593 expect(computeFast(), isTrue); | |
594 assertSuggestKeywords(STMT_START_IN_LOOP_OUTSIDE_CLASS, | |
595 relevance: DART_RELEVANCE_KEYWORD); | |
596 } | |
597 | |
598 test_do_break_continue2() { | |
599 addTestSource('class A {foo() {do {^} while (true);}}'); | |
600 expect(computeFast(), isTrue); | |
601 assertSuggestKeywords(STMT_START_IN_LOOP_IN_CLASS, | |
602 relevance: DART_RELEVANCE_KEYWORD); | |
603 } | |
604 | |
605 test_empty() { | |
606 addTestSource('^'); | |
607 expect(computeFast(), isTrue); | |
608 assertSuggestKeywords(DIRECTIVE_DECLARATION_AND_LIBRARY_KEYWORDS, | |
609 relevance: DART_RELEVANCE_HIGH); | |
610 } | |
611 | |
612 test_for_break_continue() { | |
613 addTestSource('main() {for (int x in myList) {^}}'); | |
614 expect(computeFast(), isTrue); | |
615 assertSuggestKeywords(STMT_START_IN_LOOP_OUTSIDE_CLASS, | |
616 relevance: DART_RELEVANCE_KEYWORD); | |
617 } | |
618 | |
619 test_for_break_continue2() { | |
620 addTestSource('class A {foo() {for (int x in myList) {^}}}'); | |
621 expect(computeFast(), isTrue); | |
622 assertSuggestKeywords(STMT_START_IN_LOOP_IN_CLASS, | |
623 relevance: DART_RELEVANCE_KEYWORD); | |
624 } | |
625 | |
626 test_for_expression_in() { | |
627 addTestSource('main() {for (int x i^)}'); | |
628 expect(computeFast(), isTrue); | |
629 assertSuggestKeywords([Keyword.IN], relevance: DART_RELEVANCE_HIGH); | |
630 } | |
631 | |
632 test_for_expression_in2() { | |
633 addTestSource('main() {for (int x in^)}'); | |
634 expect(computeFast(), isTrue); | |
635 assertSuggestKeywords([Keyword.IN], relevance: DART_RELEVANCE_HIGH); | |
636 } | |
637 | |
638 test_for_expression_init() { | |
639 addTestSource('main() {for (int x = i^)}'); | |
640 expect(computeFast(), isTrue); | |
641 assertSuggestKeywords(EXPRESSION_START_NO_INSTANCE); | |
642 } | |
643 | |
644 test_for_expression_init2() { | |
645 addTestSource('main() {for (int x = in^)}'); | |
646 expect(computeFast(), isTrue); | |
647 assertSuggestKeywords(EXPRESSION_START_NO_INSTANCE); | |
648 } | |
649 | |
650 test_function_async() { | |
651 addTestSource('main()^'); | |
652 expect(computeFast(), isTrue); | |
653 assertSuggestKeywords(DECLARATION_KEYWORDS, | |
654 pseudoKeywords: ['async'], relevance: DART_RELEVANCE_HIGH); | |
655 } | |
656 | |
657 test_function_async2() { | |
658 addTestSource('main()^{}'); | |
659 expect(computeFast(), isTrue); | |
660 assertSuggestKeywords([], | |
661 pseudoKeywords: ['async'], relevance: DART_RELEVANCE_HIGH); | |
662 } | |
663 | |
664 test_function_async3() { | |
665 addTestSource('main()a^'); | |
666 expect(computeFast(), isTrue); | |
667 assertSuggestKeywords(DECLARATION_KEYWORDS, | |
668 pseudoKeywords: ['async'], relevance: DART_RELEVANCE_HIGH); | |
669 } | |
670 | |
671 test_function_async4() { | |
672 addTestSource('main()a^{}'); | |
673 expect(computeFast(), isTrue); | |
674 assertSuggestKeywords(DECLARATION_KEYWORDS, | |
675 pseudoKeywords: ['async'], relevance: DART_RELEVANCE_HIGH); | |
676 } | |
677 | |
678 test_function_async5() { | |
679 addTestSource('main()a^ Foo foo;'); | |
680 expect(computeFast(), isTrue); | |
681 assertSuggestKeywords(DECLARATION_KEYWORDS, | |
682 pseudoKeywords: ['async'], relevance: DART_RELEVANCE_HIGH); | |
683 } | |
684 | |
685 test_function_body_inClass_constructorInitializer() { | |
686 addTestSource(r''' | |
687 foo(p) {} | |
688 class A { | |
689 final f; | |
690 A() : f = foo(() {^}); | |
691 } | |
692 '''); | |
693 expect(computeFast(), isTrue); | |
694 assertSuggestKeywords(STMT_START_OUTSIDE_CLASS); | |
695 } | |
696 | |
697 test_function_body_inClass_constructorInitializer_async() { | |
698 addTestSource(r''' | |
699 foo(p) {} | |
700 class A { | |
701 final f; | |
702 A() : f = foo(() async {^}); | |
703 } | |
704 '''); | |
705 expect(computeFast(), isTrue); | |
706 assertSuggestKeywords(STMT_START_OUTSIDE_CLASS, pseudoKeywords: ['await']); | |
707 } | |
708 | |
709 test_function_body_inClass_field() { | |
710 addTestSource(r''' | |
711 class A { | |
712 var f = () {^}; | |
713 } | |
714 '''); | |
715 expect(computeFast(), isTrue); | |
716 assertSuggestKeywords(STMT_START_OUTSIDE_CLASS); | |
717 } | |
718 | |
719 test_function_body_inClass_methodBody() { | |
720 addTestSource(r''' | |
721 class A { | |
722 m() { | |
723 f() {^}; | |
724 } | |
725 } | |
726 '''); | |
727 expect(computeFast(), isTrue); | |
728 assertSuggestKeywords(STMT_START_IN_CLASS); | |
729 } | |
730 | |
731 test_function_body_inClass_methodBody_inFunction() { | |
732 addTestSource(r''' | |
733 class A { | |
734 m() { | |
735 f() { | |
736 f2() {^}; | |
737 }; | |
738 } | |
739 } | |
740 '''); | |
741 expect(computeFast(), isTrue); | |
742 assertSuggestKeywords(STMT_START_IN_CLASS); | |
743 } | |
744 | |
745 test_function_body_inClass_methodBody_inFunction_async() { | |
746 addTestSource(r''' | |
747 class A { | |
748 m() { | |
749 f() { | |
750 f2() async {^}; | |
751 }; | |
752 } | |
753 } | |
754 '''); | |
755 expect(computeFast(), isTrue); | |
756 assertSuggestKeywords(STMT_START_IN_CLASS, pseudoKeywords: ['await']); | |
757 } | |
758 | |
759 test_function_body_inUnit() { | |
760 addTestSource('main() {^}'); | |
761 expect(computeFast(), isTrue); | |
762 assertSuggestKeywords(STMT_START_OUTSIDE_CLASS); | |
763 } | |
764 | |
765 test_function_body_inUnit_afterBlock() { | |
766 addTestSource('main() {{}^}'); | |
767 expect(computeFast(), isTrue); | |
768 assertSuggestKeywords(STMT_START_OUTSIDE_CLASS); | |
769 } | |
770 | |
771 test_function_body_inUnit_async() { | |
772 addTestSource('main() async {^}'); | |
773 expect(computeFast(), isTrue); | |
774 assertSuggestKeywords(STMT_START_OUTSIDE_CLASS, pseudoKeywords: ['await']); | |
775 } | |
776 | |
777 test_if_expression_in_class() { | |
778 addTestSource('class A {foo() {if (^) }}'); | |
779 expect(computeFast(), isTrue); | |
780 assertSuggestKeywords(EXPRESSION_START_INSTANCE); | |
781 } | |
782 | |
783 test_if_expression_in_class2() { | |
784 addTestSource('class A {foo() {if (n^) }}'); | |
785 expect(computeFast(), isTrue); | |
786 assertSuggestKeywords(EXPRESSION_START_INSTANCE); | |
787 } | |
788 | |
789 test_if_expression_in_function() { | |
790 addTestSource('foo() {if (^) }'); | |
791 expect(computeFast(), isTrue); | |
792 assertSuggestKeywords(EXPRESSION_START_NO_INSTANCE); | |
793 } | |
794 | |
795 test_if_expression_in_function2() { | |
796 addTestSource('foo() {if (n^) }'); | |
797 expect(computeFast(), isTrue); | |
798 assertSuggestKeywords(EXPRESSION_START_NO_INSTANCE); | |
799 } | |
800 | |
801 test_if_in_class() { | |
802 addTestSource('class A {foo() {if (true) ^}}'); | |
803 expect(computeFast(), isTrue); | |
804 assertSuggestKeywords(STMT_START_IN_CLASS); | |
805 } | |
806 | |
807 test_if_in_class2() { | |
808 addTestSource('class A {foo() {if (true) ^;}}'); | |
809 expect(computeFast(), isTrue); | |
810 assertSuggestKeywords(STMT_START_IN_CLASS); | |
811 } | |
812 | |
813 test_if_in_class3() { | |
814 addTestSource('class A {foo() {if (true) r^;}}'); | |
815 expect(computeFast(), isTrue); | |
816 assertSuggestKeywords(STMT_START_IN_CLASS); | |
817 } | |
818 | |
819 test_if_in_class4() { | |
820 addTestSource('class A {foo() {if (true) ^ go();}}'); | |
821 expect(computeFast(), isTrue); | |
822 assertSuggestKeywords(STMT_START_IN_CLASS); | |
823 } | |
824 | |
825 test_if_outside_class() { | |
826 addTestSource('foo() {if (true) ^}'); | |
827 expect(computeFast(), isTrue); | |
828 assertSuggestKeywords(STMT_START_OUTSIDE_CLASS); | |
829 } | |
830 | |
831 test_if_outside_class2() { | |
832 addTestSource('foo() {if (true) ^;}'); | |
833 expect(computeFast(), isTrue); | |
834 assertSuggestKeywords(STMT_START_OUTSIDE_CLASS); | |
835 } | |
836 | |
837 test_if_outside_class3() { | |
838 addTestSource('foo() {if (true) r^;}'); | |
839 expect(computeFast(), isTrue); | |
840 assertSuggestKeywords(STMT_START_OUTSIDE_CLASS); | |
841 } | |
842 | |
843 test_if_outside_class4() { | |
844 addTestSource('foo() {if (true) ^ go();}'); | |
845 expect(computeFast(), isTrue); | |
846 assertSuggestKeywords(STMT_START_OUTSIDE_CLASS); | |
847 } | |
848 | |
849 test_import() { | |
850 addTestSource('import "foo" deferred as foo ^;'); | |
851 expect(computeFast(), isTrue); | |
852 assertSuggestKeywords([], | |
853 pseudoKeywords: ['show', 'hide'], relevance: DART_RELEVANCE_HIGH); | |
854 } | |
855 | |
856 test_import_as() { | |
857 addTestSource('import "foo" deferred ^;'); | |
858 expect(computeFast(), isTrue); | |
859 assertSuggestKeywords([Keyword.AS], relevance: DART_RELEVANCE_HIGH); | |
860 } | |
861 | |
862 test_import_as2() { | |
863 addTestSource('import "foo" deferred a^;'); | |
864 expect(computeFast(), isTrue); | |
865 assertSuggestKeywords([Keyword.AS], relevance: DART_RELEVANCE_HIGH); | |
866 } | |
867 | |
868 test_import_as3() { | |
869 addTestSource('import "foo" deferred a^'); | |
870 expect(computeFast(), isTrue); | |
871 assertSuggestKeywords([Keyword.AS], relevance: DART_RELEVANCE_HIGH); | |
872 } | |
873 | |
874 test_import_deferred() { | |
875 addTestSource('import "foo" ^ as foo;'); | |
876 expect(computeFast(), isTrue); | |
877 assertSuggestKeywords([Keyword.DEFERRED], relevance: DART_RELEVANCE_HIGH); | |
878 } | |
879 | |
880 test_import_deferred2() { | |
881 addTestSource('import "foo" d^ as foo;'); | |
882 expect(computeFast(), isTrue); | |
883 assertSuggestKeywords([Keyword.DEFERRED], relevance: DART_RELEVANCE_HIGH); | |
884 } | |
885 | |
886 test_import_deferred3() { | |
887 addTestSource('import "foo" d^ show foo;'); | |
888 expect(computeFast(), isTrue); | |
889 assertSuggestKeywords([Keyword.AS], | |
890 pseudoKeywords: ['deferred as'], relevance: DART_RELEVANCE_HIGH); | |
891 } | |
892 | |
893 test_import_deferred4() { | |
894 addTestSource('import "foo" d^ hide foo;'); | |
895 expect(computeFast(), isTrue); | |
896 assertSuggestKeywords([Keyword.AS], | |
897 pseudoKeywords: ['deferred as'], relevance: DART_RELEVANCE_HIGH); | |
898 } | |
899 | |
900 test_import_deferred5() { | |
901 addTestSource('import "foo" d^'); | |
902 expect(computeFast(), isTrue); | |
903 assertSuggestKeywords([Keyword.AS], | |
904 pseudoKeywords: ['deferred as', 'show', 'hide'], | |
905 relevance: DART_RELEVANCE_HIGH); | |
906 } | |
907 | |
908 test_import_deferred6() { | |
909 addTestSource('import "foo" d^ import'); | |
910 expect(computeFast(), isTrue); | |
911 assertSuggestKeywords([Keyword.AS], | |
912 pseudoKeywords: ['deferred as', 'show', 'hide'], | |
913 relevance: DART_RELEVANCE_HIGH); | |
914 } | |
915 | |
916 test_import_deferred_as() { | |
917 addTestSource('import "foo" ^;'); | |
918 expect(computeFast(), isTrue); | |
919 assertSuggestKeywords([Keyword.AS], | |
920 pseudoKeywords: ['deferred as', 'show', 'hide'], | |
921 relevance: DART_RELEVANCE_HIGH); | |
922 } | |
923 | |
924 test_import_deferred_as2() { | |
925 addTestSource('import "foo" d^;'); | |
926 expect(computeFast(), isTrue); | |
927 assertSuggestKeywords([Keyword.AS], | |
928 pseudoKeywords: ['deferred as', 'show', 'hide'], | |
929 relevance: DART_RELEVANCE_HIGH); | |
930 } | |
931 | |
932 test_import_deferred_as3() { | |
933 addTestSource('import "foo" ^'); | |
934 expect(computeFast(), isTrue); | |
935 assertSuggestKeywords([Keyword.AS], | |
936 pseudoKeywords: ['deferred as', 'show', 'hide'], | |
937 relevance: DART_RELEVANCE_HIGH); | |
938 } | |
939 | |
940 test_import_deferred_as4() { | |
941 addTestSource('import "foo" d^'); | |
942 expect(computeFast(), isTrue); | |
943 assertSuggestKeywords([Keyword.AS], | |
944 pseudoKeywords: ['deferred as', 'show', 'hide'], | |
945 relevance: DART_RELEVANCE_HIGH); | |
946 } | |
947 | |
948 test_import_deferred_as5() { | |
949 addTestSource('import "foo" sh^ import "bar"; import "baz";'); | |
950 expect(computeFast(), isTrue); | |
951 assertSuggestKeywords([Keyword.AS], | |
952 pseudoKeywords: ['deferred as', 'show', 'hide'], | |
953 relevance: DART_RELEVANCE_HIGH); | |
954 } | |
955 | |
956 test_import_deferred_not() { | |
957 addTestSource('import "foo" as foo ^;'); | |
958 expect(computeFast(), isTrue); | |
959 assertSuggestKeywords([], | |
960 pseudoKeywords: ['show', 'hide'], relevance: DART_RELEVANCE_HIGH); | |
961 } | |
962 | |
963 test_import_deferred_partial() { | |
964 addTestSource('import "package:foo/foo.dart" def^ as foo;'); | |
965 expect(computeFast(), isTrue); | |
966 assertSuggestKeywords([Keyword.DEFERRED], relevance: DART_RELEVANCE_HIGH); | |
967 expect(request.replacementOffset, 30); | |
968 expect(request.replacementLength, 3); | |
969 } | |
970 | |
971 test_import_incomplete() { | |
972 addTestSource('import "^"'); | |
973 expect(computeFast(), isTrue); | |
974 assertNoSuggestions(); | |
975 } | |
976 | |
977 test_import_partial() { | |
978 addTestSource('imp^ import "package:foo/foo.dart"; import "bar.dart";'); | |
979 expect(computeFast(), isTrue); | |
980 // TODO(danrubel) should not suggest declaration keywords | |
981 assertSuggestKeywords(DIRECTIVE_DECLARATION_AND_LIBRARY_KEYWORDS, | |
982 relevance: DART_RELEVANCE_HIGH); | |
983 expect(request.replacementOffset, 0); | |
984 expect(request.replacementLength, 3); | |
985 } | |
986 | |
987 test_import_partial2() { | |
988 addTestSource('^imp import "package:foo/foo.dart";'); | |
989 expect(computeFast(), isTrue); | |
990 // TODO(danrubel) should not suggest declaration keywords | |
991 assertSuggestKeywords(DIRECTIVE_DECLARATION_AND_LIBRARY_KEYWORDS, | |
992 relevance: DART_RELEVANCE_HIGH); | |
993 expect(request.replacementOffset, 0); | |
994 expect(request.replacementLength, 3); | |
995 } | |
996 | |
997 test_import_partial3() { | |
998 addTestSource(' ^imp import "package:foo/foo.dart"; import "bar.dart";'); | |
999 expect(computeFast(), isTrue); | |
1000 // TODO(danrubel) should not suggest declaration keywords | |
1001 assertSuggestKeywords(DIRECTIVE_DECLARATION_AND_LIBRARY_KEYWORDS, | |
1002 relevance: DART_RELEVANCE_HIGH); | |
1003 expect(request.replacementOffset, 1); | |
1004 expect(request.replacementLength, 3); | |
1005 } | |
1006 | |
1007 test_import_partial4() { | |
1008 addTestSource('^ imp import "package:foo/foo.dart";'); | |
1009 expect(computeFast(), isTrue); | |
1010 // TODO(danrubel) should not suggest declaration keywords | |
1011 assertSuggestKeywords(DIRECTIVE_DECLARATION_AND_LIBRARY_KEYWORDS, | |
1012 relevance: DART_RELEVANCE_HIGH); | |
1013 expect(request.replacementOffset, 0); | |
1014 expect(request.replacementLength, 0); | |
1015 } | |
1016 | |
1017 test_import_partial5() { | |
1018 addTestSource('library libA; imp^ import "package:foo/foo.dart";'); | |
1019 expect(computeFast(), isTrue); | |
1020 // TODO(danrubel) should not suggest declaration keywords | |
1021 assertSuggestKeywords(DIRECTIVE_AND_DECLARATION_KEYWORDS, | |
1022 relevance: DART_RELEVANCE_HIGH); | |
1023 expect(request.replacementOffset, 14); | |
1024 expect(request.replacementLength, 3); | |
1025 } | |
1026 | |
1027 test_import_partial6() { | |
1028 addTestSource( | |
1029 'library bar; import "zoo.dart"; imp^ import "package:foo/foo.dart";'); | |
1030 expect(computeFast(), isTrue); | |
1031 // TODO(danrubel) should not suggest declaration keywords | |
1032 assertSuggestKeywords(DIRECTIVE_AND_DECLARATION_KEYWORDS, | |
1033 relevance: DART_RELEVANCE_HIGH); | |
1034 expect(request.replacementOffset, 32); | |
1035 expect(request.replacementLength, 3); | |
1036 } | |
1037 | |
1038 test_inComment_block() { | |
1039 addTestSource(''' | |
1040 main() { | |
1041 /* text ^ */ | |
1042 print(42); | |
1043 } | |
1044 '''); | |
1045 expect(computeFast(), isTrue); | |
1046 assertNoSuggestions(); | |
1047 } | |
1048 | |
1049 test_inComment_endOfLine() { | |
1050 addTestSource(''' | |
1051 main() { | |
1052 // text ^ | |
1053 } | |
1054 '''); | |
1055 expect(computeFast(), isTrue); | |
1056 assertNoSuggestions(); | |
1057 } | |
1058 | |
1059 test_is_expression() { | |
1060 addTestSource('main() {if (x is^)}'); | |
1061 expect(computeFast(), isTrue); | |
1062 assertSuggestKeywords([Keyword.IS], relevance: DART_RELEVANCE_HIGH); | |
1063 } | |
1064 | |
1065 test_library() { | |
1066 addTestSource('library foo;^'); | |
1067 expect(computeFast(), isTrue); | |
1068 assertSuggestKeywords(DIRECTIVE_AND_DECLARATION_KEYWORDS, | |
1069 relevance: DART_RELEVANCE_HIGH); | |
1070 } | |
1071 | |
1072 test_library_declaration() { | |
1073 addTestSource('library ^'); | |
1074 expect(computeFast(), isTrue); | |
1075 assertSuggestKeywords([]); | |
1076 } | |
1077 | |
1078 test_library_declaration2() { | |
1079 addTestSource('library a^'); | |
1080 expect(computeFast(), isTrue); | |
1081 assertSuggestKeywords([]); | |
1082 } | |
1083 | |
1084 test_library_declaration3() { | |
1085 addTestSource('library a.^'); | |
1086 expect(computeFast(), isTrue); | |
1087 assertSuggestKeywords([]); | |
1088 } | |
1089 | |
1090 test_library_name() { | |
1091 addTestSource('library ^'); | |
1092 expect(computeFast(), isTrue); | |
1093 assertSuggestKeywords([]); | |
1094 } | |
1095 | |
1096 test_method_async() { | |
1097 addTestSource('class A { foo() ^}'); | |
1098 expect(computeFast(), isTrue); | |
1099 assertSuggestKeywords(CLASS_BODY_KEYWORDS, pseudoKeywords: ['async']); | |
1100 } | |
1101 | |
1102 test_method_async2() { | |
1103 addTestSource('class A { foo() ^{}}'); | |
1104 expect(computeFast(), isTrue); | |
1105 assertSuggestKeywords([], | |
1106 pseudoKeywords: ['async'], relevance: DART_RELEVANCE_HIGH); | |
1107 } | |
1108 | |
1109 test_method_async3() { | |
1110 addTestSource('class A { foo() a^}'); | |
1111 expect(computeFast(), isTrue); | |
1112 assertSuggestKeywords(CLASS_BODY_KEYWORDS, pseudoKeywords: ['async']); | |
1113 } | |
1114 | |
1115 test_method_async4() { | |
1116 addTestSource('class A { foo() a^{}}'); | |
1117 expect(computeFast(), isTrue); | |
1118 assertSuggestKeywords(CLASS_BODY_KEYWORDS, pseudoKeywords: ['async']); | |
1119 } | |
1120 | |
1121 test_method_async5() { | |
1122 addTestSource('class A { foo() ^ Foo foo;}'); | |
1123 expect(computeFast(), isTrue); | |
1124 assertSuggestKeywords(CLASS_BODY_KEYWORDS, pseudoKeywords: ['async']); | |
1125 } | |
1126 | |
1127 test_method_async6() { | |
1128 addTestSource('class A { foo() a^ Foo foo;}'); | |
1129 expect(computeFast(), isTrue); | |
1130 assertSuggestKeywords(CLASS_BODY_KEYWORDS, pseudoKeywords: ['async']); | |
1131 } | |
1132 | |
1133 test_method_async7() { | |
1134 addTestSource('class A { foo() ^ => Foo foo;}'); | |
1135 expect(computeFast(), isTrue); | |
1136 assertSuggestKeywords([], | |
1137 pseudoKeywords: ['async'], relevance: DART_RELEVANCE_HIGH); | |
1138 } | |
1139 | |
1140 test_method_async8() { | |
1141 addTestSource('class A { foo() a^ Foo foo;}'); | |
1142 expect(computeFast(), isTrue); | |
1143 assertSuggestKeywords(CLASS_BODY_KEYWORDS, pseudoKeywords: ['async']); | |
1144 } | |
1145 | |
1146 test_method_body() { | |
1147 addTestSource('class A { foo() {^}}'); | |
1148 expect(computeFast(), isTrue); | |
1149 assertSuggestKeywords(STMT_START_IN_CLASS); | |
1150 } | |
1151 | |
1152 test_method_body2() { | |
1153 addTestSource('class A { foo() => ^}'); | |
1154 expect(computeFast(), isTrue); | |
1155 assertSuggestKeywords(EXPRESSION_START_INSTANCE); | |
1156 } | |
1157 | |
1158 test_method_body3() { | |
1159 addTestSource('class A { foo() => ^ Foo foo;}'); | |
1160 expect(computeFast(), isTrue); | |
1161 assertSuggestKeywords(EXPRESSION_START_INSTANCE); | |
1162 } | |
1163 | |
1164 test_method_body4() { | |
1165 addTestSource('class A { foo() => ^;}'); | |
1166 expect(computeFast(), isTrue); | |
1167 assertSuggestKeywords(EXPRESSION_START_INSTANCE); | |
1168 } | |
1169 | |
1170 test_method_body_async() { | |
1171 addTestSource('class A { foo() async {^}}'); | |
1172 expect(computeFast(), isTrue); | |
1173 assertSuggestKeywords(STMT_START_IN_CLASS, pseudoKeywords: ['await']); | |
1174 } | |
1175 | |
1176 test_method_body_async2() { | |
1177 addTestSource('class A { foo() async => ^}'); | |
1178 expect(computeFast(), isTrue); | |
1179 assertSuggestKeywords(EXPRESSION_START_INSTANCE, pseudoKeywords: ['await']); | |
1180 } | |
1181 | |
1182 test_method_body_async3() { | |
1183 addTestSource('class A { foo() async => ^ Foo foo;}'); | |
1184 expect(computeFast(), isTrue); | |
1185 assertSuggestKeywords(EXPRESSION_START_INSTANCE, pseudoKeywords: ['await']); | |
1186 } | |
1187 | |
1188 test_method_body_async4() { | |
1189 addTestSource('class A { foo() async => ^;}'); | |
1190 expect(computeFast(), isTrue); | |
1191 assertSuggestKeywords(EXPRESSION_START_INSTANCE, pseudoKeywords: ['await']); | |
1192 } | |
1193 | |
1194 test_method_body_expression1() { | |
1195 addTestSource('class A { foo() {return b == true ? ^}}'); | |
1196 expect(computeFast(), isTrue); | |
1197 assertSuggestKeywords(EXPRESSION_START_INSTANCE); | |
1198 } | |
1199 | |
1200 test_method_body_expression2() { | |
1201 addTestSource('class A { foo() {return b == true ? 1 : ^}}'); | |
1202 expect(computeFast(), isTrue); | |
1203 assertSuggestKeywords(EXPRESSION_START_INSTANCE); | |
1204 } | |
1205 | |
1206 test_method_body_return() { | |
1207 addTestSource('class A { foo() {return ^}}'); | |
1208 expect(computeFast(), isTrue); | |
1209 assertSuggestKeywords(EXPRESSION_START_INSTANCE); | |
1210 } | |
1211 | |
1212 test_method_param() { | |
1213 addTestSource('class A { foo(^) {});}'); | |
1214 expect(computeFast(), isTrue); | |
1215 assertNoSuggestions(); | |
1216 } | |
1217 | |
1218 test_method_param2() { | |
1219 addTestSource('class A { foo(t^) {});}'); | |
1220 expect(computeFast(), isTrue); | |
1221 assertNoSuggestions(); | |
1222 } | |
1223 | |
1224 test_named_constructor_invocation() { | |
1225 addTestSource('void main() {new Future.^}'); | |
1226 expect(computeFast(), isTrue); | |
1227 assertSuggestKeywords([]); | |
1228 } | |
1229 | |
1230 test_newInstance() { | |
1231 addTestSource('class A { foo() {new ^}}'); | |
1232 expect(computeFast(), isTrue); | |
1233 assertSuggestKeywords([]); | |
1234 } | |
1235 | |
1236 test_newInstance2() { | |
1237 addTestSource('class A { foo() {new ^ print("foo");}}'); | |
1238 expect(computeFast(), isTrue); | |
1239 assertSuggestKeywords([]); | |
1240 } | |
1241 | |
1242 test_newInstance_prefixed() { | |
1243 addTestSource('class A { foo() {new A.^}}'); | |
1244 expect(computeFast(), isTrue); | |
1245 assertSuggestKeywords([]); | |
1246 } | |
1247 | |
1248 test_newInstance_prefixed2() { | |
1249 addTestSource('class A { foo() {new A.^ print("foo");}}'); | |
1250 expect(computeFast(), isTrue); | |
1251 assertSuggestKeywords([]); | |
1252 } | |
1253 | |
1254 test_part_of() { | |
1255 addTestSource('part of foo;^'); | |
1256 expect(computeFast(), isTrue); | |
1257 assertSuggestKeywords(DIRECTIVE_AND_DECLARATION_KEYWORDS, | |
1258 relevance: DART_RELEVANCE_HIGH); | |
1259 } | |
1260 | |
1261 test_partial_class() { | |
1262 addTestSource('cl^'); | |
1263 expect(computeFast(), isTrue); | |
1264 assertSuggestKeywords(DIRECTIVE_DECLARATION_AND_LIBRARY_KEYWORDS, | |
1265 relevance: DART_RELEVANCE_HIGH); | |
1266 } | |
1267 | |
1268 test_partial_class2() { | |
1269 addTestSource('library a; cl^'); | |
1270 expect(computeFast(), isTrue); | |
1271 assertSuggestKeywords(DIRECTIVE_AND_DECLARATION_KEYWORDS, | |
1272 relevance: DART_RELEVANCE_HIGH); | |
1273 } | |
1274 | |
1275 test_prefixed_field() { | |
1276 addTestSource('class A { int x; foo() {x.^}}'); | |
1277 expect(computeFast(), isTrue); | |
1278 assertSuggestKeywords([]); | |
1279 } | |
1280 | |
1281 test_prefixed_field2() { | |
1282 addTestSource('class A { int x; foo() {x.^ print("foo");}}'); | |
1283 expect(computeFast(), isTrue); | |
1284 assertSuggestKeywords([]); | |
1285 } | |
1286 | |
1287 test_prefixed_library() { | |
1288 addTestSource('import "b" as b; class A { foo() {b.^}}'); | |
1289 expect(computeFast(), isTrue); | |
1290 assertSuggestKeywords([]); | |
1291 } | |
1292 | |
1293 test_prefixed_local() { | |
1294 addTestSource('class A { foo() {int x; x.^}}'); | |
1295 expect(computeFast(), isTrue); | |
1296 assertSuggestKeywords([]); | |
1297 } | |
1298 | |
1299 test_prefixed_local2() { | |
1300 addTestSource('class A { foo() {int x; x.^ print("foo");}}'); | |
1301 expect(computeFast(), isTrue); | |
1302 assertSuggestKeywords([]); | |
1303 } | |
1304 | |
1305 test_property_access() { | |
1306 addTestSource('class A { get x => 7; foo() {new A().^}}'); | |
1307 expect(computeFast(), isTrue); | |
1308 assertSuggestKeywords([]); | |
1309 } | |
1310 | |
1311 test_switch_expression() { | |
1312 addTestSource('main() {switch(^) {}}'); | |
1313 expect(computeFast(), isTrue); | |
1314 assertSuggestKeywords(EXPRESSION_START_NO_INSTANCE); | |
1315 } | |
1316 | |
1317 test_switch_expression2() { | |
1318 addTestSource('main() {switch(n^) {}}'); | |
1319 expect(computeFast(), isTrue); | |
1320 assertSuggestKeywords(EXPRESSION_START_NO_INSTANCE); | |
1321 } | |
1322 | |
1323 test_switch_expression3() { | |
1324 addTestSource('main() {switch(n^)}'); | |
1325 expect(computeFast(), isTrue); | |
1326 assertSuggestKeywords(EXPRESSION_START_NO_INSTANCE); | |
1327 } | |
1328 | |
1329 test_switch_start() { | |
1330 addTestSource('main() {switch(1) {^}}'); | |
1331 expect(computeFast(), isTrue); | |
1332 assertSuggestKeywords([Keyword.CASE, Keyword.DEFAULT], | |
1333 relevance: DART_RELEVANCE_HIGH); | |
1334 } | |
1335 | |
1336 test_switch_start2() { | |
1337 addTestSource('main() {switch(1) {^ case 1:}}'); | |
1338 expect(computeFast(), isTrue); | |
1339 assertSuggestKeywords([Keyword.CASE, Keyword.DEFAULT], | |
1340 relevance: DART_RELEVANCE_HIGH); | |
1341 } | |
1342 | |
1343 test_switch_start3() { | |
1344 addTestSource('main() {switch(1) {^default:}}'); | |
1345 expect(computeFast(), isTrue); | |
1346 assertSuggestKeywords([Keyword.CASE, Keyword.DEFAULT], | |
1347 relevance: DART_RELEVANCE_HIGH); | |
1348 } | |
1349 | |
1350 test_switch_start4() { | |
1351 addTestSource('main() {switch(1) {^ default:}}'); | |
1352 expect(computeFast(), isTrue); | |
1353 assertSuggestKeywords([Keyword.CASE, Keyword.DEFAULT], | |
1354 relevance: DART_RELEVANCE_HIGH); | |
1355 } | |
1356 | |
1357 test_switch_start5() { | |
1358 addTestSource('main() {switch(1) {c^ default:}}'); | |
1359 expect(computeFast(), isTrue); | |
1360 assertSuggestKeywords([Keyword.CASE, Keyword.DEFAULT], | |
1361 relevance: DART_RELEVANCE_HIGH); | |
1362 expect(request.replacementOffset, 19); | |
1363 expect(request.replacementLength, 1); | |
1364 } | |
1365 | |
1366 test_switch_start6() { | |
1367 addTestSource('main() {switch(1) {c^}}'); | |
1368 expect(computeFast(), isTrue); | |
1369 assertSuggestKeywords([Keyword.CASE, Keyword.DEFAULT], | |
1370 relevance: DART_RELEVANCE_HIGH); | |
1371 expect(request.replacementOffset, 19); | |
1372 expect(request.replacementLength, 1); | |
1373 } | |
1374 | |
1375 test_switch_start7() { | |
1376 addTestSource('main() {switch(1) { c^ }}'); | |
1377 expect(computeFast(), isTrue); | |
1378 assertSuggestKeywords([Keyword.CASE, Keyword.DEFAULT], | |
1379 relevance: DART_RELEVANCE_HIGH); | |
1380 expect(request.replacementOffset, 20); | |
1381 expect(request.replacementLength, 1); | |
1382 } | |
1383 | |
1384 test_switch_statement() { | |
1385 addTestSource('main() {switch(1) {case 1:^}}'); | |
1386 expect(computeFast(), isTrue); | |
1387 assertSuggestKeywords(STMT_START_IN_SWITCH_OUTSIDE_CLASS); | |
1388 } | |
1389 | |
1390 test_switch_statement2() { | |
1391 addTestSource('class A{foo() {switch(1) {case 1:^}}}'); | |
1392 expect(computeFast(), isTrue); | |
1393 assertSuggestKeywords(STMT_START_IN_SWITCH_IN_CLASS); | |
1394 } | |
1395 | |
1396 test_while_break_continue() { | |
1397 addTestSource('main() {while (true) {^}}'); | |
1398 expect(computeFast(), isTrue); | |
1399 assertSuggestKeywords(STMT_START_IN_LOOP_OUTSIDE_CLASS, | |
1400 relevance: DART_RELEVANCE_KEYWORD); | |
1401 } | |
1402 | |
1403 test_while_break_continue2() { | |
1404 addTestSource('class A {foo() {while (true) {^}}}'); | |
1405 expect(computeFast(), isTrue); | |
1406 assertSuggestKeywords(STMT_START_IN_LOOP_IN_CLASS, | |
1407 relevance: DART_RELEVANCE_KEYWORD); | |
1408 } | |
1409 | |
1410 void _appendCompletions( | |
1411 StringBuffer msg, Iterable<String> completions, Iterable<String> other) { | |
1412 List<String> sorted = completions.toList(); | |
1413 sorted.sort((c1, c2) => c1.compareTo(c2)); | |
1414 sorted.forEach( | |
1415 (c) => msg.writeln(' $c, ${other.contains(c) ? '' : '<<<<<<<<<<<'}')); | |
1416 } | |
1417 | |
1418 bool _equalSets(Iterable<String> iter1, Iterable<String> iter2) { | |
1419 if (iter1.length != iter2.length) return false; | |
1420 if (iter1.any((c) => !iter2.contains(c))) return false; | |
1421 if (iter2.any((c) => !iter1.contains(c))) return false; | |
1422 return true; | |
1423 } | |
1424 } | |
OLD | NEW |