Skip to content

Commit 94a7e16

Browse files
authored
Merge pull request #41040 from rintaro/ide-completion-rdar86050684
[CodeCompletion] Let FindLocalVal walk into ExprPattern
2 parents 877fb2b + db48ace commit 94a7e16

File tree

2 files changed

+21
-34
lines changed

2 files changed

+21
-34
lines changed

lib/AST/NameLookup.cpp

Lines changed: 1 addition & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2807,40 +2807,7 @@ swift::getDirectlyInheritedNominalTypeDecls(
28072807
}
28082808

28092809
void FindLocalVal::checkPattern(const Pattern *Pat, DeclVisibilityKind Reason) {
2810-
switch (Pat->getKind()) {
2811-
case PatternKind::Tuple:
2812-
for (auto &field : cast<TuplePattern>(Pat)->getElements())
2813-
checkPattern(field.getPattern(), Reason);
2814-
return;
2815-
case PatternKind::Paren:
2816-
case PatternKind::Typed:
2817-
case PatternKind::Binding:
2818-
return checkPattern(Pat->getSemanticsProvidingPattern(), Reason);
2819-
case PatternKind::Named:
2820-
return checkValueDecl(cast<NamedPattern>(Pat)->getDecl(), Reason);
2821-
case PatternKind::EnumElement: {
2822-
auto *OP = cast<EnumElementPattern>(Pat);
2823-
if (OP->hasSubPattern())
2824-
checkPattern(OP->getSubPattern(), Reason);
2825-
return;
2826-
}
2827-
case PatternKind::OptionalSome:
2828-
checkPattern(cast<OptionalSomePattern>(Pat)->getSubPattern(), Reason);
2829-
return;
2830-
2831-
case PatternKind::Is: {
2832-
auto *isPat = cast<IsPattern>(Pat);
2833-
if (isPat->hasSubPattern())
2834-
checkPattern(isPat->getSubPattern(), Reason);
2835-
return;
2836-
}
2837-
2838-
// Handle non-vars.
2839-
case PatternKind::Bool:
2840-
case PatternKind::Expr:
2841-
case PatternKind::Any:
2842-
return;
2843-
}
2810+
Pat->forEachVariable([&](VarDecl *VD) { checkValueDecl(VD, Reason); });
28442811
}
28452812
void FindLocalVal::checkValueDecl(ValueDecl *D, DeclVisibilityKind Reason) {
28462813
if (!D)

test/IDE/complete_stmt_controlling_expr.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,3 +547,23 @@ func testGuardCase(x:FooStruct?) {
547547
// OPTIONAL_FOOSTRUCT-DAG: Decl[EnumElement]/CurrNominal/IsSystem/TypeRelation[Identical]: none[#Optional<FooStruct>#]; name=none
548548
// OPTIONAL_FOOSTRUCT-DAG: Decl[EnumElement]/CurrNominal/IsSystem/TypeRelation[Identical]: some({#FooStruct#})[#Optional<FooStruct>#]; name=some()
549549
// OPTIONAL_FOOSTRUCT: End completions
550+
551+
func returnOpt() -> String? { nil }
552+
func returnOptTuple() -> (String, String)? { nil}
553+
func test_rdar86050684() {
554+
guard let local1 = returnOpt() else { return }
555+
guard let (local2, _) = returnOptTuple() else { return }
556+
if let (local3, _) = returnOptTuple() {
557+
if case (let local4, _)? = returnOptTuple() {
558+
let (local5, _) = returnOptTuple() ?? ("", "")
559+
_ = #^RDAR86050684^#
560+
// RDAR86050684: Begin completions
561+
// RDAR86050684-DAG: Decl[LocalVar]/Local: local1[#String#];
562+
// RDAR86050684-DAG: Decl[LocalVar]/Local: local2[#String#];
563+
// RDAR86050684-DAG: Decl[LocalVar]/Local: local3[#String#];
564+
// RDAR86050684-DAG: Decl[LocalVar]/Local: local4[#String#];
565+
// RDAR86050684-DAG: Decl[LocalVar]/Local: local5[#String#];
566+
// RDAR86050684: End completions
567+
}
568+
}
569+
}

0 commit comments

Comments
 (0)