From deac7012cbd54b83038195585e3eb91246a61fc0 Mon Sep 17 00:00:00 2001 From: Hamish Knight Date: Sat, 8 Mar 2025 17:57:31 +0000 Subject: [PATCH] [AST] Avoid setting `questionLoc` for implicit OptionalSomePatterns Instead fix `getSourceRange` to handle cases where the question location is missing. --- include/swift/AST/Pattern.h | 9 ++++++--- lib/AST/Pattern.cpp | 8 ++++---- lib/Sema/TypeCheckPattern.cpp | 7 +++---- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/include/swift/AST/Pattern.h b/include/swift/AST/Pattern.h index 676f3e6a6552e..4d827607c85c9 100644 --- a/include/swift/AST/Pattern.h +++ b/include/swift/AST/Pattern.h @@ -687,12 +687,15 @@ class OptionalSomePattern : public Pattern { static OptionalSomePattern *create(ASTContext &ctx, Pattern *subPattern, SourceLoc questionLoc); - static OptionalSomePattern * - createImplicit(ASTContext &ctx, Pattern *subPattern, - SourceLoc questionLoc = SourceLoc()); + static OptionalSomePattern *createImplicit(ASTContext &ctx, + Pattern *subPattern); SourceLoc getQuestionLoc() const { return QuestionLoc; } + SourceRange getSourceRange() const { + if (QuestionLoc.isInvalid()) + return SubPattern->getSourceRange(); + return SourceRange(SubPattern->getStartLoc(), QuestionLoc); } diff --git a/lib/AST/Pattern.cpp b/lib/AST/Pattern.cpp index 418a92db1ddd9..d6f6eb4874422 100644 --- a/lib/AST/Pattern.cpp +++ b/lib/AST/Pattern.cpp @@ -367,10 +367,10 @@ OptionalSomePattern *OptionalSomePattern::create(ASTContext &ctx, return new (ctx) OptionalSomePattern(ctx, subPattern, questionLoc); } -OptionalSomePattern * -OptionalSomePattern::createImplicit(ASTContext &ctx, Pattern *subPattern, - SourceLoc questionLoc) { - auto *P = OptionalSomePattern::create(ctx, subPattern, questionLoc); +OptionalSomePattern *OptionalSomePattern::createImplicit(ASTContext &ctx, + Pattern *subPattern) { + auto *P = OptionalSomePattern::create(ctx, subPattern, + /*questionLoc*/ SourceLoc()); P->setImplicit(); return P; } diff --git a/lib/Sema/TypeCheckPattern.cpp b/lib/Sema/TypeCheckPattern.cpp index 0bd9aa77a90d1..a7083b3798040 100644 --- a/lib/Sema/TypeCheckPattern.cpp +++ b/lib/Sema/TypeCheckPattern.cpp @@ -645,7 +645,7 @@ Pattern *ResolvePatternRequest::evaluate(Evaluator &evaluator, Pattern *P, // "if let" implicitly looks inside of an optional, so wrap it in an // OptionalSome pattern. - P = OptionalSomePattern::createImplicit(Context, P, P->getEndLoc()); + P = OptionalSomePattern::createImplicit(Context, P); } return P; @@ -1029,7 +1029,7 @@ static NullablePtr simplifyToBoolPattern(ASTContext &Ctx, if (auto wrappedType = patternTy->getOptionalObjectType()) { if (auto P = simplifyToBoolPattern(Ctx, EP, BLE, wrappedType).getPtrOrNull()) { - auto OP = OptionalSomePattern::createImplicit(Ctx, P, P->getEndLoc()); + auto OP = OptionalSomePattern::createImplicit(Ctx, P); OP->setType(patternTy); return OP; } @@ -1475,8 +1475,7 @@ Pattern *TypeChecker::coercePatternToType( if (lookupEnumMemberElement(dc, baseType->lookThroughAllOptionalTypes(), EEP->getName(), EEP->getLoc())) { - P = OptionalSomePattern::createImplicit(Context, EEP, - EEP->getEndLoc()); + P = OptionalSomePattern::createImplicit(Context, EEP); return coercePatternToType( pattern.forSubPattern(P, /*retainTopLevel=*/true), type, options, tryRewritePattern);