Skip to content

Commit d06bb9c

Browse files
committed
Model parameter modifiers as a ModifierList
This allows more flexibility in the future if more parameters get added in the future and if those might be ordered arbitrarily. It also makes fixing a parsing issue in the C++ parser easier.
1 parent 2a65025 commit d06bb9c

File tree

12 files changed

+252
-237
lines changed

12 files changed

+252
-237
lines changed

CodeGeneration/Sources/SyntaxSupport/gyb_generated/DeclNodes.swift

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -722,12 +722,10 @@ public let DECL_NODES: [Node] = [
722722
kind: "AttributeList",
723723
isOptional: true,
724724
collectionElementName: "Attribute"),
725-
Child(name: "IsolatedToken",
726-
kind: "Token",
727-
isOptional: true),
728-
Child(name: "ConstToken",
729-
kind: "Token",
730-
isOptional: true),
725+
Child(name: "Modifiers",
726+
kind: "ModifierList",
727+
isOptional: true,
728+
collectionElementName: "Modifier"),
731729
Child(name: "FirstName",
732730
kind: "Token",
733731
isOptional: true,

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ let package = Package(
172172
.testTarget(
173173
name: "SwiftParserTest",
174174
dependencies: ["SwiftDiagnostics", "SwiftOperators", "SwiftParser",
175-
"_SwiftSyntaxTestSupport"]
175+
"_SwiftSyntaxTestSupport", "SwiftSyntaxBuilder"]
176176
),
177177
.testTarget(
178178
name: "SwiftOperatorsTest",

Sources/SwiftParser/Declarations.swift

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1257,6 +1257,26 @@ extension Parser {
12571257
}
12581258
}
12591259

1260+
mutating func parseParameterModifiers(for subject: ParameterSubject) -> RawModifierListSyntax? {
1261+
var elements = [RawDeclModifierSyntax]()
1262+
var loopCondition = LoopProgressCondition()
1263+
MODIFIER_LOOP: while loopCondition.evaluate(currentToken) {
1264+
switch self.at(anyIn: ParameterModifier.self) {
1265+
case (._const, let handle)?:
1266+
elements.append(RawDeclModifierSyntax(name: self.eat(handle), detail: nil, arena: self.arena))
1267+
case (.isolated, let handle)? where !self.lookahead().startsParameterName(subject.isClosure):
1268+
elements.append(RawDeclModifierSyntax(name: self.eat(handle), detail: nil, arena: self.arena))
1269+
default:
1270+
break MODIFIER_LOOP
1271+
}
1272+
}
1273+
if elements.isEmpty {
1274+
return nil
1275+
} else {
1276+
return RawModifierListSyntax(elements: elements, arena: self.arena)
1277+
}
1278+
}
1279+
12601280
@_spi(RawSyntax)
12611281
public mutating func parseParameterClause(for subject: ParameterSubject) -> RawParameterClauseSyntax {
12621282
let (unexpectedBeforeLParen, lparen) = self.expect(.leftParen)
@@ -1280,16 +1300,7 @@ extension Parser {
12801300
attrs = self.parseAttributeList()
12811301
}
12821302

1283-
let unexpectedBeforeIsolated: RawUnexpectedNodesSyntax?
1284-
let isolated: RawTokenSyntax?
1285-
if self.currentToken.isContextualKeyword("isolated") &&
1286-
!self.lookahead().startsParameterName(subject.isClosure) {
1287-
(unexpectedBeforeIsolated, isolated) = self.expectContextualKeyword("isolated")
1288-
} else {
1289-
unexpectedBeforeIsolated = nil
1290-
isolated = nil
1291-
}
1292-
let const = self.consumeIfContextualKeyword("_const")
1303+
let modifiers = parseParameterModifiers(for: subject)
12931304

12941305
let firstName: RawTokenSyntax?
12951306
let secondName: RawTokenSyntax?
@@ -1350,9 +1361,7 @@ extension Parser {
13501361
keepGoing = trailingComma != nil
13511362
elements.append(RawFunctionParameterSyntax(
13521363
attributes: attrs,
1353-
unexpectedBeforeIsolated,
1354-
isolatedToken: isolated,
1355-
constToken: const,
1364+
modifiers: modifiers,
13561365
firstName: firstName,
13571366
secondName: secondName,
13581367
unexpectedBeforeColon,

Sources/SwiftParser/RawTokenKindSubset.swift

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -631,6 +631,30 @@ enum MatchingPatternStart: RawTokenKindSubset {
631631
}
632632
}
633633

634+
enum ParameterModifier: RawTokenKindSubset {
635+
case _const
636+
case isolated
637+
638+
init?(lexeme: Lexer.Lexeme) {
639+
switch (lexeme.tokenKind, lexeme.tokenText) {
640+
case (.identifier, "_const"): self = ._const
641+
case (.identifier, "isolate"): self = .isolated
642+
default: return nil
643+
}
644+
}
645+
646+
var rawTokenKind: RawTokenKind {
647+
return .identifier
648+
}
649+
650+
var contextualKeyword: SyntaxText? {
651+
switch self {
652+
case ._const: return "_const"
653+
case .isolated: return "isolated"
654+
}
655+
}
656+
}
657+
634658
enum PrimaryExpressionStart: RawTokenKindSubset {
635659
case __column__Keyword
636660
case __dso_handle__Keyword

Sources/SwiftSyntax/Raw/gyb_generated/RawSyntaxNodes.swift

Lines changed: 37 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -7295,11 +7295,9 @@ public struct RawFunctionParameterSyntax: RawSyntaxNodeProtocol, RawSyntaxToSynt
72957295
public init(
72967296
_ unexpectedBeforeAttributes: RawUnexpectedNodesSyntax? = nil,
72977297
attributes: RawAttributeListSyntax?,
7298-
_ unexpectedBetweenAttributesAndIsolatedToken: RawUnexpectedNodesSyntax? = nil,
7299-
isolatedToken: RawTokenSyntax?,
7300-
_ unexpectedBetweenIsolatedTokenAndConstToken: RawUnexpectedNodesSyntax? = nil,
7301-
constToken: RawTokenSyntax?,
7302-
_ unexpectedBetweenConstTokenAndFirstName: RawUnexpectedNodesSyntax? = nil,
7298+
_ unexpectedBetweenAttributesAndModifiers: RawUnexpectedNodesSyntax? = nil,
7299+
modifiers: RawModifierListSyntax?,
7300+
_ unexpectedBetweenModifiersAndFirstName: RawUnexpectedNodesSyntax? = nil,
73037301
firstName: RawTokenSyntax?,
73047302
_ unexpectedBetweenFirstNameAndSecondName: RawUnexpectedNodesSyntax? = nil,
73057303
secondName: RawTokenSyntax?,
@@ -7316,28 +7314,26 @@ public struct RawFunctionParameterSyntax: RawSyntaxNodeProtocol, RawSyntaxToSynt
73167314
arena: __shared SyntaxArena
73177315
) {
73187316
let raw = RawSyntax.makeLayout(
7319-
kind: .functionParameter, uninitializedCount: 20, arena: arena) { layout in
7317+
kind: .functionParameter, uninitializedCount: 18, arena: arena) { layout in
73207318
layout.initialize(repeating: nil)
73217319
layout[0] = unexpectedBeforeAttributes?.raw
73227320
layout[1] = attributes?.raw
7323-
layout[2] = unexpectedBetweenAttributesAndIsolatedToken?.raw
7324-
layout[3] = isolatedToken?.raw
7325-
layout[4] = unexpectedBetweenIsolatedTokenAndConstToken?.raw
7326-
layout[5] = constToken?.raw
7327-
layout[6] = unexpectedBetweenConstTokenAndFirstName?.raw
7328-
layout[7] = firstName?.raw
7329-
layout[8] = unexpectedBetweenFirstNameAndSecondName?.raw
7330-
layout[9] = secondName?.raw
7331-
layout[10] = unexpectedBetweenSecondNameAndColon?.raw
7332-
layout[11] = colon?.raw
7333-
layout[12] = unexpectedBetweenColonAndType?.raw
7334-
layout[13] = type?.raw
7335-
layout[14] = unexpectedBetweenTypeAndEllipsis?.raw
7336-
layout[15] = ellipsis?.raw
7337-
layout[16] = unexpectedBetweenEllipsisAndDefaultArgument?.raw
7338-
layout[17] = defaultArgument?.raw
7339-
layout[18] = unexpectedBetweenDefaultArgumentAndTrailingComma?.raw
7340-
layout[19] = trailingComma?.raw
7321+
layout[2] = unexpectedBetweenAttributesAndModifiers?.raw
7322+
layout[3] = modifiers?.raw
7323+
layout[4] = unexpectedBetweenModifiersAndFirstName?.raw
7324+
layout[5] = firstName?.raw
7325+
layout[6] = unexpectedBetweenFirstNameAndSecondName?.raw
7326+
layout[7] = secondName?.raw
7327+
layout[8] = unexpectedBetweenSecondNameAndColon?.raw
7328+
layout[9] = colon?.raw
7329+
layout[10] = unexpectedBetweenColonAndType?.raw
7330+
layout[11] = type?.raw
7331+
layout[12] = unexpectedBetweenTypeAndEllipsis?.raw
7332+
layout[13] = ellipsis?.raw
7333+
layout[14] = unexpectedBetweenEllipsisAndDefaultArgument?.raw
7334+
layout[15] = defaultArgument?.raw
7335+
layout[16] = unexpectedBetweenDefaultArgumentAndTrailingComma?.raw
7336+
layout[17] = trailingComma?.raw
73417337
}
73427338
self.init(raw: raw)
73437339
}
@@ -7348,59 +7344,53 @@ public struct RawFunctionParameterSyntax: RawSyntaxNodeProtocol, RawSyntaxToSynt
73487344
public var attributes: RawAttributeListSyntax? {
73497345
layoutView.children[1].map(RawAttributeListSyntax.init(raw:))
73507346
}
7351-
public var unexpectedBetweenAttributesAndIsolatedToken: RawUnexpectedNodesSyntax? {
7347+
public var unexpectedBetweenAttributesAndModifiers: RawUnexpectedNodesSyntax? {
73527348
layoutView.children[2].map(RawUnexpectedNodesSyntax.init(raw:))
73537349
}
7354-
public var isolatedToken: RawTokenSyntax? {
7355-
layoutView.children[3].map(RawTokenSyntax.init(raw:))
7350+
public var modifiers: RawModifierListSyntax? {
7351+
layoutView.children[3].map(RawModifierListSyntax.init(raw:))
73567352
}
7357-
public var unexpectedBetweenIsolatedTokenAndConstToken: RawUnexpectedNodesSyntax? {
7353+
public var unexpectedBetweenModifiersAndFirstName: RawUnexpectedNodesSyntax? {
73587354
layoutView.children[4].map(RawUnexpectedNodesSyntax.init(raw:))
73597355
}
7360-
public var constToken: RawTokenSyntax? {
7361-
layoutView.children[5].map(RawTokenSyntax.init(raw:))
7362-
}
7363-
public var unexpectedBetweenConstTokenAndFirstName: RawUnexpectedNodesSyntax? {
7364-
layoutView.children[6].map(RawUnexpectedNodesSyntax.init(raw:))
7365-
}
73667356
public var firstName: RawTokenSyntax? {
7367-
layoutView.children[7].map(RawTokenSyntax.init(raw:))
7357+
layoutView.children[5].map(RawTokenSyntax.init(raw:))
73687358
}
73697359
public var unexpectedBetweenFirstNameAndSecondName: RawUnexpectedNodesSyntax? {
7370-
layoutView.children[8].map(RawUnexpectedNodesSyntax.init(raw:))
7360+
layoutView.children[6].map(RawUnexpectedNodesSyntax.init(raw:))
73717361
}
73727362
public var secondName: RawTokenSyntax? {
7373-
layoutView.children[9].map(RawTokenSyntax.init(raw:))
7363+
layoutView.children[7].map(RawTokenSyntax.init(raw:))
73747364
}
73757365
public var unexpectedBetweenSecondNameAndColon: RawUnexpectedNodesSyntax? {
7376-
layoutView.children[10].map(RawUnexpectedNodesSyntax.init(raw:))
7366+
layoutView.children[8].map(RawUnexpectedNodesSyntax.init(raw:))
73777367
}
73787368
public var colon: RawTokenSyntax? {
7379-
layoutView.children[11].map(RawTokenSyntax.init(raw:))
7369+
layoutView.children[9].map(RawTokenSyntax.init(raw:))
73807370
}
73817371
public var unexpectedBetweenColonAndType: RawUnexpectedNodesSyntax? {
7382-
layoutView.children[12].map(RawUnexpectedNodesSyntax.init(raw:))
7372+
layoutView.children[10].map(RawUnexpectedNodesSyntax.init(raw:))
73837373
}
73847374
public var type: RawTypeSyntax? {
7385-
layoutView.children[13].map(RawTypeSyntax.init(raw:))
7375+
layoutView.children[11].map(RawTypeSyntax.init(raw:))
73867376
}
73877377
public var unexpectedBetweenTypeAndEllipsis: RawUnexpectedNodesSyntax? {
7388-
layoutView.children[14].map(RawUnexpectedNodesSyntax.init(raw:))
7378+
layoutView.children[12].map(RawUnexpectedNodesSyntax.init(raw:))
73897379
}
73907380
public var ellipsis: RawTokenSyntax? {
7391-
layoutView.children[15].map(RawTokenSyntax.init(raw:))
7381+
layoutView.children[13].map(RawTokenSyntax.init(raw:))
73927382
}
73937383
public var unexpectedBetweenEllipsisAndDefaultArgument: RawUnexpectedNodesSyntax? {
7394-
layoutView.children[16].map(RawUnexpectedNodesSyntax.init(raw:))
7384+
layoutView.children[14].map(RawUnexpectedNodesSyntax.init(raw:))
73957385
}
73967386
public var defaultArgument: RawInitializerClauseSyntax? {
7397-
layoutView.children[17].map(RawInitializerClauseSyntax.init(raw:))
7387+
layoutView.children[15].map(RawInitializerClauseSyntax.init(raw:))
73987388
}
73997389
public var unexpectedBetweenDefaultArgumentAndTrailingComma: RawUnexpectedNodesSyntax? {
7400-
layoutView.children[18].map(RawUnexpectedNodesSyntax.init(raw:))
7390+
layoutView.children[16].map(RawUnexpectedNodesSyntax.init(raw:))
74017391
}
74027392
public var trailingComma: RawTokenSyntax? {
7403-
layoutView.children[19].map(RawTokenSyntax.init(raw:))
7393+
layoutView.children[17].map(RawTokenSyntax.init(raw:))
74047394
}
74057395
}
74067396

Sources/SwiftSyntax/Raw/gyb_generated/RawSyntaxValidation.swift

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -987,27 +987,25 @@ func validateLayout(layout: RawSyntaxBuffer, as kind: SyntaxKind) {
987987
_verify(layout[3], as: RawExprSyntax.self)
988988
break
989989
case .functionParameter:
990-
assert(layout.count == 20)
990+
assert(layout.count == 18)
991991
_verify(layout[0], as: RawUnexpectedNodesSyntax?.self)
992992
_verify(layout[1], as: RawAttributeListSyntax?.self)
993993
_verify(layout[2], as: RawUnexpectedNodesSyntax?.self)
994-
_verify(layout[3], as: RawTokenSyntax?.self)
994+
_verify(layout[3], as: RawModifierListSyntax?.self)
995995
_verify(layout[4], as: RawUnexpectedNodesSyntax?.self)
996996
_verify(layout[5], as: RawTokenSyntax?.self)
997997
_verify(layout[6], as: RawUnexpectedNodesSyntax?.self)
998998
_verify(layout[7], as: RawTokenSyntax?.self)
999999
_verify(layout[8], as: RawUnexpectedNodesSyntax?.self)
10001000
_verify(layout[9], as: RawTokenSyntax?.self)
10011001
_verify(layout[10], as: RawUnexpectedNodesSyntax?.self)
1002-
_verify(layout[11], as: RawTokenSyntax?.self)
1002+
_verify(layout[11], as: RawTypeSyntax?.self)
10031003
_verify(layout[12], as: RawUnexpectedNodesSyntax?.self)
1004-
_verify(layout[13], as: RawTypeSyntax?.self)
1004+
_verify(layout[13], as: RawTokenSyntax?.self)
10051005
_verify(layout[14], as: RawUnexpectedNodesSyntax?.self)
1006-
_verify(layout[15], as: RawTokenSyntax?.self)
1006+
_verify(layout[15], as: RawInitializerClauseSyntax?.self)
10071007
_verify(layout[16], as: RawUnexpectedNodesSyntax?.self)
1008-
_verify(layout[17], as: RawInitializerClauseSyntax?.self)
1009-
_verify(layout[18], as: RawUnexpectedNodesSyntax?.self)
1010-
_verify(layout[19], as: RawTokenSyntax?.self)
1008+
_verify(layout[17], as: RawTokenSyntax?.self)
10111009
break
10121010
case .modifierList:
10131011
for element in layout {

Sources/SwiftSyntax/gyb_generated/SyntaxFactory.swift

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3136,15 +3136,13 @@ public enum SyntaxFactory {
31363136
return InitializerClauseSyntax(data)
31373137
}
31383138
@available(*, deprecated, message: "Use initializer on FunctionParameterSyntax")
3139-
public static func makeFunctionParameter(_ unexpectedBeforeAttributes: UnexpectedNodesSyntax? = nil, attributes: AttributeListSyntax?, _ unexpectedBetweenAttributesAndIsolatedToken: UnexpectedNodesSyntax? = nil, isolatedToken: TokenSyntax?, _ unexpectedBetweenIsolatedTokenAndConstToken: UnexpectedNodesSyntax? = nil, constToken: TokenSyntax?, _ unexpectedBetweenConstTokenAndFirstName: UnexpectedNodesSyntax? = nil, firstName: TokenSyntax?, _ unexpectedBetweenFirstNameAndSecondName: UnexpectedNodesSyntax? = nil, secondName: TokenSyntax?, _ unexpectedBetweenSecondNameAndColon: UnexpectedNodesSyntax? = nil, colon: TokenSyntax?, _ unexpectedBetweenColonAndType: UnexpectedNodesSyntax? = nil, type: TypeSyntax?, _ unexpectedBetweenTypeAndEllipsis: UnexpectedNodesSyntax? = nil, ellipsis: TokenSyntax?, _ unexpectedBetweenEllipsisAndDefaultArgument: UnexpectedNodesSyntax? = nil, defaultArgument: InitializerClauseSyntax?, _ unexpectedBetweenDefaultArgumentAndTrailingComma: UnexpectedNodesSyntax? = nil, trailingComma: TokenSyntax?) -> FunctionParameterSyntax {
3139+
public static func makeFunctionParameter(_ unexpectedBeforeAttributes: UnexpectedNodesSyntax? = nil, attributes: AttributeListSyntax?, _ unexpectedBetweenAttributesAndModifiers: UnexpectedNodesSyntax? = nil, modifiers: ModifierListSyntax?, _ unexpectedBetweenModifiersAndFirstName: UnexpectedNodesSyntax? = nil, firstName: TokenSyntax?, _ unexpectedBetweenFirstNameAndSecondName: UnexpectedNodesSyntax? = nil, secondName: TokenSyntax?, _ unexpectedBetweenSecondNameAndColon: UnexpectedNodesSyntax? = nil, colon: TokenSyntax?, _ unexpectedBetweenColonAndType: UnexpectedNodesSyntax? = nil, type: TypeSyntax?, _ unexpectedBetweenTypeAndEllipsis: UnexpectedNodesSyntax? = nil, ellipsis: TokenSyntax?, _ unexpectedBetweenEllipsisAndDefaultArgument: UnexpectedNodesSyntax? = nil, defaultArgument: InitializerClauseSyntax?, _ unexpectedBetweenDefaultArgumentAndTrailingComma: UnexpectedNodesSyntax? = nil, trailingComma: TokenSyntax?) -> FunctionParameterSyntax {
31403140
let layout: [RawSyntax?] = [
31413141
unexpectedBeforeAttributes?.raw,
31423142
attributes?.raw,
3143-
unexpectedBetweenAttributesAndIsolatedToken?.raw,
3144-
isolatedToken?.raw,
3145-
unexpectedBetweenIsolatedTokenAndConstToken?.raw,
3146-
constToken?.raw,
3147-
unexpectedBetweenConstTokenAndFirstName?.raw,
3143+
unexpectedBetweenAttributesAndModifiers?.raw,
3144+
modifiers?.raw,
3145+
unexpectedBetweenModifiersAndFirstName?.raw,
31483146
firstName?.raw,
31493147
unexpectedBetweenFirstNameAndSecondName?.raw,
31503148
secondName?.raw,
@@ -3187,8 +3185,6 @@ public enum SyntaxFactory {
31873185
nil,
31883186
nil,
31893187
nil,
3190-
nil,
3191-
nil,
31923188
], arena: .default))
31933189
return FunctionParameterSyntax(data)
31943190
}

0 commit comments

Comments
 (0)