Skip to content

Commit ed57d88

Browse files
committed
[ast] Refactor BindingPattern to take a VarDecl::Introducer directly instead of a bool to mean a let.
I am going to be adding more VarDecl::Introducers so this is a small nice cleanup that is cut off the larger patch.
1 parent 52f46be commit ed57d88

File tree

7 files changed

+42
-23
lines changed

7 files changed

+42
-23
lines changed

include/swift/AST/Pattern.h

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,9 @@ class alignas(8) Pattern : public ASTAllocated<Pattern> {
7474
Value : 1
7575
);
7676

77-
SWIFT_INLINE_BITFIELD(BindingPattern, Pattern, 1,
78-
/// True if this is a let pattern, false if a var pattern.
79-
IsLet : 1
77+
SWIFT_INLINE_BITFIELD(BindingPattern, Pattern, 2,
78+
/// Corresponds to VarDecl::Introducer
79+
Introducer : 1
8080
);
8181

8282
SWIFT_INLINE_BITFIELD(AnyPattern, Pattern, 1,
@@ -701,20 +701,30 @@ class ExprPattern : public Pattern {
701701
class BindingPattern : public Pattern {
702702
SourceLoc VarLoc;
703703
Pattern *SubPattern;
704+
704705
public:
705-
BindingPattern(SourceLoc loc, bool isLet, Pattern *sub)
706+
BindingPattern(SourceLoc loc, VarDecl::Introducer introducer, Pattern *sub)
706707
: Pattern(PatternKind::Binding), VarLoc(loc), SubPattern(sub) {
707-
Bits.BindingPattern.IsLet = isLet;
708+
setIntroducer(introducer);
709+
}
710+
711+
VarDecl::Introducer getIntroducer() const {
712+
return VarDecl::Introducer(Bits.BindingPattern.Introducer);
713+
}
714+
715+
void setIntroducer(VarDecl::Introducer introducer) {
716+
Bits.BindingPattern.Introducer = uint8_t(introducer);
708717
}
709718

710-
static BindingPattern *createImplicit(ASTContext &Ctx, bool isLet,
719+
static BindingPattern *createImplicit(ASTContext &Ctx,
720+
VarDecl::Introducer introducer,
711721
Pattern *sub) {
712-
auto *VP = new (Ctx) BindingPattern(SourceLoc(), isLet, sub);
722+
auto *VP = new (Ctx) BindingPattern(SourceLoc(), introducer, sub);
713723
VP->setImplicit();
714724
return VP;
715725
}
716726

717-
bool isLet() const { return Bits.BindingPattern.IsLet; }
727+
bool isLet() const { return getIntroducer() == VarDecl::Introducer::Let; }
718728

719729
SourceLoc getLoc() const { return VarLoc; }
720730
SourceRange getSourceRange() const {

lib/Parse/ParsePattern.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1132,8 +1132,9 @@ ParserResult<Pattern> Parser::parsePattern() {
11321132
return makeParserCodeCompletionResult<Pattern>();
11331133
if (subPattern.isNull())
11341134
return nullptr;
1135-
return makeParserResult(
1136-
new (Context) BindingPattern(varLoc, isLet, subPattern.get()));
1135+
return makeParserResult(new (Context) BindingPattern(
1136+
varLoc, isLet ? VarDecl::Introducer::Let : VarDecl::Introducer::Var,
1137+
subPattern.get()));
11371138
}
11381139

11391140
default:
@@ -1341,7 +1342,9 @@ ParserResult<Pattern> Parser::parseMatchingPatternAsLetOrVar(bool isLet,
13411342
ParserResult<Pattern> subPattern = parseMatchingPattern(isExprBasic);
13421343
if (subPattern.isNull())
13431344
return nullptr;
1344-
auto *varP = new (Context) BindingPattern(varLoc, isLet, subPattern.get());
1345+
auto *varP = new (Context) BindingPattern(
1346+
varLoc, isLet ? VarDecl::Introducer::Let : VarDecl::Introducer::Var,
1347+
subPattern.get());
13451348
return makeParserResult(ParserStatus(subPattern), varP);
13461349
}
13471350

lib/Parse/ParseStmt.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1123,8 +1123,8 @@ static void parseGuardedPattern(Parser &P, GuardedPattern &result,
11231123
P.CurDeclContext);
11241124
var->setImplicit();
11251125
auto namePattern = new (P.Context) NamedPattern(var);
1126-
auto varPattern =
1127-
new (P.Context) BindingPattern(loc, /*isLet*/ true, namePattern);
1126+
auto varPattern = new (P.Context)
1127+
BindingPattern(loc, VarDecl::Introducer::Let, namePattern);
11281128
varPattern->setImplicit();
11291129
patternResult = makeParserResult(varPattern);
11301130
}
@@ -1652,8 +1652,10 @@ Parser::parseStmtConditionElement(SmallVectorImpl<StmtConditionElement> &result,
16521652
ThePattern = parseMatchingPattern(/*isExprBasic*/ true);
16531653

16541654
if (ThePattern.isNonNull()) {
1655-
auto *P =
1656-
new (Context) BindingPattern(IntroducerLoc, wasLet, ThePattern.get());
1655+
auto *P = new (Context) BindingPattern(IntroducerLoc,
1656+
wasLet ? VarDecl::Introducer::Let
1657+
: VarDecl::Introducer::Var,
1658+
ThePattern.get());
16571659
ThePattern = makeParserResult(Status, P);
16581660
}
16591661

lib/Sema/DerivedConformanceCodable.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1650,7 +1650,8 @@ deriveBodyDecodable_enum_init(AbstractFunctionDecl *initDecl, void *) {
16501650
C, UnresolvedDotExpr::createImplicit(C, allKeysExpr, C.Id_popFirst));
16511651

16521652
auto *theKeyPattern = BindingPattern::createImplicit(
1653-
C, /*isLet=*/true, NamedPattern::createImplicit(C, theKeyDecl));
1653+
C, VarDecl::Introducer::Let,
1654+
NamedPattern::createImplicit(C, theKeyDecl));
16541655

16551656
guardElements.emplace_back(SourceLoc(), theKeyPattern,
16561657
allKeysPopFirstCallExpr);

lib/Sema/DerivedConformances.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -854,8 +854,8 @@ Pattern *DerivedConformance::enumElementPayloadSubpattern(
854854

855855
auto namedPattern = new (C) NamedPattern(payloadVar);
856856
namedPattern->setImplicit();
857-
auto letPattern =
858-
BindingPattern::createImplicit(C, /*isLet*/ true, namedPattern);
857+
auto letPattern = BindingPattern::createImplicit(
858+
C, VarDecl::Introducer::Let, namedPattern);
859859
elementPatterns.push_back(TuplePatternElt(tupleElement.getName(),
860860
SourceLoc(), letPattern));
861861
}
@@ -874,8 +874,8 @@ Pattern *DerivedConformance::enumElementPayloadSubpattern(
874874

875875
auto namedPattern = new (C) NamedPattern(payloadVar);
876876
namedPattern->setImplicit();
877-
auto letPattern =
878-
new (C) BindingPattern(SourceLoc(), /*isLet*/ true, namedPattern);
877+
auto letPattern = new (C)
878+
BindingPattern(SourceLoc(), VarDecl::Introducer::Let, namedPattern);
879879
return ParenPattern::createImplicit(C, letPattern);
880880
}
881881

lib/Sema/TypeCheckStorage.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1436,7 +1436,8 @@ synthesizeLazyGetterBody(AccessorDecl *Get, VarDecl *VD, VarDecl *Storage,
14361436

14371437
auto *Named = NamedPattern::createImplicit(Ctx, Tmp1VD);
14381438
Named->setType(Tmp1VD->getType());
1439-
auto *Let = BindingPattern::createImplicit(Ctx, /*let*/ true, Named);
1439+
auto *Let =
1440+
BindingPattern::createImplicit(Ctx, VarDecl::Introducer::Let, Named);
14401441
Let->setType(Named->getType());
14411442
auto *Some = OptionalSomePattern::createImplicit(Ctx, Let);
14421443
Some->setType(OptionalType::get(Let->getType()));

lib/Serialization/Deserialization.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -415,8 +415,10 @@ Expected<Pattern *> ModuleFile::readPattern(DeclContext *owningDC) {
415415

416416
Pattern *subPattern = readPatternUnchecked(owningDC);
417417

418-
auto result =
419-
BindingPattern::createImplicit(getContext(), isLet, subPattern);
418+
auto result = BindingPattern::createImplicit(
419+
getContext(),
420+
isLet ? VarDecl::Introducer::Let : VarDecl::Introducer::Var,
421+
subPattern);
420422
if (Type interfaceType = subPattern->getDelayedInterfaceType())
421423
result->setDelayedInterfaceType(interfaceType, owningDC);
422424
else

0 commit comments

Comments
 (0)