diff options
-rw-r--r-- | crates/ide_completion/src/completions/attribute.rs | 407 |
1 files changed, 399 insertions, 8 deletions
diff --git a/crates/ide_completion/src/completions/attribute.rs b/crates/ide_completion/src/completions/attribute.rs index 246a3270a..79a9c6d87 100644 --- a/crates/ide_completion/src/completions/attribute.rs +++ b/crates/ide_completion/src/completions/attribute.rs | |||
@@ -19,10 +19,6 @@ mod lint; | |||
19 | pub(crate) use self::lint::LintCompletion; | 19 | pub(crate) use self::lint::LintCompletion; |
20 | 20 | ||
21 | pub(crate) fn complete_attribute(acc: &mut Completions, ctx: &CompletionContext) -> Option<()> { | 21 | pub(crate) fn complete_attribute(acc: &mut Completions, ctx: &CompletionContext) -> Option<()> { |
22 | if ctx.mod_declaration_under_caret.is_some() { | ||
23 | return None; | ||
24 | } | ||
25 | |||
26 | let attribute = ctx.attribute_under_caret.as_ref()?; | 22 | let attribute = ctx.attribute_under_caret.as_ref()?; |
27 | match (attribute.path().and_then(|p| p.as_single_name_ref()), attribute.token_tree()) { | 23 | match (attribute.path().and_then(|p| p.as_single_name_ref()), attribute.token_tree()) { |
28 | (Some(path), Some(token_tree)) => match path.text().as_str() { | 24 | (Some(path), Some(token_tree)) => match path.text().as_str() { |
@@ -323,12 +319,280 @@ mod tests { | |||
323 | } | 319 | } |
324 | 320 | ||
325 | #[test] | 321 | #[test] |
322 | fn complete_attribute_on_source_file() { | ||
323 | check( | ||
324 | r#"#![$0]"#, | ||
325 | expect![[r#" | ||
326 | at allow(…) | ||
327 | at cfg(…) | ||
328 | at cfg_attr(…) | ||
329 | at deny(…) | ||
330 | at forbid(…) | ||
331 | at warn(…) | ||
332 | at deprecated | ||
333 | at doc = "…" | ||
334 | at doc(hidden) | ||
335 | at doc(alias = "…") | ||
336 | at must_use | ||
337 | at no_mangle | ||
338 | at crate_name = "" | ||
339 | at feature(…) | ||
340 | at no_implicit_prelude | ||
341 | at no_main | ||
342 | at no_std | ||
343 | at recursion_limit = … | ||
344 | at type_length_limit = … | ||
345 | at windows_subsystem = "…" | ||
346 | "#]], | ||
347 | ); | ||
348 | } | ||
349 | |||
350 | #[test] | ||
351 | fn complete_attribute_on_module() { | ||
352 | check( | ||
353 | r#"#[$0] mod foo;"#, | ||
354 | expect![[r#" | ||
355 | at allow(…) | ||
356 | at cfg(…) | ||
357 | at cfg_attr(…) | ||
358 | at deny(…) | ||
359 | at forbid(…) | ||
360 | at warn(…) | ||
361 | at deprecated | ||
362 | at doc = "…" | ||
363 | at doc(hidden) | ||
364 | at doc(alias = "…") | ||
365 | at must_use | ||
366 | at no_mangle | ||
367 | at path = "…" | ||
368 | "#]], | ||
369 | ); | ||
370 | check( | ||
371 | r#"mod foo {#![$0]}"#, | ||
372 | expect![[r#" | ||
373 | at allow(…) | ||
374 | at cfg(…) | ||
375 | at cfg_attr(…) | ||
376 | at deny(…) | ||
377 | at forbid(…) | ||
378 | at warn(…) | ||
379 | at deprecated | ||
380 | at doc = "…" | ||
381 | at doc(hidden) | ||
382 | at doc(alias = "…") | ||
383 | at must_use | ||
384 | at no_mangle | ||
385 | at no_implicit_prelude | ||
386 | "#]], | ||
387 | ); | ||
388 | } | ||
389 | |||
390 | #[test] | ||
391 | fn complete_attribute_on_macro_rules() { | ||
392 | check( | ||
393 | r#"#[$0] macro_rules! foo {}"#, | ||
394 | expect![[r#" | ||
395 | at allow(…) | ||
396 | at cfg(…) | ||
397 | at cfg_attr(…) | ||
398 | at deny(…) | ||
399 | at forbid(…) | ||
400 | at warn(…) | ||
401 | at deprecated | ||
402 | at doc = "…" | ||
403 | at doc(hidden) | ||
404 | at doc(alias = "…") | ||
405 | at must_use | ||
406 | at no_mangle | ||
407 | at macro_export | ||
408 | at macro_use | ||
409 | "#]], | ||
410 | ); | ||
411 | } | ||
412 | |||
413 | #[test] | ||
414 | fn complete_attribute_on_macro_def() { | ||
415 | check( | ||
416 | r#"#[$0] macro foo {}"#, | ||
417 | expect![[r#" | ||
418 | at allow(…) | ||
419 | at cfg(…) | ||
420 | at cfg_attr(…) | ||
421 | at deny(…) | ||
422 | at forbid(…) | ||
423 | at warn(…) | ||
424 | at deprecated | ||
425 | at doc = "…" | ||
426 | at doc(hidden) | ||
427 | at doc(alias = "…") | ||
428 | at must_use | ||
429 | at no_mangle | ||
430 | "#]], | ||
431 | ); | ||
432 | } | ||
433 | |||
434 | #[test] | ||
435 | fn complete_attribute_on_extern_crate() { | ||
436 | check( | ||
437 | r#"#[$0] extern crate foo;"#, | ||
438 | expect![[r#" | ||
439 | at allow(…) | ||
440 | at cfg(…) | ||
441 | at cfg_attr(…) | ||
442 | at deny(…) | ||
443 | at forbid(…) | ||
444 | at warn(…) | ||
445 | at deprecated | ||
446 | at doc = "…" | ||
447 | at doc(hidden) | ||
448 | at doc(alias = "…") | ||
449 | at must_use | ||
450 | at no_mangle | ||
451 | at macro_use | ||
452 | "#]], | ||
453 | ); | ||
454 | } | ||
455 | |||
456 | #[test] | ||
457 | fn complete_attribute_on_use() { | ||
458 | check( | ||
459 | r#"#[$0] use foo;"#, | ||
460 | expect![[r#" | ||
461 | at allow(…) | ||
462 | at cfg(…) | ||
463 | at cfg_attr(…) | ||
464 | at deny(…) | ||
465 | at forbid(…) | ||
466 | at warn(…) | ||
467 | at deprecated | ||
468 | at doc = "…" | ||
469 | at doc(hidden) | ||
470 | at doc(alias = "…") | ||
471 | at must_use | ||
472 | at no_mangle | ||
473 | "#]], | ||
474 | ); | ||
475 | } | ||
476 | |||
477 | #[test] | ||
478 | fn complete_attribute_on_type_alias() { | ||
479 | check( | ||
480 | r#"#[$0] type foo = ();"#, | ||
481 | expect![[r#" | ||
482 | at allow(…) | ||
483 | at cfg(…) | ||
484 | at cfg_attr(…) | ||
485 | at deny(…) | ||
486 | at forbid(…) | ||
487 | at warn(…) | ||
488 | at deprecated | ||
489 | at doc = "…" | ||
490 | at doc(hidden) | ||
491 | at doc(alias = "…") | ||
492 | at must_use | ||
493 | at no_mangle | ||
494 | "#]], | ||
495 | ); | ||
496 | } | ||
497 | |||
498 | #[test] | ||
326 | fn complete_attribute_on_struct() { | 499 | fn complete_attribute_on_struct() { |
327 | check( | 500 | check( |
328 | r#" | 501 | r#"#[$0] struct Foo;"#, |
329 | #[$0] | 502 | expect![[r#" |
330 | struct Test {} | 503 | at allow(…) |
331 | "#, | 504 | at cfg(…) |
505 | at cfg_attr(…) | ||
506 | at deny(…) | ||
507 | at forbid(…) | ||
508 | at warn(…) | ||
509 | at deprecated | ||
510 | at doc = "…" | ||
511 | at doc(hidden) | ||
512 | at doc(alias = "…") | ||
513 | at must_use | ||
514 | at no_mangle | ||
515 | at derive(…) | ||
516 | at repr(…) | ||
517 | at non_exhaustive | ||
518 | "#]], | ||
519 | ); | ||
520 | } | ||
521 | |||
522 | #[test] | ||
523 | fn complete_attribute_on_enum() { | ||
524 | check( | ||
525 | r#"#[$0] enum Foo {}"#, | ||
526 | expect![[r#" | ||
527 | at allow(…) | ||
528 | at cfg(…) | ||
529 | at cfg_attr(…) | ||
530 | at deny(…) | ||
531 | at forbid(…) | ||
532 | at warn(…) | ||
533 | at deprecated | ||
534 | at doc = "…" | ||
535 | at doc(hidden) | ||
536 | at doc(alias = "…") | ||
537 | at must_use | ||
538 | at no_mangle | ||
539 | at derive(…) | ||
540 | at repr(…) | ||
541 | at non_exhaustive | ||
542 | "#]], | ||
543 | ); | ||
544 | } | ||
545 | |||
546 | #[test] | ||
547 | fn complete_attribute_on_const() { | ||
548 | check( | ||
549 | r#"#[$0] const FOO: () = ();"#, | ||
550 | expect![[r#" | ||
551 | at allow(…) | ||
552 | at cfg(…) | ||
553 | at cfg_attr(…) | ||
554 | at deny(…) | ||
555 | at forbid(…) | ||
556 | at warn(…) | ||
557 | at deprecated | ||
558 | at doc = "…" | ||
559 | at doc(hidden) | ||
560 | at doc(alias = "…") | ||
561 | at must_use | ||
562 | at no_mangle | ||
563 | "#]], | ||
564 | ); | ||
565 | } | ||
566 | |||
567 | #[test] | ||
568 | fn complete_attribute_on_static() { | ||
569 | check( | ||
570 | r#"#[$0] static FOO: () = ()"#, | ||
571 | expect![[r#" | ||
572 | at allow(…) | ||
573 | at cfg(…) | ||
574 | at cfg_attr(…) | ||
575 | at deny(…) | ||
576 | at forbid(…) | ||
577 | at warn(…) | ||
578 | at deprecated | ||
579 | at doc = "…" | ||
580 | at doc(hidden) | ||
581 | at doc(alias = "…") | ||
582 | at must_use | ||
583 | at no_mangle | ||
584 | at export_name = "…" | ||
585 | at link_name = "…" | ||
586 | at link_section = "…" | ||
587 | at used | ||
588 | "#]], | ||
589 | ); | ||
590 | } | ||
591 | |||
592 | #[test] | ||
593 | fn complete_attribute_on_trait() { | ||
594 | check( | ||
595 | r#"#[$0] trait Foo {}"#, | ||
332 | expect![[r#" | 596 | expect![[r#" |
333 | at allow(…) | 597 | at allow(…) |
334 | at cfg(…) | 598 | at cfg(…) |
@@ -337,10 +601,137 @@ struct Test {} | |||
337 | at forbid(…) | 601 | at forbid(…) |
338 | at warn(…) | 602 | at warn(…) |
339 | at deprecated | 603 | at deprecated |
604 | at doc = "…" | ||
605 | at doc(hidden) | ||
606 | at doc(alias = "…") | ||
607 | at must_use | ||
608 | at no_mangle | ||
340 | at must_use | 609 | at must_use |
341 | "#]], | 610 | "#]], |
342 | ); | 611 | ); |
343 | } | 612 | } |
613 | |||
614 | #[test] | ||
615 | fn complete_attribute_on_impl() { | ||
616 | check( | ||
617 | r#"#[$0] impl () {}"#, | ||
618 | expect![[r#" | ||
619 | at allow(…) | ||
620 | at cfg(…) | ||
621 | at cfg_attr(…) | ||
622 | at deny(…) | ||
623 | at forbid(…) | ||
624 | at warn(…) | ||
625 | at deprecated | ||
626 | at doc = "…" | ||
627 | at doc(hidden) | ||
628 | at doc(alias = "…") | ||
629 | at must_use | ||
630 | at no_mangle | ||
631 | at automatically_derived | ||
632 | "#]], | ||
633 | ); | ||
634 | check( | ||
635 | r#"impl () {#![$0]}"#, | ||
636 | expect![[r#" | ||
637 | at allow(…) | ||
638 | at cfg(…) | ||
639 | at cfg_attr(…) | ||
640 | at deny(…) | ||
641 | at forbid(…) | ||
642 | at warn(…) | ||
643 | at deprecated | ||
644 | at doc = "…" | ||
645 | at doc(hidden) | ||
646 | at doc(alias = "…") | ||
647 | at must_use | ||
648 | at no_mangle | ||
649 | "#]], | ||
650 | ); | ||
651 | } | ||
652 | |||
653 | #[test] | ||
654 | fn complete_attribute_on_extern_block() { | ||
655 | check( | ||
656 | r#"#[$0] extern {}"#, | ||
657 | expect![[r#" | ||
658 | at allow(…) | ||
659 | at cfg(…) | ||
660 | at cfg_attr(…) | ||
661 | at deny(…) | ||
662 | at forbid(…) | ||
663 | at warn(…) | ||
664 | at deprecated | ||
665 | at doc = "…" | ||
666 | at doc(hidden) | ||
667 | at doc(alias = "…") | ||
668 | at must_use | ||
669 | at no_mangle | ||
670 | at link | ||
671 | "#]], | ||
672 | ); | ||
673 | check( | ||
674 | r#"extern {#![$0]}"#, | ||
675 | expect![[r#" | ||
676 | at allow(…) | ||
677 | at cfg(…) | ||
678 | at cfg_attr(…) | ||
679 | at deny(…) | ||
680 | at forbid(…) | ||
681 | at warn(…) | ||
682 | at deprecated | ||
683 | at doc = "…" | ||
684 | at doc(hidden) | ||
685 | at doc(alias = "…") | ||
686 | at must_use | ||
687 | at no_mangle | ||
688 | at link | ||
689 | "#]], | ||
690 | ); | ||
691 | } | ||
692 | |||
693 | #[test] | ||
694 | fn complete_attribute_on_variant() { | ||
695 | check( | ||
696 | r#"enum Foo { #[$0] Bar }"#, | ||
697 | expect![[r#" | ||
698 | at allow(…) | ||
699 | at cfg(…) | ||
700 | at cfg_attr(…) | ||
701 | at deny(…) | ||
702 | at forbid(…) | ||
703 | at warn(…) | ||
704 | at non_exhaustive | ||
705 | "#]], | ||
706 | ); | ||
707 | } | ||
708 | |||
709 | #[test] | ||
710 | fn complete_attribute_on_expr() { | ||
711 | check( | ||
712 | r#"fn main() { #[$0] foo() }"#, | ||
713 | expect![[r#" | ||
714 | at allow(…) | ||
715 | at cfg(…) | ||
716 | at cfg_attr(…) | ||
717 | at deny(…) | ||
718 | at forbid(…) | ||
719 | at warn(…) | ||
720 | "#]], | ||
721 | ); | ||
722 | check( | ||
723 | r#"fn main() { #[$0] foo(); }"#, | ||
724 | expect![[r#" | ||
725 | at allow(…) | ||
726 | at cfg(…) | ||
727 | at cfg_attr(…) | ||
728 | at deny(…) | ||
729 | at forbid(…) | ||
730 | at warn(…) | ||
731 | "#]], | ||
732 | ); | ||
733 | } | ||
734 | |||
344 | #[test] | 735 | #[test] |
345 | fn test_attribute_completion_inside_nested_attr() { | 736 | fn test_attribute_completion_inside_nested_attr() { |
346 | check(r#"#[cfg($0)]"#, expect![[]]) | 737 | check(r#"#[cfg($0)]"#, expect![[]]) |