Skip to content

Commit 9710a65

Browse files
committed
[ASTGen] Better handle ParamDecl arg/param name generation
Move the logic onto the ASTGen side, and plumb through the flag that will allow subscripts to have a different argument name defaulting behavior.
1 parent 29bfdac commit 9710a65

File tree

5 files changed

+57
-44
lines changed

5 files changed

+57
-44
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -426,13 +426,13 @@ BridgedPatternBindingDecl BridgedPatternBindingDecl_createParsed(
426426
BridgedSourceLoc cBindingKeywordLoc, BridgedArrayRef cBindingEntries,
427427
bool isStatic, bool isLet);
428428

429-
SWIFT_NAME("BridgedParamDecl.createParsed(_:declContext:specifierLoc:firstName:"
430-
"firstNameLoc:secondName:secondNameLoc:type:defaultValue:)")
429+
SWIFT_NAME("BridgedParamDecl.createParsed(_:declContext:specifierLoc:argName:"
430+
"argNameLoc:paramName:paramNameLoc:type:defaultValue:)")
431431
BridgedParamDecl BridgedParamDecl_createParsed(
432432
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
433-
BridgedSourceLoc cSpecifierLoc, BridgedIdentifier cFirstName,
434-
BridgedSourceLoc cFirstNameLoc, BridgedIdentifier cSecondName,
435-
BridgedSourceLoc cSecondNameLoc, BridgedNullableTypeRepr type,
433+
BridgedSourceLoc cSpecifierLoc, BridgedIdentifier cArgName,
434+
BridgedSourceLoc cArgNameLoc, BridgedIdentifier cParamName,
435+
BridgedSourceLoc cParamNameLoc, BridgedNullableTypeRepr type,
436436
BridgedNullableExpr defaultValue);
437437

438438
SWIFT_NAME("BridgedConstructorDecl.setParsedBody(self:_:)")

lib/AST/ASTBridging.cpp

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -398,21 +398,10 @@ BridgedPatternBindingDecl BridgedPatternBindingDecl_createParsed(
398398

399399
BridgedParamDecl BridgedParamDecl_createParsed(
400400
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
401-
BridgedSourceLoc cSpecifierLoc, BridgedIdentifier cFirstName,
402-
BridgedSourceLoc cFirstNameLoc, BridgedIdentifier cSecondName,
403-
BridgedSourceLoc cSecondNameLoc, BridgedNullableTypeRepr opaqueType,
401+
BridgedSourceLoc cSpecifierLoc, BridgedIdentifier cArgName,
402+
BridgedSourceLoc cArgNameLoc, BridgedIdentifier cParamName,
403+
BridgedSourceLoc cParamNameLoc, BridgedNullableTypeRepr opaqueType,
404404
BridgedNullableExpr opaqueDefaultValue) {
405-
auto firstName = cFirstName.unbridged();
406-
auto firstNameLoc = cFirstNameLoc.unbridged();
407-
auto secondName = cSecondName.unbridged();
408-
auto secondNameLoc = cSecondNameLoc.unbridged();
409-
410-
assert(secondNameLoc.isValid() == secondName.nonempty());
411-
if (secondName.empty()) {
412-
secondName = firstName;
413-
secondNameLoc = firstNameLoc;
414-
}
415-
416405
auto *declContext = cDeclContext.unbridged();
417406

418407
auto *defaultValue = opaqueDefaultValue.unbridged();
@@ -426,9 +415,9 @@ BridgedParamDecl BridgedParamDecl_createParsed(
426415
defaultArgumentKind = getDefaultArgKind(defaultValue);
427416
}
428417

429-
auto *paramDecl = new (cContext.unbridged())
430-
ParamDecl(cSpecifierLoc.unbridged(), firstNameLoc, firstName,
431-
secondNameLoc, secondName, declContext);
418+
auto *paramDecl = new (cContext.unbridged()) ParamDecl(
419+
cSpecifierLoc.unbridged(), cArgNameLoc.unbridged(), cArgName.unbridged(),
420+
cParamNameLoc.unbridged(), cParamName.unbridged(), declContext);
432421

433422
if (auto type = opaqueType.unbridged()) {
434423
paramDecl->setTypeRepr(type);

lib/ASTGen/Sources/ASTGen/Decls.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -498,7 +498,7 @@ extension ASTGenVisitor {
498498
name: name,
499499
nameLoc: nameLoc,
500500
genericParamList: self.generate(genericParameterClause: node.genericParameterClause),
501-
parameterList: self.generate(functionParameterClause: node.signature.parameterClause),
501+
parameterList: self.generate(functionParameterClause: node.signature.parameterClause, forSubscript: false),
502502
asyncSpecifierLoc: self.generateSourceLoc(node.signature.effectSpecifiers?.asyncSpecifier),
503503
throwsSpecifierLoc: self.generateSourceLoc(node.signature.effectSpecifiers?.throwsSpecifier),
504504
thrownType: self.generate(type: node.signature.effectSpecifiers?.thrownError),
@@ -523,7 +523,7 @@ extension ASTGenVisitor {
523523
failabilityMarkLoc: self.generateSourceLoc(node.optionalMark),
524524
isIUO: node.optionalMark?.rawTokenKind == .exclamationMark,
525525
genericParamList: self.generate(genericParameterClause: node.genericParameterClause),
526-
parameterList: self.generate(functionParameterClause: node.signature.parameterClause),
526+
parameterList: self.generate(functionParameterClause: node.signature.parameterClause, forSubscript: false),
527527
asyncSpecifierLoc: self.generateSourceLoc(node.signature.effectSpecifiers?.asyncSpecifier),
528528
throwsSpecifierLoc: self.generateSourceLoc(node.signature.effectSpecifiers?.throwsSpecifier),
529529
thrownType: self.generate(type: node.signature.effectSpecifiers?.thrownError),

lib/ASTGen/Sources/ASTGen/ParameterClause.swift

Lines changed: 42 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -61,22 +61,41 @@ extension EnumCaseParameterSyntax: ValueParameterSyntax {
6161
}
6262

6363
extension ASTGenVisitor {
64-
func generate(functionParameter node: FunctionParameterSyntax) -> BridgedParamDecl {
65-
self.makeParamDecl(node)
64+
func generate(functionParameter node: FunctionParameterSyntax, forSubscript: Bool) -> BridgedParamDecl {
65+
// For non-subscripts, the argument name is defaulted to the parameter name.
66+
self.makeParamDecl(node, argNameByDefault: !forSubscript)
6667
}
6768

6869
func generate(enumCaseParameter node: EnumCaseParameterSyntax) -> BridgedParamDecl {
69-
self.makeParamDecl(node)
70+
self.makeParamDecl(node, argNameByDefault: true)
7071
}
7172

72-
private func makeParamDecl(_ node: some ValueParameterSyntax) -> BridgedParamDecl {
73+
/// Generate a ParamDecl. If `argNameByDefault` is true, then the parameter's
74+
/// argument label is inferred from the first name if no second name is present.
75+
private func makeParamDecl(_ node: some ValueParameterSyntax, argNameByDefault: Bool) -> BridgedParamDecl {
7376
// FIXME: This location should be derived from the type repr.
7477
let specifierLoc: BridgedSourceLoc = nil
7578

76-
let (firstName, firstNameLoc) =
77-
self.generateIdentifierAndSourceLoc(node.optionalFirstName)
78-
let (secondName, secondNameLoc) =
79-
self.generateIdentifierAndSourceLoc(node.secondName)
79+
let paramName: BridgedIdentifier
80+
let paramNameLoc: BridgedSourceLoc
81+
let argName: BridgedIdentifier
82+
let argNameLoc: BridgedSourceLoc
83+
84+
// Map the first name and second name to argument name and parameter name.
85+
// If we have both, use them. If we only have one, then use that as the
86+
// parameter name, inferring it as the argument name if we're allowed to.
87+
switch (node.optionalFirstName, node.secondName) {
88+
case let (argNameNode?, paramNameNode?):
89+
(argName, argNameLoc) = self.generateIdentifierAndSourceLoc(argNameNode)
90+
(paramName, paramNameLoc) = self.generateIdentifierAndSourceLoc(paramNameNode)
91+
case let (nameNode?, nil):
92+
(paramName, paramNameLoc) = self.generateIdentifierAndSourceLoc(nameNode)
93+
(argName, argNameLoc) = argNameByDefault ? (paramName, paramNameLoc) : (nil, nil)
94+
case (nil, _?):
95+
preconditionFailure("If only one name is present, it should be the first")
96+
default:
97+
(argName, argNameLoc, paramName, paramNameLoc) = (nil, nil, nil, nil)
98+
}
8099

81100
var type = node.optionalType.map(generate(type:))
82101
if let ellipsis = node.ellipsis, let base = type {
@@ -92,10 +111,10 @@ extension ASTGenVisitor {
92111
self.ctx,
93112
declContext: self.declContext,
94113
specifierLoc: specifierLoc,
95-
firstName: firstName,
96-
firstNameLoc: firstNameLoc,
97-
secondName: secondName,
98-
secondNameLoc: secondNameLoc,
114+
argName: argName,
115+
argNameLoc: argNameLoc,
116+
paramName: paramName,
117+
paramNameLoc: paramNameLoc,
99118
type: type.asNullable,
100119
defaultValue: self.generate(expr: node.defaultValue?.value)
101120
)
@@ -105,11 +124,14 @@ extension ASTGenVisitor {
105124
// MARK: - ParameterList
106125

107126
extension ASTGenVisitor {
108-
func generate(functionParameterClause node: FunctionParameterClauseSyntax) -> BridgedParameterList {
127+
func generate(
128+
functionParameterClause node: FunctionParameterClauseSyntax,
129+
forSubscript: Bool
130+
) -> BridgedParameterList {
109131
BridgedParameterList.createParsed(
110132
self.ctx,
111133
leftParenLoc: self.generateSourceLoc(node.leftParen),
112-
parameters: self.generate(functionParameterList: node.parameters),
134+
parameters: self.generate(functionParameterList: node.parameters, forSubscript: forSubscript),
113135
rightParenLoc: self.generateSourceLoc(node.rightParen)
114136
)
115137
}
@@ -129,10 +151,10 @@ extension ASTGenVisitor {
129151
self.ctx,
130152
declContext: self.declContext,
131153
specifierLoc: nil,
132-
firstName: nil,
133-
firstNameLoc: nil,
134-
secondName: name,
135-
secondNameLoc: nameLoc,
154+
argName: nil,
155+
argNameLoc: nil,
156+
paramName: name,
157+
paramNameLoc: nameLoc,
136158
type: nil,
137159
defaultValue: nil
138160
)
@@ -147,7 +169,7 @@ extension ASTGenVisitor {
147169

148170
extension ASTGenVisitor {
149171
@inline(__always)
150-
func generate(functionParameterList node: FunctionParameterListSyntax) -> BridgedArrayRef {
151-
node.lazy.map(self.generate).bridgedArray(in: self)
172+
func generate(functionParameterList node: FunctionParameterListSyntax, forSubscript: Bool) -> BridgedArrayRef {
173+
node.lazy.map({ self.generate(functionParameter: $0, forSubscript: forSubscript) }).bridgedArray(in: self)
152174
}
153175
}

test/ASTGen/verify-parse.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ func test11() {
107107
var binding1 = 0, binding2 = ""
108108
}
109109

110+
func test12(_: Int) {}
111+
110112
func testVars() {
111113
var a = 0
112114
var b: Int = 0

0 commit comments

Comments
 (0)