[AST] Use PatternBindingDecl::createImplicit in more places

And simplify the implementation of `create`.
This commit is contained in:
Hamish Knight
2023-12-15 19:53:51 +00:00
parent ab9b3ffa7b
commit f10365597d
2 changed files with 23 additions and 39 deletions

View File

@@ -1882,27 +1882,18 @@ PatternBindingDecl::create(ASTContext &Ctx, SourceLoc StaticLoc,
StaticSpellingKind StaticSpelling, SourceLoc VarLoc,
Pattern *Pat, SourceLoc EqualLoc, Expr *E,
DeclContext *Parent) {
DeclContext *BindingInitContext = nullptr;
if (!Parent->isLocalContext())
BindingInitContext = new (Ctx) PatternBindingInitializer(Parent);
auto PBE = PatternBindingEntry(Pat, EqualLoc, E, BindingInitContext);
auto *Result = create(Ctx, StaticLoc, StaticSpelling, VarLoc, PBE, Parent);
if (BindingInitContext)
cast<PatternBindingInitializer>(BindingInitContext)->setBinding(Result, 0);
return Result;
// We can provide a null context, 'create' will fill it in for us.
// FIXME: This seems dubious, see the comment in 'create'.
auto PBE = PatternBindingEntry(Pat, EqualLoc, E, /*InitContext*/ nullptr);
return create(Ctx, StaticLoc, StaticSpelling, VarLoc, PBE, Parent);
}
PatternBindingDecl *PatternBindingDecl::createImplicit(
ASTContext &Ctx, StaticSpellingKind StaticSpelling, Pattern *Pat, Expr *E,
DeclContext *Parent, SourceLoc VarLoc) {
auto *Result = create(Ctx, /*StaticLoc*/ SourceLoc(), StaticSpelling, VarLoc,
Pat, /*EqualLoc*/ SourceLoc(), nullptr, Parent);
Pat, /*EqualLoc*/ SourceLoc(), E, Parent);
Result->setImplicit();
Result->setInit(0, E);
Result->setOriginalInit(0, E);
return Result;
}
@@ -1937,6 +1928,10 @@ PatternBindingDecl::create(ASTContext &Ctx, SourceLoc StaticLoc,
auto &newEntry = entries[elt];
newEntry = pe; // This should take care of initializer with flags
DeclContext *initContext = pe.getInitContext();
// FIXME: We ought to reconsider this since it won't recontextualize any
// closures/decls present in the initialization expr. This currently should
// only affect implicit code though.
if (!initContext && !Parent->isLocalContext()) {
auto pbi = new (Ctx) PatternBindingInitializer(Parent);
pbi->setBinding(PBD, elt);

View File

@@ -1827,19 +1827,13 @@ namespace {
dc);
capture->setImplicit();
capture->setInterfaceType(base->getType()->mapTypeOutOfContext());
NamedPattern *capturePat = new (context) NamedPattern(capture);
capturePat->setImplicit();
capturePat->setType(base->getType());
auto capturePBE = PatternBindingEntry(capturePat,
SourceLoc(), base, dc);
auto captureDecl = PatternBindingDecl::create(context, SourceLoc(),
{}, SourceLoc(),
capturePBE,
dc);
captureDecl->setImplicit();
auto *capturePat =
NamedPattern::createImplicit(context, capture, base->getType());
auto *captureDecl = PatternBindingDecl::createImplicit(
context, StaticSpellingKind::None, capturePat, base, dc);
// Write the closure in terms of the capture.
auto baseRef = new (context)
DeclRefExpr(capture, DeclNameLoc(base->getLoc()), /*implicit*/ true);
@@ -5221,19 +5215,14 @@ namespace {
dc);
outerParam->setImplicit();
outerParam->setInterfaceType(keyPathTy->mapTypeOutOfContext());
NamedPattern *outerParamPat = new (ctx) NamedPattern(outerParam);
outerParamPat->setImplicit();
outerParamPat->setType(keyPathTy);
auto outerParamPBE = PatternBindingEntry(outerParamPat,
SourceLoc(), E, dc);
auto *outerParamPat =
NamedPattern::createImplicit(ctx, outerParam, keyPathTy);
solution.setExprTypes(E);
auto outerParamDecl = PatternBindingDecl::create(ctx, SourceLoc(),
{}, SourceLoc(),
outerParamPBE,
dc);
outerParamDecl->setImplicit();
auto *outerParamDecl = PatternBindingDecl::createImplicit(
ctx, StaticSpellingKind::None, outerParamPat, E, dc);
auto outerParamCapture = CaptureListEntry(outerParamDecl);
auto captureExpr = CaptureListExpr::create(ctx, outerParamCapture,
closure);