Skip to content

Commit f5c0c9c

Browse files
committed
[CodeCompletion] Maintain LeaveClosureBodiesUnchecked when checking pattern binding
Before, we were dropping `LeaveClosureBodiesUnchecked` when checking a pattern binding request which caused missing completions inside variables initialized by closures. rdar://92603748 [#58610]
1 parent 2f0ae44 commit f5c0c9c

7 files changed

+41
-13
lines changed

Diff for: include/swift/AST/TypeCheckRequests.h

+4-3
Original file line numberDiff line numberDiff line change
@@ -2264,7 +2264,7 @@ class ResultTypeRequest
22642264
class PatternBindingEntryRequest
22652265
: public SimpleRequest<PatternBindingEntryRequest,
22662266
const PatternBindingEntry *(PatternBindingDecl *,
2267-
unsigned),
2267+
unsigned, bool),
22682268
RequestFlags::SeparatelyCached> {
22692269
public:
22702270
using SimpleRequest::SimpleRequest;
@@ -2273,8 +2273,9 @@ class PatternBindingEntryRequest
22732273
friend SimpleRequest;
22742274

22752275
// Evaluation.
2276-
const PatternBindingEntry *
2277-
evaluate(Evaluator &evaluator, PatternBindingDecl *PBD, unsigned i) const;
2276+
const PatternBindingEntry *evaluate(Evaluator &evaluator,
2277+
PatternBindingDecl *PBD, unsigned i,
2278+
bool LeaveClosureBodiesUnchecked) const;
22782279

22792280
public:
22802281
// Separate caching.

Diff for: include/swift/AST/TypeCheckerTypeIDZone.def

+1-1
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ SWIFT_REQUEST(TypeChecker, OverriddenDeclsRequest,
266266
llvm::TinyPtrVector<ValueDecl *>(ValueDecl *), SeparatelyCached,
267267
NoLocationInfo)
268268
SWIFT_REQUEST(TypeChecker, PatternBindingEntryRequest,
269-
const PatternBindingEntry *(PatternBindingDecl *, unsigned),
269+
const PatternBindingEntry *(PatternBindingDecl *, unsigned, bool),
270270
SeparatelyCached, NoLocationInfo)
271271
SWIFT_REQUEST(TypeChecker, PrimarySourceFilesRequest,
272272
ArrayRef<SourceFile *>(ModuleDecl *), Cached, NoLocationInfo)

Diff for: lib/AST/Decl.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -1969,7 +1969,8 @@ bool PatternBindingDecl::isComputingPatternBindingEntry(
19691969
const VarDecl *vd) const {
19701970
unsigned i = getPatternEntryIndexForVarDecl(vd);
19711971
return getASTContext().evaluator.hasActiveRequest(
1972-
PatternBindingEntryRequest{const_cast<PatternBindingDecl *>(this), i});
1972+
PatternBindingEntryRequest{const_cast<PatternBindingDecl *>(this), i,
1973+
/*LeaveClosureBodyUnchecked=*/false});
19731974
}
19741975

19751976
bool PatternBindingDecl::isExplicitlyInitialized(unsigned i) const {

Diff for: lib/Sema/TypeCheckDecl.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -2453,7 +2453,8 @@ NamingPatternRequest::evaluate(Evaluator &evaluator, VarDecl *VD) const {
24532453
// and TypeCheckPattern handle the others. But that's all really gross.
24542454
unsigned i = PBD->getPatternEntryIndexForVarDecl(VD);
24552455
(void)evaluateOrDefault(evaluator,
2456-
PatternBindingEntryRequest{PBD, i},
2456+
PatternBindingEntryRequest{
2457+
PBD, i, /*LeaveClosureBodiesUnchecked=*/false},
24572458
nullptr);
24582459
if (PBD->isInvalid()) {
24592460
VD->getParentPattern()->setType(ErrorType::get(Context));

Diff for: lib/Sema/TypeCheckDeclPrimary.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -2023,7 +2023,9 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
20232023
PBD->isFullyValidated(i)
20242024
? &PBD->getPatternList()[i]
20252025
: evaluateOrDefault(Ctx.evaluator,
2026-
PatternBindingEntryRequest{PBD, i}, nullptr);
2026+
PatternBindingEntryRequest{
2027+
PBD, i, LeaveClosureBodiesUnchecked},
2028+
nullptr);
20272029
assert(entry && "No pattern binding entry?");
20282030

20292031
const auto *Pat = PBD->getPattern(i);

Diff for: lib/Sema/TypeCheckStorage.cpp

+9-6
Original file line numberDiff line numberDiff line change
@@ -250,10 +250,9 @@ StoredPropertiesAndMissingMembersRequest::evaluate(Evaluator &evaluator,
250250
}
251251

252252
/// Validate the \c entryNumber'th entry in \c binding.
253-
const PatternBindingEntry *
254-
PatternBindingEntryRequest::evaluate(Evaluator &eval,
255-
PatternBindingDecl *binding,
256-
unsigned entryNumber) const {
253+
const PatternBindingEntry *PatternBindingEntryRequest::evaluate(
254+
Evaluator &eval, PatternBindingDecl *binding, unsigned entryNumber,
255+
bool LeaveClosureBodiesUnchecked) const {
257256
const auto &pbe = binding->getPatternList()[entryNumber];
258257
auto &Context = binding->getASTContext();
259258

@@ -363,8 +362,12 @@ PatternBindingEntryRequest::evaluate(Evaluator &eval,
363362
if (patternType->hasUnresolvedType() ||
364363
patternType->hasPlaceholder() ||
365364
patternType->hasUnboundGenericType()) {
366-
if (TypeChecker::typeCheckPatternBinding(binding, entryNumber,
367-
patternType)) {
365+
TypeCheckExprOptions options;
366+
if (LeaveClosureBodiesUnchecked) {
367+
options |= TypeCheckExprFlags::LeaveClosureBodyUnchecked;
368+
}
369+
if (TypeChecker::typeCheckPatternBinding(binding, entryNumber, patternType,
370+
options)) {
368371
binding->setInvalid();
369372
return &pbe;
370373
}

Diff for: test/IDE/complete_in_closures.swift

+20
Original file line numberDiff line numberDiff line change
@@ -396,3 +396,23 @@ func testSignature() {
396396

397397
// NOTE: For effects specifiers completion (e.g. '() <HERE> -> Void') see test/IDE/complete_concurrency_specifier.swift
398398
}
399+
400+
func testClosureInPatternBindingInit() {
401+
enum DragState {
402+
case dragging(translation: Int, predictedLocation: Int)
403+
}
404+
405+
func pnChanged(_ action: () -> Void) {}
406+
407+
func foo() {
408+
var gestureViewState: DragState = .dragging(translation: 0, predictedLocation: 0)
409+
let longPressDrag = pnChanged {
410+
_ = 1
411+
gestureViewState = .dragging(translation: 0, #^CLOSURE_IN_PATTERN_BINDING^#predictedLocation: 0)
412+
}
413+
}
414+
// CLOSURE_IN_PATTERN_BINDING: Begin completions, 1 items
415+
// CLOSURE_IN_PATTERN_BINDING-DAG: Pattern/Local/Flair[ArgLabels]: {#predictedLocation: Int#}[#Int#];
416+
// CLOSURE_IN_PATTERN_BINDING: End completion
417+
418+
}

0 commit comments

Comments
 (0)