Skip to content

Commit 893d331

Browse files
hamishknightjrose-apple
authored andcommitted
Add a convenience PatternBindingDecl::createImplicit member and mark some PBDs as implicit (#17441)
Previously, some PBDs weren't being marked implicit even though the associated vars were implicit. PatternBindingDecl::createImplicit will be even nicer when we start parsing the location of the equals token.
1 parent 46a1142 commit 893d331

File tree

10 files changed

+64
-82
lines changed

10 files changed

+64
-82
lines changed

include/swift/AST/Decl.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1907,6 +1907,12 @@ class PatternBindingDecl final : public Decl,
19071907
Pattern *Pat, Expr *E,
19081908
DeclContext *Parent);
19091909

1910+
static PatternBindingDecl *createImplicit(ASTContext &Ctx,
1911+
StaticSpellingKind StaticSpelling,
1912+
Pattern *Pat, Expr *E,
1913+
DeclContext *Parent,
1914+
SourceLoc VarLoc = SourceLoc());
1915+
19101916
static PatternBindingDecl *createDeserialized(
19111917
ASTContext &Ctx, SourceLoc StaticLoc,
19121918
StaticSpellingKind StaticSpelling,

lib/AST/Decl.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,6 +1017,15 @@ PatternBindingDecl::create(ASTContext &Ctx, SourceLoc StaticLoc,
10171017
return Result;
10181018
}
10191019

1020+
PatternBindingDecl *PatternBindingDecl::createImplicit(
1021+
ASTContext &Ctx, StaticSpellingKind StaticSpelling, Pattern *Pat, Expr *E,
1022+
DeclContext *Parent, SourceLoc VarLoc) {
1023+
auto *Result = create(Ctx, /*StaticLoc*/ SourceLoc(), StaticSpelling, VarLoc,
1024+
Pat, E, Parent);
1025+
Result->setImplicit();
1026+
return Result;
1027+
}
1028+
10201029
PatternBindingDecl *
10211030
PatternBindingDecl::create(ASTContext &Ctx, SourceLoc StaticLoc,
10221031
StaticSpellingKind StaticSpelling,

lib/ClangImporter/ImportDecl.cpp

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,11 @@ createVarWithPattern(ASTContext &ctx, DeclContext *dc, Identifier name, Type ty,
146146

147147
// Create a pattern binding to describe the variable.
148148
Pattern *varPattern = createTypedNamedPattern(var);
149-
auto patternBinding =
150-
PatternBindingDecl::create(ctx, SourceLoc(), StaticSpellingKind::None,
151-
SourceLoc(), varPattern, nullptr, dc);
149+
auto *patternBinding = PatternBindingDecl::create(
150+
ctx, /*StaticLoc*/ SourceLoc(), StaticSpellingKind::None,
151+
/*VarLoc*/ SourceLoc(), varPattern, /*InitExpr*/ nullptr, dc);
152+
if (isImplicit)
153+
patternBinding->setImplicit();
152154

153155
return {var, patternBinding};
154156
}
@@ -1562,9 +1564,9 @@ static void makeStructRawValuedWithBridge(
15621564

15631565
// Create a pattern binding to describe the variable.
15641566
Pattern *computedVarPattern = createTypedNamedPattern(computedVar);
1565-
auto computedPatternBinding = PatternBindingDecl::create(
1566-
ctx, SourceLoc(), StaticSpellingKind::None, SourceLoc(),
1567-
computedVarPattern, nullptr, structDecl);
1567+
auto *computedPatternBinding = PatternBindingDecl::createImplicit(
1568+
ctx, StaticSpellingKind::None, computedVarPattern, /*InitExpr*/ nullptr,
1569+
structDecl);
15681570

15691571
// Don't bother synthesizing the body if we've already finished
15701572
// type-checking.
@@ -2728,9 +2730,9 @@ namespace {
27282730
// Create a pattern binding to describe the variable.
27292731
Pattern *nsErrorPattern = createTypedNamedPattern(nsErrorProp);
27302732

2731-
auto nsErrorBinding = PatternBindingDecl::create(
2732-
C, loc, StaticSpellingKind::None, loc,
2733-
nsErrorPattern, nullptr, errorWrapper);
2733+
auto *nsErrorBinding = PatternBindingDecl::createImplicit(
2734+
C, StaticSpellingKind::None, nsErrorPattern, /*InitExpr*/ nullptr,
2735+
/*ParentDC*/ errorWrapper, /*VarLoc*/ loc);
27342736
errorWrapper->addMember(nsErrorProp);
27352737
errorWrapper->addMember(nsErrorBinding);
27362738

@@ -2810,9 +2812,9 @@ namespace {
28102812
// Create a pattern binding to describe the variable.
28112813
Pattern *varPattern = createTypedNamedPattern(rawValue);
28122814

2813-
auto rawValueBinding = PatternBindingDecl::create(
2814-
C, SourceLoc(), StaticSpellingKind::None, SourceLoc(),
2815-
varPattern, nullptr, enumDecl);
2815+
auto *rawValueBinding = PatternBindingDecl::createImplicit(
2816+
C, StaticSpellingKind::None, varPattern, /*InitExpr*/ nullptr,
2817+
enumDecl);
28162818

28172819
auto rawValueGetter = makeEnumRawValueGetter(Impl, enumDecl, rawValue);
28182820

lib/Sema/CodeSynthesis.cpp

Lines changed: 17 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1068,11 +1068,8 @@ static void synthesizeObservedSetterBody(TypeChecker &TC, AccessorDecl *Set,
10681068
Ctx.getIdentifier("tmp"), Type(), Set);
10691069
OldValue->setImplicit();
10701070
auto *tmpPattern = new (Ctx) NamedPattern(OldValue, /*implicit*/ true);
1071-
auto tmpPBD = PatternBindingDecl::create(Ctx, SourceLoc(),
1072-
StaticSpellingKind::None,
1073-
SourceLoc(),
1074-
tmpPattern, OldValueExpr, Set);
1075-
tmpPBD->setImplicit();
1071+
auto *tmpPBD = PatternBindingDecl::createImplicit(
1072+
Ctx, StaticSpellingKind::None, tmpPattern, OldValueExpr, Set);
10761073
SetterBody.push_back(tmpPBD);
10771074
SetterBody.push_back(OldValue);
10781075
}
@@ -1199,10 +1196,8 @@ static void synthesizeLazyGetterBody(TypeChecker &TC, AccessorDecl *Get,
11991196
auto *Tmp1Init =
12001197
createPropertyLoadOrCallSuperclassGetter(Get, Storage,
12011198
TargetImpl::Storage, TC);
1202-
auto *Tmp1PBD = PatternBindingDecl::create(Ctx, /*StaticLoc*/SourceLoc(),
1203-
StaticSpellingKind::None,
1204-
/*VarLoc*/SourceLoc(),
1205-
Tmp1PBDPattern, Tmp1Init, Get);
1199+
auto *Tmp1PBD = PatternBindingDecl::createImplicit(
1200+
Ctx, StaticSpellingKind::None, Tmp1PBDPattern, Tmp1Init, Get);
12061201
Body.push_back(Tmp1PBD);
12071202
Body.push_back(Tmp1VD);
12081203

@@ -1264,10 +1259,9 @@ static void synthesizeLazyGetterBody(TypeChecker &TC, AccessorDecl *Get,
12641259
TypeLoc::withoutLoc(VD->getType()),
12651260
/*implicit*/true);
12661261

1267-
auto *Tmp2PBD = PatternBindingDecl::create(Ctx, /*StaticLoc*/SourceLoc(),
1268-
StaticSpellingKind::None,
1269-
InitValue->getStartLoc(),
1270-
Tmp2PBDPattern, InitValue, Get);
1262+
auto *Tmp2PBD = PatternBindingDecl::createImplicit(
1263+
Ctx, StaticSpellingKind::None, Tmp2PBDPattern, InitValue, Get,
1264+
/*VarLoc*/ InitValue->getStartLoc());
12711265
Body.push_back(Tmp2PBD);
12721266
Body.push_back(Tmp2VD);
12731267

@@ -1414,12 +1408,9 @@ void TypeChecker::completePropertyBehaviorStorage(VarDecl *VD,
14141408
PBDPattern = new (Context) TypedPattern(PBDPattern,
14151409
TypeLoc::withoutLoc(SubstStorageContextTy),
14161410
/*implicit*/true);
1417-
auto *PBD = PatternBindingDecl::create(Context, /*staticloc*/SourceLoc(),
1418-
VD->getParentPatternBinding()->getStaticSpelling(),
1419-
/*varloc*/VD->getLoc(),
1420-
PBDPattern, /*init*/InitStorageExpr,
1421-
VD->getDeclContext());
1422-
PBD->setImplicit();
1411+
auto *PBD = PatternBindingDecl::createImplicit(
1412+
Context, VD->getParentPatternBinding()->getStaticSpelling(), PBDPattern,
1413+
InitStorageExpr, VD->getDeclContext(), /*VarLoc*/ VD->getLoc());
14231414
PBD->setInitializerChecked(0);
14241415
addMemberToContextIfNeeded(PBD, VD->getDeclContext(), VD);
14251416

@@ -1608,13 +1599,11 @@ void TypeChecker::completePropertyBehaviorAccessors(VarDecl *VD,
16081599
Context.getIdentifier("tempSelf"),
16091600
selfTy, fromAccessor);
16101601
var->setInterfaceType(selfIfaceTy);
1602+
var->setImplicit();
16111603

1612-
auto varPat = new (Context) NamedPattern(var);
1613-
auto pbd = PatternBindingDecl::create(Context, SourceLoc(),
1614-
StaticSpellingKind::None,
1615-
SourceLoc(),
1616-
varPat, selfExpr,
1617-
fromAccessor);
1604+
auto varPat = new (Context) NamedPattern(var, /*implicit*/ true);
1605+
auto *pbd = PatternBindingDecl::createImplicit(
1606+
Context, StaticSpellingKind::None, varPat, selfExpr, fromAccessor);
16181607
bodyStmts.push_back(var);
16191608
bodyStmts.push_back(pbd);
16201609
selfExpr = new (Context) DeclRefExpr(var, DeclNameLoc(),
@@ -1727,12 +1716,9 @@ void TypeChecker::completeLazyVarImplementation(VarDecl *VD) {
17271716
PBDPattern = new (Context) TypedPattern(PBDPattern,
17281717
TypeLoc::withoutLoc(StorageTy),
17291718
/*implicit*/true);
1730-
auto *PBD = PatternBindingDecl::create(Context, /*staticloc*/SourceLoc(),
1731-
StaticSpellingKind::None,
1732-
/*varloc*/VD->getLoc(),
1733-
PBDPattern, /*init*/nullptr,
1734-
VD->getDeclContext());
1735-
PBD->setImplicit();
1719+
auto *PBD = PatternBindingDecl::createImplicit(
1720+
Context, StaticSpellingKind::None, PBDPattern, /*init*/ nullptr,
1721+
VD->getDeclContext(), /*VarLoc*/ VD->getLoc());
17361722
addMemberToContextIfNeeded(PBD, VD->getDeclContext(), VD);
17371723

17381724
// Now that we've got the storage squared away, enqueue the getter and

lib/Sema/DerivedConformanceCodable.cpp

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -583,11 +583,8 @@ static void deriveBodyEncodable_encode(AbstractFunctionDecl *encodeDecl) {
583583
// binding.
584584
auto *containerPattern = new (C) NamedPattern(containerDecl,
585585
/*implicit=*/true);
586-
auto *bindingDecl = PatternBindingDecl::create(C, SourceLoc(),
587-
StaticSpellingKind::None,
588-
SourceLoc(),
589-
containerPattern, callExpr,
590-
funcDC);
586+
auto *bindingDecl = PatternBindingDecl::createImplicit(
587+
C, StaticSpellingKind::None, containerPattern, callExpr, funcDC);
591588
statements.push_back(bindingDecl);
592589
statements.push_back(containerDecl);
593590

@@ -851,11 +848,8 @@ static void deriveBodyDecodable_init(AbstractFunctionDecl *initDecl) {
851848
// binding.
852849
auto *containerPattern = new (C) NamedPattern(containerDecl,
853850
/*implicit=*/true);
854-
auto *bindingDecl = PatternBindingDecl::create(C, SourceLoc(),
855-
StaticSpellingKind::None,
856-
SourceLoc(),
857-
containerPattern, tryExpr,
858-
funcDC);
851+
auto *bindingDecl = PatternBindingDecl::createImplicit(
852+
C, StaticSpellingKind::None, containerPattern, tryExpr, funcDC);
859853
statements.push_back(bindingDecl);
860854
statements.push_back(containerDecl);
861855

lib/Sema/DerivedConformanceEquatableHashable.cpp

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -224,10 +224,8 @@ static DeclRefExpr *convertEnumToIndex(SmallVectorImpl<ASTNode> &stmts,
224224
indexPat->setType(intType);
225225
indexPat = new (C) TypedPattern(indexPat, TypeLoc::withoutLoc(intType));
226226
indexPat->setType(intType);
227-
auto indexBind = PatternBindingDecl::create(C, SourceLoc(),
228-
StaticSpellingKind::None,
229-
SourceLoc(),
230-
indexPat, nullptr, funcDecl);
227+
auto *indexBind = PatternBindingDecl::createImplicit(
228+
C, StaticSpellingKind::None, indexPat, /*InitExpr*/ nullptr, funcDecl);
231229

232230
unsigned index = 0;
233231
SmallVector<ASTNode, 4> cases;
@@ -1099,12 +1097,9 @@ static ValueDecl *deriveHashable_hashValue(DerivedConformance &derived) {
10991097
/*implicit*/ true);
11001098
hashValuePat->setType(intType);
11011099

1102-
auto patDecl = PatternBindingDecl::create(C, SourceLoc(),
1103-
StaticSpellingKind::None,
1104-
SourceLoc(), hashValuePat, nullptr,
1105-
parentDC);
1106-
patDecl->setImplicit();
1107-
1100+
auto *patDecl = PatternBindingDecl::createImplicit(
1101+
C, StaticSpellingKind::None, hashValuePat, /*InitExpr*/ nullptr,
1102+
parentDC);
11081103
C.addSynthesizedDecl(hashValueDecl);
11091104
C.addSynthesizedDecl(getterDecl);
11101105

lib/Sema/DerivedConformances.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -363,12 +363,8 @@ DerivedConformance::declareDerivedProperty(Identifier name,
363363
/*implicit*/ true);
364364
propPat->setType(propertyContextType);
365365

366-
auto pbDecl = PatternBindingDecl::create(C, SourceLoc(),
367-
StaticSpellingKind::None,
368-
SourceLoc(), propPat, nullptr,
369-
parentDC);
370-
pbDecl->setImplicit();
371-
366+
auto *pbDecl = PatternBindingDecl::createImplicit(
367+
C, StaticSpellingKind::None, propPat, /*InitExpr*/ nullptr, parentDC);
372368
return {propDecl, pbDecl};
373369
}
374370

lib/Sema/PCMacro.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -487,10 +487,8 @@ class Instrumenter : InstrumenterBase {
487487
VD->setImplicit();
488488

489489
NamedPattern *NP = new (Context) NamedPattern(VD, /*implicit*/ true);
490-
PatternBindingDecl *PBD = PatternBindingDecl::create(
491-
Context, SourceLoc(), StaticSpellingKind::None, SourceLoc(), NP,
492-
MaybeLoadInitExpr, TypeCheckDC);
493-
PBD->setImplicit();
490+
PatternBindingDecl *PBD = PatternBindingDecl::createImplicit(
491+
Context, StaticSpellingKind::None, NP, MaybeLoadInitExpr, TypeCheckDC);
494492

495493
return std::make_pair(PBD, VD);
496494
}

lib/Sema/PlaygroundTransform.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -754,10 +754,8 @@ class Instrumenter : InstrumenterBase {
754754
VD->setImplicit();
755755

756756
NamedPattern *NP = new (Context) NamedPattern(VD, /*implicit*/ true);
757-
PatternBindingDecl *PBD = PatternBindingDecl::create(
758-
Context, SourceLoc(), StaticSpellingKind::None, SourceLoc(), NP,
759-
MaybeLoadInitExpr, TypeCheckDC);
760-
PBD->setImplicit();
757+
PatternBindingDecl *PBD = PatternBindingDecl::createImplicit(
758+
Context, StaticSpellingKind::None, NP, MaybeLoadInitExpr, TypeCheckDC);
761759

762760
return std::make_pair(PBD, VD);
763761
}

lib/Sema/TypeCheckStmt.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -642,11 +642,9 @@ class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
642642
// Create a pattern binding to initialize the generator.
643643
auto genPat = new (TC.Context) NamedPattern(generator);
644644
genPat->setImplicit();
645-
auto genBinding =
646-
PatternBindingDecl::create(TC.Context, SourceLoc(),
647-
StaticSpellingKind::None,
648-
S->getForLoc(), genPat, getIterator, DC);
649-
genBinding->setImplicit();
645+
auto *genBinding = PatternBindingDecl::createImplicit(
646+
TC.Context, StaticSpellingKind::None, genPat, getIterator, DC,
647+
/*VarLoc*/ S->getForLoc());
650648
S->setIterator(genBinding);
651649
}
652650

0 commit comments

Comments
 (0)