mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
[AST] Use PatternBindingDecl::createImplicit in more places
And simplify the implementation of `create`.
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user