File tree Expand file tree Collapse file tree 3 files changed +305
-39
lines changed
crates/ide-completion/src Expand file tree Collapse file tree 3 files changed +305
-39
lines changed Original file line number Diff line number Diff 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 } ;
Original file line number Diff line number Diff 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+ }
You can’t perform that action at this time.
0 commit comments