Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit d2cf8c2

Browse files
committed
Make else autocompletion work in more places
1 parent 33cacde commit d2cf8c2

File tree

3 files changed

+305
-39
lines changed

3 files changed

+305
-39
lines changed

crates/ide-completion/src/context/analysis.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ fn expected_type_and_name(
380380
sema,
381381
token.clone(),
382382
).map(|ap| {
383-
let name = dbg!(ap.ident().map(NameOrNameRef::Name));
383+
let name = ap.ident().map(NameOrNameRef::Name);
384384

385385
let ty = strip_refs(ap.ty);
386386
(Some(ty), name)
@@ -656,8 +656,15 @@ fn classify_name_ref(
656656
};
657657
let after_if_expr = |node: SyntaxNode| {
658658
let prev_expr = (|| {
659+
let node = match node.parent().and_then(ast::ExprStmt::cast) {
660+
Some(stmt) => stmt.syntax().clone(),
661+
None => node,
662+
};
659663
let prev_sibling = non_trivia_sibling(node.into(), Direction::Prev)?.into_node()?;
660-
ast::ExprStmt::cast(prev_sibling)?.expr()
664+
665+
ast::ExprStmt::cast(prev_sibling.clone())
666+
.and_then(|it| it.expr())
667+
.or_else(|| ast::Expr::cast(prev_sibling))
661668
})();
662669
matches!(prev_expr, Some(ast::Expr::IfExpr(_)))
663670
};

crates/ide-completion/src/tests/expression.rs

Lines changed: 252 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -745,3 +745,255 @@ fn return_value_no_block() {
745745
r#"fn f() -> i32 { match () { () => return $0 } }"#,
746746
);
747747
}
748+
749+
#[test]
750+
fn else_completion_after_if() {
751+
check_empty(
752+
r#"
753+
fn foo() { if foo {} $0 }
754+
"#,
755+
expect![[r#"
756+
fn foo() fn()
757+
bt u32
758+
kw const
759+
kw crate::
760+
kw else
761+
kw else if
762+
kw enum
763+
kw extern
764+
kw false
765+
kw fn
766+
kw for
767+
kw if
768+
kw if let
769+
kw impl
770+
kw let
771+
kw loop
772+
kw match
773+
kw mod
774+
kw return
775+
kw self::
776+
kw static
777+
kw struct
778+
kw trait
779+
kw true
780+
kw type
781+
kw union
782+
kw unsafe
783+
kw use
784+
kw while
785+
kw while let
786+
sn macro_rules
787+
sn pd
788+
sn ppd
789+
"#]],
790+
);
791+
check_empty(
792+
r#"
793+
fn foo() { if foo {} el$0 }
794+
"#,
795+
expect![[r#"
796+
fn foo() fn()
797+
bt u32
798+
kw const
799+
kw crate::
800+
kw else
801+
kw else if
802+
kw enum
803+
kw extern
804+
kw false
805+
kw fn
806+
kw for
807+
kw if
808+
kw if let
809+
kw impl
810+
kw let
811+
kw loop
812+
kw match
813+
kw mod
814+
kw return
815+
kw self::
816+
kw static
817+
kw struct
818+
kw trait
819+
kw true
820+
kw type
821+
kw union
822+
kw unsafe
823+
kw use
824+
kw while
825+
kw while let
826+
sn macro_rules
827+
sn pd
828+
sn ppd
829+
"#]],
830+
);
831+
check_empty(
832+
r#"
833+
fn foo() { bar(if foo {} $0) }
834+
"#,
835+
expect![[r#"
836+
fn foo() fn()
837+
bt u32
838+
kw crate::
839+
kw else
840+
kw else if
841+
kw false
842+
kw for
843+
kw if
844+
kw if let
845+
kw loop
846+
kw match
847+
kw return
848+
kw self::
849+
kw true
850+
kw unsafe
851+
kw while
852+
kw while let
853+
"#]],
854+
);
855+
check_empty(
856+
r#"
857+
fn foo() { bar(if foo {} el$0) }
858+
"#,
859+
expect![[r#"
860+
fn foo() fn()
861+
bt u32
862+
kw crate::
863+
kw else
864+
kw else if
865+
kw false
866+
kw for
867+
kw if
868+
kw if let
869+
kw loop
870+
kw match
871+
kw return
872+
kw self::
873+
kw true
874+
kw unsafe
875+
kw while
876+
kw while let
877+
"#]],
878+
);
879+
check_empty(
880+
r#"
881+
fn foo() { if foo {} $0 let x = 92; }
882+
"#,
883+
expect![[r#"
884+
fn foo() fn()
885+
bt u32
886+
kw const
887+
kw crate::
888+
kw else
889+
kw else if
890+
kw enum
891+
kw extern
892+
kw false
893+
kw fn
894+
kw for
895+
kw if
896+
kw if let
897+
kw impl
898+
kw let
899+
kw loop
900+
kw match
901+
kw mod
902+
kw return
903+
kw self::
904+
kw static
905+
kw struct
906+
kw trait
907+
kw true
908+
kw type
909+
kw union
910+
kw unsafe
911+
kw use
912+
kw while
913+
kw while let
914+
sn macro_rules
915+
sn pd
916+
sn ppd
917+
"#]],
918+
);
919+
check_empty(
920+
r#"
921+
fn foo() { if foo {} el$0 let x = 92; }
922+
"#,
923+
expect![[r#"
924+
fn foo() fn()
925+
bt u32
926+
kw const
927+
kw crate::
928+
kw else
929+
kw else if
930+
kw enum
931+
kw extern
932+
kw false
933+
kw fn
934+
kw for
935+
kw if
936+
kw if let
937+
kw impl
938+
kw let
939+
kw loop
940+
kw match
941+
kw mod
942+
kw return
943+
kw self::
944+
kw static
945+
kw struct
946+
kw trait
947+
kw true
948+
kw type
949+
kw union
950+
kw unsafe
951+
kw use
952+
kw while
953+
kw while let
954+
sn macro_rules
955+
sn pd
956+
sn ppd
957+
"#]],
958+
);
959+
check_empty(
960+
r#"
961+
fn foo() { if foo {} el$0 { let x = 92; } }
962+
"#,
963+
expect![[r#"
964+
fn foo() fn()
965+
bt u32
966+
kw const
967+
kw crate::
968+
kw else
969+
kw else if
970+
kw enum
971+
kw extern
972+
kw false
973+
kw fn
974+
kw for
975+
kw if
976+
kw if let
977+
kw impl
978+
kw let
979+
kw loop
980+
kw match
981+
kw mod
982+
kw return
983+
kw self::
984+
kw static
985+
kw struct
986+
kw trait
987+
kw true
988+
kw type
989+
kw union
990+
kw unsafe
991+
kw use
992+
kw while
993+
kw while let
994+
sn macro_rules
995+
sn pd
996+
sn ppd
997+
"#]],
998+
);
999+
}

0 commit comments

Comments
 (0)