Skip to content

Commit e5d5026

Browse files
authored
Merge pull request #79456 from rintaro/astgen-paramdecl
[ASTGen] ParamDecl generation improvements
2 parents fcbb15e + 43eeb14 commit e5d5026

19 files changed

+202
-117
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -631,6 +631,15 @@ SWIFT_NAME("getter:BridgedPatternBindingInitializer.asDeclContext(self:)")
631631
BridgedDeclContext BridgedPatternBindingInitializer_asDeclContext(
632632
BridgedPatternBindingInitializer cInit);
633633

634+
SWIFT_NAME("BridgedDefaultArgumentInitializer.create(declContext:index:)")
635+
BridgedDefaultArgumentInitializer
636+
BridgedDefaultArgumentInitializer_create(BridgedDeclContext cDeclContext,
637+
size_t index);
638+
639+
SWIFT_NAME("getter:BridgedDefaultArgumentInitializer.asDeclContext(self:)")
640+
BridgedDeclContext DefaultArgumentInitializer_asDeclContext(
641+
BridgedDefaultArgumentInitializer cInit);
642+
634643
SWIFT_NAME("BridgedCustomAttributeInitializer.create(declContext:)")
635644
BridgedCustomAttributeInitializer
636645
BridgedCustomAttributeInitializer_create(BridgedDeclContext cDeclContext);
@@ -1302,13 +1311,15 @@ BridgedPatternBindingDecl BridgedPatternBindingDecl_createParsed(
13021311
BridgedVarDeclIntroducer cIntorducer, BridgedArrayRef cBindingEntries);
13031312

13041313
SWIFT_NAME("BridgedParamDecl.createParsed(_:declContext:specifierLoc:argName:"
1305-
"argNameLoc:paramName:paramNameLoc:type:defaultValue:)")
1314+
"argNameLoc:paramName:paramNameLoc:type:defaultValue:"
1315+
"defaultValueInitContext:)")
13061316
BridgedParamDecl BridgedParamDecl_createParsed(
13071317
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
13081318
BridgedSourceLoc cSpecifierLoc, BridgedIdentifier cArgName,
13091319
BridgedSourceLoc cArgNameLoc, BridgedIdentifier cParamName,
13101320
BridgedSourceLoc cParamNameLoc, BridgedNullableTypeRepr type,
1311-
BridgedNullableExpr defaultValue);
1321+
BridgedNullableExpr defaultValue,
1322+
BridgedNullableDefaultArgumentInitializer cDefaultArgumentInitContext);
13121323

13131324
/// The various spellings of ownership modifier that can be used in source.
13141325
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedParamSpecifier {

include/swift/AST/ASTBridgingWrappers.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ AST_BRIDGING_WRAPPER_NULLABLE(GenericParamList)
108108
AST_BRIDGING_WRAPPER_NULLABLE(TrailingWhereClause)
109109
AST_BRIDGING_WRAPPER_NULLABLE(ParameterList)
110110
AST_BRIDGING_WRAPPER_NULLABLE(PatternBindingInitializer)
111+
AST_BRIDGING_WRAPPER_NULLABLE(DefaultArgumentInitializer)
111112
AST_BRIDGING_WRAPPER_NULLABLE(CustomAttributeInitializer)
112113
AST_BRIDGING_WRAPPER_NONNULL(TypeAttributes)
113114
AST_BRIDGING_WRAPPER_NONNULL(CustomAttribute)

include/swift/AST/Decl.h

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6859,6 +6859,7 @@ class VarDecl : public AbstractStorageDecl {
68596859

68606860
/// A function parameter declaration.
68616861
class ParamDecl : public VarDecl {
6862+
friend class ParameterList;
68626863
friend class DefaultArgumentInitContextRequest;
68636864
friend class DefaultArgumentExprRequest;
68646865
friend class DefaultArgumentTypeRequest;
@@ -6885,15 +6886,17 @@ class ParamDecl : public VarDecl {
68856886

68866887
/// Stores the context for the default argument as well as a bit to
68876888
/// indicate whether the default expression has been type-checked.
6888-
llvm::PointerIntPair<Initializer *, 1, bool> InitContextAndIsTypeChecked;
6889+
llvm::PointerIntPair<DefaultArgumentInitializer *, 1, bool>
6890+
InitContextAndIsTypeChecked;
68896891

68906892
StringRef StringRepresentation;
68916893
CaptureInfo Captures;
68926894
};
68936895

68946896
/// Retrieve the cached initializer context for the parameter's default
68956897
/// argument without triggering a request.
6896-
std::optional<Initializer *> getCachedDefaultArgumentInitContext() const;
6898+
std::optional<DefaultArgumentInitializer *>
6899+
getCachedDefaultArgumentInitContext() const;
68976900

68986901
/// NOTE: This is stored using bits from TyReprAndFlags and
68996902
/// DefaultValueAndFlags.
@@ -7002,12 +7005,11 @@ class ParamDecl : public VarDecl {
70027005
DeclContext *Parent,
70037006
ParamSpecifier specifier = ParamSpecifier::Default);
70047007

7005-
static ParamDecl *createParsed(ASTContext &Context, SourceLoc specifierLoc,
7006-
SourceLoc argumentNameLoc,
7007-
Identifier argumentName,
7008-
SourceLoc parameterNameLoc,
7009-
Identifier parameterName, Expr *defaultValue,
7010-
DeclContext *dc);
7008+
static ParamDecl *createParsed(
7009+
ASTContext &Context, SourceLoc specifierLoc, SourceLoc argumentNameLoc,
7010+
Identifier argumentName, SourceLoc parameterNameLoc,
7011+
Identifier parameterName, Expr *defaultValue,
7012+
DefaultArgumentInitializer *defaultValueInitContext, DeclContext *dc);
70117013

70127014
/// Retrieve the argument (API) name for this function parameter.
70137015
Identifier getArgumentName() const {
@@ -7118,7 +7120,7 @@ class ParamDecl : public VarDecl {
71187120
/// Retrieve the initializer context for the parameter's default argument.
71197121
Initializer *getDefaultArgumentInitContext() const;
71207122

7121-
void setDefaultArgumentInitContext(Initializer *initContext);
7123+
void setDefaultArgumentInitContext(DefaultArgumentInitializer *initContext);
71227124

71237125
CaptureInfo getDefaultArgumentCaptureInfo() const;
71247126

include/swift/AST/Initializer.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,18 +126,24 @@ class PatternBindingInitializer : public Initializer {
126126
/// A default argument expression. The parent context is the function
127127
/// (possibly a closure) for which this is a default argument.
128128
class DefaultArgumentInitializer : public Initializer {
129-
public:
130129
explicit DefaultArgumentInitializer(DeclContext *parent, unsigned index)
131130
: Initializer(InitializerKind::DefaultArgument, parent) {
132131
SpareBits = index;
133132
}
134133

134+
public:
135+
static DefaultArgumentInitializer *create(DeclContext *parent,
136+
unsigned index) {
137+
return new (parent->getASTContext())
138+
DefaultArgumentInitializer(parent, index);
139+
}
140+
135141
unsigned getIndex() const { return SpareBits; }
136142

137143
/// Change the parent of this context. This is necessary because
138144
/// the function signature is parsed before the function
139145
/// declaration/expression itself is built.
140-
void changeFunction(DeclContext *parent, ParameterList *paramLists);
146+
void changeFunction(DeclContext *parent);
141147

142148
static bool classof(const DeclContext *DC) {
143149
if (auto init = dyn_cast<Initializer>(DC))

include/swift/AST/TypeCheckRequests.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3136,7 +3136,7 @@ class DistributedModuleIsAvailableRequest
31363136
/// Computes an initializer context for a parameter with a default argument.
31373137
class DefaultArgumentInitContextRequest
31383138
: public SimpleRequest<DefaultArgumentInitContextRequest,
3139-
Initializer *(ParamDecl *),
3139+
DefaultArgumentInitializer *(ParamDecl *),
31403140
RequestFlags::SeparatelyCached> {
31413141
public:
31423142
using SimpleRequest::SimpleRequest;
@@ -3145,14 +3145,14 @@ class DefaultArgumentInitContextRequest
31453145
friend SimpleRequest;
31463146

31473147
// Evaluation.
3148-
Initializer * evaluate(Evaluator &evaluator,
3149-
ParamDecl *param) const;
3148+
DefaultArgumentInitializer *evaluate(Evaluator &evaluator,
3149+
ParamDecl *param) const;
31503150

31513151
public:
31523152
// Separate caching.
31533153
bool isCached() const { return true; }
3154-
std::optional<Initializer *> getCachedResult() const;
3155-
void cacheResult(Initializer *init) const;
3154+
std::optional<DefaultArgumentInitializer *> getCachedResult() const;
3155+
void cacheResult(DefaultArgumentInitializer *init) const;
31563156
};
31573157

31583158
/// Computes the fully type-checked default argument expression for a given

include/swift/Parse/Parser.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1504,7 +1504,6 @@ class Parser {
15041504
/// A structure for collecting information about the default
15051505
/// arguments of a context.
15061506
struct DefaultArgumentInfo {
1507-
llvm::SmallVector<DefaultArgumentInitializer *, 4> ParsedContexts;
15081507
unsigned NextIndex : 31;
15091508

15101509
/// Track whether or not one of the parameters in a signature's argument
@@ -1515,10 +1514,6 @@ class Parser {
15151514
/// all the arguments, not just those that have default arguments.
15161515
unsigned claimNextIndex() { return NextIndex++; }
15171516

1518-
/// Set the parsed context of all default argument initializers to
1519-
/// the given function, enum case or subscript.
1520-
void setFunctionContext(DeclContext *DC, ParameterList *paramList);
1521-
15221517
DefaultArgumentInfo() {
15231518
NextIndex = 0;
15241519
HasDefaultArgument = false;
@@ -1567,6 +1562,9 @@ class Parser {
15671562
/// The default argument for this parameter.
15681563
Expr *DefaultArg = nullptr;
15691564

1565+
/// The default argument for this parameter.
1566+
DefaultArgumentInitializer *DefaultArgInitContext = nullptr;
1567+
15701568
/// True if we emitted a parse error about this parameter.
15711569
bool isInvalid = false;
15721570

lib/AST/Bridging/DeclBridging.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -194,11 +194,13 @@ BridgedParamDecl BridgedParamDecl_createParsed(
194194
BridgedSourceLoc cSpecifierLoc, BridgedIdentifier cArgName,
195195
BridgedSourceLoc cArgNameLoc, BridgedIdentifier cParamName,
196196
BridgedSourceLoc cParamNameLoc, BridgedNullableTypeRepr opaqueType,
197-
BridgedNullableExpr opaqueDefaultValue) {
197+
BridgedNullableExpr cDefaultArgument,
198+
BridgedNullableDefaultArgumentInitializer cDefaultArgumentInitContext) {
198199
auto *paramDecl = ParamDecl::createParsed(
199200
cContext.unbridged(), cSpecifierLoc.unbridged(), cArgNameLoc.unbridged(),
200201
cArgName.unbridged(), cParamNameLoc.unbridged(), cParamName.unbridged(),
201-
opaqueDefaultValue.unbridged(), cDeclContext.unbridged());
202+
cDefaultArgument.unbridged(), cDefaultArgumentInitContext.unbridged(),
203+
cDeclContext.unbridged());
202204

203205
if (auto type = opaqueType.unbridged()) {
204206
paramDecl->setTypeRepr(type);

lib/AST/Bridging/DeclContextBridging.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,17 @@ BridgedDeclContext BridgedPatternBindingInitializer_asDeclContext(
3131
return cInit.unbridged();
3232
}
3333

34+
BridgedDefaultArgumentInitializer
35+
BridgedDefaultArgumentInitializer_create(BridgedDeclContext cDeclContext,
36+
size_t index) {
37+
return DefaultArgumentInitializer::create(cDeclContext.unbridged(), index);
38+
}
39+
40+
BridgedDeclContext DefaultArgumentInitializer_asDeclContext(
41+
BridgedDefaultArgumentInitializer cInit) {
42+
return cInit.unbridged();
43+
}
44+
3445
BridgedCustomAttributeInitializer
3546
BridgedCustomAttributeInitializer_create(BridgedDeclContext cDeclContext) {
3647
return CustomAttributeInitializer::create(cDeclContext.unbridged());

lib/AST/Decl.cpp

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -8685,27 +8685,30 @@ static DefaultArgumentKind computeDefaultArgumentKind(DeclContext *dc,
86858685
llvm_unreachable("Unhandled MagicIdentifierLiteralExpr in switch.");
86868686
}
86878687

8688-
ParamDecl *ParamDecl::createParsed(ASTContext &Context, SourceLoc specifierLoc,
8689-
SourceLoc argumentNameLoc,
8690-
Identifier argumentName,
8691-
SourceLoc parameterNameLoc,
8692-
Identifier parameterName, Expr *defaultValue,
8693-
DeclContext *dc) {
8688+
ParamDecl *ParamDecl::createParsed(
8689+
ASTContext &Context, SourceLoc specifierLoc, SourceLoc argumentNameLoc,
8690+
Identifier argumentName, SourceLoc parameterNameLoc,
8691+
Identifier parameterName, Expr *defaultValue,
8692+
DefaultArgumentInitializer *defaultValueInitContext, DeclContext *dc) {
86948693
auto *decl =
86958694
new (Context) ParamDecl(specifierLoc, argumentNameLoc, argumentName,
86968695
parameterNameLoc, parameterName, dc);
86978696

8698-
const auto kind = computeDefaultArgumentKind(dc, defaultValue);
8699-
if (kind == DefaultArgumentKind::Inherited) {
8700-
// The 'super' in inherited default arguments is a specifier rather than an
8701-
// expression.
8702-
// TODO: However, we may want to retain its location for diagnostics.
8703-
defaultValue = nullptr;
8697+
if (defaultValue) {
8698+
const auto kind = computeDefaultArgumentKind(dc, defaultValue);
8699+
if (kind == DefaultArgumentKind::Inherited) {
8700+
// The 'super' in inherited default arguments is a specifier rather than
8701+
// an expression.
8702+
// TODO: However, we may want to retain its location for diagnostics.
8703+
defaultValue = nullptr;
8704+
}
8705+
ASSERT(defaultValueInitContext);
8706+
decl->setDefaultExpr(defaultValue);
8707+
decl->setDefaultArgumentKind(kind);
8708+
if (defaultValue)
8709+
decl->setDefaultArgumentInitContext(defaultValueInitContext);
87048710
}
87058711

8706-
decl->setDefaultExpr(defaultValue);
8707-
decl->setDefaultArgumentKind(kind);
8708-
87098712
return decl;
87108713
}
87118714

@@ -8869,7 +8872,7 @@ AnyFunctionType::Param ParamDecl::toFunctionParam(Type type) const {
88698872
return AnyFunctionType::Param(type, label, flags, internalLabel);
88708873
}
88718874

8872-
std::optional<Initializer *>
8875+
std::optional<DefaultArgumentInitializer *>
88738876
ParamDecl::getCachedDefaultArgumentInitContext() const {
88748877
if (auto *defaultInfo = DefaultValueAndFlags.getPointer())
88758878
if (auto *init = defaultInfo->InitContextAndIsTypeChecked.getPointer())
@@ -9042,7 +9045,8 @@ CustomAttr *ValueDecl::getAttachedResultBuilder() const {
90429045
nullptr);
90439046
}
90449047

9045-
void ParamDecl::setDefaultArgumentInitContext(Initializer *initContext) {
9048+
void ParamDecl::setDefaultArgumentInitContext(
9049+
DefaultArgumentInitializer *initContext) {
90469050
auto oldContext = getCachedDefaultArgumentInitContext();
90479051
assert((!oldContext || oldContext == initContext) &&
90489052
"Cannot change init context after setting");
@@ -9245,15 +9249,9 @@ ParamDecl::setDefaultValueStringRepresentation(StringRef stringRepresentation) {
92459249
stringRepresentation;
92469250
}
92479251

9248-
void DefaultArgumentInitializer::changeFunction(
9249-
DeclContext *parent, ParameterList *paramList) {
9250-
if (parent->isLocalContext()) {
9251-
setParent(parent);
9252-
}
9253-
9254-
auto param = paramList->get(getIndex());
9255-
if (param->hasDefaultExpr() || param->getStoredProperty())
9256-
param->setDefaultArgumentInitContext(this);
9252+
void DefaultArgumentInitializer::changeFunction(DeclContext *parent) {
9253+
ASSERT(parent->isLocalContext());
9254+
setParent(parent);
92579255
}
92589256

92599257
/// Determine whether the given Swift type is an integral type, i.e.,

lib/AST/Parameter.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,11 @@ ParameterList::create(const ASTContext &C, SourceLoc LParenLoc,
4545
/// Change the DeclContext of any contained parameters to the specified
4646
/// DeclContext.
4747
void ParameterList::setDeclContextOfParamDecls(DeclContext *DC) {
48-
for (auto P : *this)
48+
for (ParamDecl *P : *this) {
4949
P->setDeclContext(DC);
50+
if (auto initContext = P->getCachedDefaultArgumentInitContext())
51+
(*initContext)->changeFunction(DC);
52+
}
5053
}
5154

5255
/// Make a duplicate copy of this parameter list. This allocates copies of

lib/AST/TypeCheckRequests.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1404,13 +1404,14 @@ void HasCircularRawValueRequest::noteCycleStep(DiagnosticEngine &diags) const {
14041404
// DefaultArgumentInitContextRequest computation.
14051405
//----------------------------------------------------------------------------//
14061406

1407-
std::optional<Initializer *>
1407+
std::optional<DefaultArgumentInitializer *>
14081408
DefaultArgumentInitContextRequest::getCachedResult() const {
14091409
auto *param = std::get<0>(getStorage());
14101410
return param->getCachedDefaultArgumentInitContext();
14111411
}
14121412

1413-
void DefaultArgumentInitContextRequest::cacheResult(Initializer *init) const {
1413+
void DefaultArgumentInitContextRequest::cacheResult(
1414+
DefaultArgumentInitializer *init) const {
14141415
auto *param = std::get<0>(getStorage());
14151416
param->setDefaultArgumentInitContext(init);
14161417
}

lib/ASTGen/Sources/ASTGen/Bridge.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ extension BridgedNullableGenericParamList: /*@retroactive*/ swiftASTGen.BridgedN
3636
extension BridgedNullableTrailingWhereClause: /*@retroactive*/ swiftASTGen.BridgedNullable {}
3737
extension BridgedNullableParameterList: /*@retroactive*/ swiftASTGen.BridgedNullable {}
3838
extension BridgedNullablePatternBindingInitializer: /*@retroactive*/ swiftASTGen.BridgedNullable {}
39+
extension BridgedNullableDefaultArgumentInitializer: /*@retroactive*/ swiftASTGen.BridgedNullable {}
3940
extension BridgedNullableCustomAttributeInitializer: /*@retroactive*/ swiftASTGen.BridgedNullable {}
4041
extension BridgedNullableArgumentList: /*@retroactive*/ swiftASTGen.BridgedNullable {}
4142
extension BridgedNullableVarDecl: /*@retroactive*/ swiftASTGen.BridgedNullable {}
@@ -87,6 +88,9 @@ extension BridgedParameterList: BridgedHasNullable {
8788
extension BridgedPatternBindingInitializer: BridgedHasNullable {
8889
typealias Nullable = BridgedNullablePatternBindingInitializer
8990
}
91+
extension BridgedDefaultArgumentInitializer: BridgedHasNullable {
92+
typealias Nullable = BridgedNullableDefaultArgumentInitializer
93+
}
9094
extension BridgedCustomAttributeInitializer: BridgedHasNullable {
9195
typealias Nullable = BridgedNullableCustomAttributeInitializer
9296
}

lib/ASTGen/Sources/ASTGen/Exprs.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,8 @@ extension ASTGenVisitor {
366366
paramName: ctx.getDollarIdentifier(idx),
367367
paramNameLoc: loc,
368368
type: nil,
369-
defaultValue: nil
369+
defaultValue: nil,
370+
defaultValueInitContext: nil
370371
)
371372
param.setSpecifier(.default)
372373
param.setImplicit()

0 commit comments

Comments
 (0)