Skip to content

Commit f103655

Browse files
committed
[AST] Use PatternBindingDecl::createImplicit in more places
And simplify the implementation of `create`.
1 parent ab9b3ff commit f103655

File tree

2 files changed

+23
-39
lines changed

2 files changed

+23
-39
lines changed

lib/AST/Decl.cpp

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1882,27 +1882,18 @@ PatternBindingDecl::create(ASTContext &Ctx, SourceLoc StaticLoc,
18821882
StaticSpellingKind StaticSpelling, SourceLoc VarLoc,
18831883
Pattern *Pat, SourceLoc EqualLoc, Expr *E,
18841884
DeclContext *Parent) {
1885-
DeclContext *BindingInitContext = nullptr;
1886-
if (!Parent->isLocalContext())
1887-
BindingInitContext = new (Ctx) PatternBindingInitializer(Parent);
1888-
1889-
auto PBE = PatternBindingEntry(Pat, EqualLoc, E, BindingInitContext);
1890-
auto *Result = create(Ctx, StaticLoc, StaticSpelling, VarLoc, PBE, Parent);
1891-
1892-
if (BindingInitContext)
1893-
cast<PatternBindingInitializer>(BindingInitContext)->setBinding(Result, 0);
1894-
1895-
return Result;
1885+
// We can provide a null context, 'create' will fill it in for us.
1886+
// FIXME: This seems dubious, see the comment in 'create'.
1887+
auto PBE = PatternBindingEntry(Pat, EqualLoc, E, /*InitContext*/ nullptr);
1888+
return create(Ctx, StaticLoc, StaticSpelling, VarLoc, PBE, Parent);
18961889
}
18971890

18981891
PatternBindingDecl *PatternBindingDecl::createImplicit(
18991892
ASTContext &Ctx, StaticSpellingKind StaticSpelling, Pattern *Pat, Expr *E,
19001893
DeclContext *Parent, SourceLoc VarLoc) {
19011894
auto *Result = create(Ctx, /*StaticLoc*/ SourceLoc(), StaticSpelling, VarLoc,
1902-
Pat, /*EqualLoc*/ SourceLoc(), nullptr, Parent);
1895+
Pat, /*EqualLoc*/ SourceLoc(), E, Parent);
19031896
Result->setImplicit();
1904-
Result->setInit(0, E);
1905-
Result->setOriginalInit(0, E);
19061897
return Result;
19071898
}
19081899

@@ -1937,6 +1928,10 @@ PatternBindingDecl::create(ASTContext &Ctx, SourceLoc StaticLoc,
19371928
auto &newEntry = entries[elt];
19381929
newEntry = pe; // This should take care of initializer with flags
19391930
DeclContext *initContext = pe.getInitContext();
1931+
1932+
// FIXME: We ought to reconsider this since it won't recontextualize any
1933+
// closures/decls present in the initialization expr. This currently should
1934+
// only affect implicit code though.
19401935
if (!initContext && !Parent->isLocalContext()) {
19411936
auto pbi = new (Ctx) PatternBindingInitializer(Parent);
19421937
pbi->setBinding(PBD, elt);

lib/Sema/CSApply.cpp

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1827,19 +1827,13 @@ namespace {
18271827
dc);
18281828
capture->setImplicit();
18291829
capture->setInterfaceType(base->getType()->mapTypeOutOfContext());
1830-
1831-
NamedPattern *capturePat = new (context) NamedPattern(capture);
1832-
capturePat->setImplicit();
1833-
capturePat->setType(base->getType());
1834-
1835-
auto capturePBE = PatternBindingEntry(capturePat,
1836-
SourceLoc(), base, dc);
1837-
auto captureDecl = PatternBindingDecl::create(context, SourceLoc(),
1838-
{}, SourceLoc(),
1839-
capturePBE,
1840-
dc);
1841-
captureDecl->setImplicit();
1842-
1830+
1831+
auto *capturePat =
1832+
NamedPattern::createImplicit(context, capture, base->getType());
1833+
1834+
auto *captureDecl = PatternBindingDecl::createImplicit(
1835+
context, StaticSpellingKind::None, capturePat, base, dc);
1836+
18431837
// Write the closure in terms of the capture.
18441838
auto baseRef = new (context)
18451839
DeclRefExpr(capture, DeclNameLoc(base->getLoc()), /*implicit*/ true);
@@ -5221,19 +5215,14 @@ namespace {
52215215
dc);
52225216
outerParam->setImplicit();
52235217
outerParam->setInterfaceType(keyPathTy->mapTypeOutOfContext());
5224-
5225-
NamedPattern *outerParamPat = new (ctx) NamedPattern(outerParam);
5226-
outerParamPat->setImplicit();
5227-
outerParamPat->setType(keyPathTy);
5228-
5229-
auto outerParamPBE = PatternBindingEntry(outerParamPat,
5230-
SourceLoc(), E, dc);
5218+
5219+
auto *outerParamPat =
5220+
NamedPattern::createImplicit(ctx, outerParam, keyPathTy);
5221+
52315222
solution.setExprTypes(E);
5232-
auto outerParamDecl = PatternBindingDecl::create(ctx, SourceLoc(),
5233-
{}, SourceLoc(),
5234-
outerParamPBE,
5235-
dc);
5236-
outerParamDecl->setImplicit();
5223+
auto *outerParamDecl = PatternBindingDecl::createImplicit(
5224+
ctx, StaticSpellingKind::None, outerParamPat, E, dc);
5225+
52375226
auto outerParamCapture = CaptureListEntry(outerParamDecl);
52385227
auto captureExpr = CaptureListExpr::create(ctx, outerParamCapture,
52395228
closure);

0 commit comments

Comments
 (0)