Skip to content

Commit e04df32

Browse files
committed
Redo the Modeling for @convention's Arguments
1 parent 6ec195f commit e04df32

File tree

24 files changed

+1229
-4
lines changed

24 files changed

+1229
-4
lines changed

Sources/SwiftParser/Attributes.swift

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -794,6 +794,54 @@ extension Parser {
794794
}
795795
}
796796

797+
extension Parser {
798+
mutating func parseConventionArguments() -> RawSyntax {
799+
if let witnessMethod = self.consumeIfContextualKeyword("witness_method") {
800+
let (unexpectedBeforeColon, colon) = self.expect(.colon)
801+
let name = self.parseAnyIdentifier()
802+
return RawSyntax(RawConventionWitnessMethodAttributeArgumentsSyntax(
803+
witnessMethodLabel: witnessMethod,
804+
unexpectedBeforeColon,
805+
colon: colon,
806+
protocolName: name,
807+
arena: self.arena))
808+
} else {
809+
let label = self.consumeAnyToken()
810+
let unexpectedBeforeComma: RawUnexpectedNodesSyntax?
811+
let comma: RawTokenSyntax?
812+
let cTypeLabel: RawTokenSyntax?
813+
let unexpectedBeforeColon: RawUnexpectedNodesSyntax?
814+
let colon: RawTokenSyntax?
815+
let unexpectedBeforeCTypeString: RawUnexpectedNodesSyntax?
816+
let cTypeString: RawTokenSyntax?
817+
if self.at(.comma) {
818+
(unexpectedBeforeComma, comma) = self.expect(.comma)
819+
cTypeLabel = self.consumeAnyToken()
820+
(unexpectedBeforeColon, colon) = self.expect(.colon)
821+
(unexpectedBeforeCTypeString, cTypeString) = self.expect(.stringLiteral)
822+
} else {
823+
unexpectedBeforeComma = nil
824+
comma = nil
825+
cTypeLabel = nil
826+
unexpectedBeforeColon = nil
827+
colon = nil
828+
unexpectedBeforeCTypeString = nil
829+
cTypeString = nil
830+
}
831+
return RawSyntax(RawConventionAttributeArgumentsSyntax(
832+
conventionLabel: label,
833+
unexpectedBeforeComma,
834+
comma: comma,
835+
cTypeLabel: cTypeLabel,
836+
unexpectedBeforeColon,
837+
colon: colon,
838+
unexpectedBeforeCTypeString,
839+
cTypeString: cTypeString,
840+
arena: self.arena))
841+
}
842+
}
843+
}
844+
797845
// MARK: Lookahead
798846

799847
extension Parser.Lookahead {

Sources/SwiftParser/Types.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -803,7 +803,7 @@ extension Parser {
803803
let (unexpectedBeforeAt, at) = self.expect(.atSign)
804804
let (unexpectedBeforeIdent, ident) = self.expectIdentifier()
805805
let (unexpectedBeforeLeftParen, leftParen) = self.expect(.leftParen)
806-
let (unexpectedBeforeArgument, argument) = self.expectIdentifier()
806+
let arguments = self.parseConventionArguments()
807807
let (unexpectedBeforeRightParen, rightParen) = self.expect(.rightParen)
808808
return RawSyntax(
809809
RawAttributeSyntax(
@@ -813,8 +813,7 @@ extension Parser {
813813
attributeName: ident,
814814
unexpectedBeforeLeftParen,
815815
leftParen: leftParen,
816-
unexpectedBeforeArgument,
817-
argument: RawSyntax(argument),
816+
argument: arguments,
818817
unexpectedBeforeRightParen,
819818
rightParen: rightParen,
820819
tokenList: nil,

Sources/SwiftSyntax/Documentation.docc/gyb_generated/SwiftSyntax.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,8 @@ allows Swift tools to parse, inspect, generate, and transform Swift source code.
362362
- <doc:SwiftSyntax/BackDeployVersionListSyntax>
363363
- <doc:SwiftSyntax/BackDeployVersionArgumentSyntax>
364364
- <doc:SwiftSyntax/OpaqueReturnTypeOfAttributeArgumentsSyntax>
365+
- <doc:SwiftSyntax/ConventionAttributeArgumentsSyntax>
366+
- <doc:SwiftSyntax/ConventionWitnessMethodAttributeArgumentsSyntax>
365367
- <doc:SwiftSyntax/SwitchCaseListSyntax>
366368
- <doc:SwiftSyntax/WhereClauseSyntax>
367369
- <doc:SwiftSyntax/CatchClauseListSyntax>

Sources/SwiftSyntax/Raw/gyb_generated/RawSyntaxNodes.swift

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10660,6 +10660,152 @@ public struct RawOpaqueReturnTypeOfAttributeArgumentsSyntax: RawSyntaxNodeProtoc
1066010660
}
1066110661
}
1066210662

10663+
@_spi(RawSyntax)
10664+
public struct RawConventionAttributeArgumentsSyntax: RawSyntaxNodeProtocol {
10665+
var layoutView: RawSyntaxLayoutView {
10666+
return raw.layoutView!
10667+
}
10668+
10669+
public static func isKindOf(_ raw: RawSyntax) -> Bool {
10670+
return raw.kind == .conventionAttributeArguments
10671+
}
10672+
10673+
public var raw: RawSyntax
10674+
init(raw: RawSyntax) {
10675+
assert(Self.isKindOf(raw))
10676+
self.raw = raw
10677+
}
10678+
10679+
public init?<Node: RawSyntaxNodeProtocol>(_ other: Node) {
10680+
guard Self.isKindOf(other.raw) else { return nil }
10681+
self.init(raw: other.raw)
10682+
}
10683+
10684+
public init(
10685+
_ unexpectedBeforeConventionLabel: RawUnexpectedNodesSyntax? = nil,
10686+
conventionLabel: RawTokenSyntax,
10687+
_ unexpectedBetweenConventionLabelAndComma: RawUnexpectedNodesSyntax? = nil,
10688+
comma: RawTokenSyntax?,
10689+
_ unexpectedBetweenCommaAndCTypeLabel: RawUnexpectedNodesSyntax? = nil,
10690+
cTypeLabel: RawTokenSyntax?,
10691+
_ unexpectedBetweenCTypeLabelAndColon: RawUnexpectedNodesSyntax? = nil,
10692+
colon: RawTokenSyntax?,
10693+
_ unexpectedBetweenColonAndCTypeString: RawUnexpectedNodesSyntax? = nil,
10694+
cTypeString: RawTokenSyntax?,
10695+
arena: __shared SyntaxArena
10696+
) {
10697+
let raw = RawSyntax.makeLayout(
10698+
kind: .conventionAttributeArguments, uninitializedCount: 10, arena: arena) { layout in
10699+
layout.initialize(repeating: nil)
10700+
layout[0] = unexpectedBeforeConventionLabel?.raw
10701+
layout[1] = conventionLabel.raw
10702+
layout[2] = unexpectedBetweenConventionLabelAndComma?.raw
10703+
layout[3] = comma?.raw
10704+
layout[4] = unexpectedBetweenCommaAndCTypeLabel?.raw
10705+
layout[5] = cTypeLabel?.raw
10706+
layout[6] = unexpectedBetweenCTypeLabelAndColon?.raw
10707+
layout[7] = colon?.raw
10708+
layout[8] = unexpectedBetweenColonAndCTypeString?.raw
10709+
layout[9] = cTypeString?.raw
10710+
}
10711+
self.init(raw: raw)
10712+
}
10713+
10714+
public var unexpectedBeforeConventionLabel: RawUnexpectedNodesSyntax? {
10715+
layoutView.children[0].map(RawUnexpectedNodesSyntax.init(raw:))
10716+
}
10717+
public var conventionLabel: RawTokenSyntax {
10718+
layoutView.children[1].map(RawTokenSyntax.init(raw:))!
10719+
}
10720+
public var unexpectedBetweenConventionLabelAndComma: RawUnexpectedNodesSyntax? {
10721+
layoutView.children[2].map(RawUnexpectedNodesSyntax.init(raw:))
10722+
}
10723+
public var comma: RawTokenSyntax? {
10724+
layoutView.children[3].map(RawTokenSyntax.init(raw:))
10725+
}
10726+
public var unexpectedBetweenCommaAndCTypeLabel: RawUnexpectedNodesSyntax? {
10727+
layoutView.children[4].map(RawUnexpectedNodesSyntax.init(raw:))
10728+
}
10729+
public var cTypeLabel: RawTokenSyntax? {
10730+
layoutView.children[5].map(RawTokenSyntax.init(raw:))
10731+
}
10732+
public var unexpectedBetweenCTypeLabelAndColon: RawUnexpectedNodesSyntax? {
10733+
layoutView.children[6].map(RawUnexpectedNodesSyntax.init(raw:))
10734+
}
10735+
public var colon: RawTokenSyntax? {
10736+
layoutView.children[7].map(RawTokenSyntax.init(raw:))
10737+
}
10738+
public var unexpectedBetweenColonAndCTypeString: RawUnexpectedNodesSyntax? {
10739+
layoutView.children[8].map(RawUnexpectedNodesSyntax.init(raw:))
10740+
}
10741+
public var cTypeString: RawTokenSyntax? {
10742+
layoutView.children[9].map(RawTokenSyntax.init(raw:))
10743+
}
10744+
}
10745+
10746+
@_spi(RawSyntax)
10747+
public struct RawConventionWitnessMethodAttributeArgumentsSyntax: RawSyntaxNodeProtocol {
10748+
var layoutView: RawSyntaxLayoutView {
10749+
return raw.layoutView!
10750+
}
10751+
10752+
public static func isKindOf(_ raw: RawSyntax) -> Bool {
10753+
return raw.kind == .conventionWitnessMethodAttributeArguments
10754+
}
10755+
10756+
public var raw: RawSyntax
10757+
init(raw: RawSyntax) {
10758+
assert(Self.isKindOf(raw))
10759+
self.raw = raw
10760+
}
10761+
10762+
public init?<Node: RawSyntaxNodeProtocol>(_ other: Node) {
10763+
guard Self.isKindOf(other.raw) else { return nil }
10764+
self.init(raw: other.raw)
10765+
}
10766+
10767+
public init(
10768+
_ unexpectedBeforeWitnessMethodLabel: RawUnexpectedNodesSyntax? = nil,
10769+
witnessMethodLabel: RawTokenSyntax,
10770+
_ unexpectedBetweenWitnessMethodLabelAndColon: RawUnexpectedNodesSyntax? = nil,
10771+
colon: RawTokenSyntax,
10772+
_ unexpectedBetweenColonAndProtocolName: RawUnexpectedNodesSyntax? = nil,
10773+
protocolName: RawTokenSyntax,
10774+
arena: __shared SyntaxArena
10775+
) {
10776+
let raw = RawSyntax.makeLayout(
10777+
kind: .conventionWitnessMethodAttributeArguments, uninitializedCount: 6, arena: arena) { layout in
10778+
layout.initialize(repeating: nil)
10779+
layout[0] = unexpectedBeforeWitnessMethodLabel?.raw
10780+
layout[1] = witnessMethodLabel.raw
10781+
layout[2] = unexpectedBetweenWitnessMethodLabelAndColon?.raw
10782+
layout[3] = colon.raw
10783+
layout[4] = unexpectedBetweenColonAndProtocolName?.raw
10784+
layout[5] = protocolName.raw
10785+
}
10786+
self.init(raw: raw)
10787+
}
10788+
10789+
public var unexpectedBeforeWitnessMethodLabel: RawUnexpectedNodesSyntax? {
10790+
layoutView.children[0].map(RawUnexpectedNodesSyntax.init(raw:))
10791+
}
10792+
public var witnessMethodLabel: RawTokenSyntax {
10793+
layoutView.children[1].map(RawTokenSyntax.init(raw:))!
10794+
}
10795+
public var unexpectedBetweenWitnessMethodLabelAndColon: RawUnexpectedNodesSyntax? {
10796+
layoutView.children[2].map(RawUnexpectedNodesSyntax.init(raw:))
10797+
}
10798+
public var colon: RawTokenSyntax {
10799+
layoutView.children[3].map(RawTokenSyntax.init(raw:))!
10800+
}
10801+
public var unexpectedBetweenColonAndProtocolName: RawUnexpectedNodesSyntax? {
10802+
layoutView.children[4].map(RawUnexpectedNodesSyntax.init(raw:))
10803+
}
10804+
public var protocolName: RawTokenSyntax {
10805+
layoutView.children[5].map(RawTokenSyntax.init(raw:))!
10806+
}
10807+
}
10808+
1066310809
@_spi(RawSyntax)
1066410810
public struct RawLabeledStmtSyntax: RawStmtSyntaxNodeProtocol {
1066510811
var layoutView: RawSyntaxLayoutView {

Sources/SwiftSyntax/Raw/gyb_generated/RawSyntaxValidation.swift

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1531,6 +1531,28 @@ func validateLayout(layout: RawSyntaxBuffer, as kind: SyntaxKind) {
15311531
_verify(layout[4], as: RawUnexpectedNodesSyntax?.self)
15321532
_verify(layout[5], as: RawTokenSyntax.self)
15331533
break
1534+
case .conventionAttributeArguments:
1535+
assert(layout.count == 10)
1536+
_verify(layout[0], as: RawUnexpectedNodesSyntax?.self)
1537+
_verify(layout[1], as: RawTokenSyntax.self)
1538+
_verify(layout[2], as: RawUnexpectedNodesSyntax?.self)
1539+
_verify(layout[3], as: RawTokenSyntax?.self)
1540+
_verify(layout[4], as: RawUnexpectedNodesSyntax?.self)
1541+
_verify(layout[5], as: RawTokenSyntax?.self)
1542+
_verify(layout[6], as: RawUnexpectedNodesSyntax?.self)
1543+
_verify(layout[7], as: RawTokenSyntax?.self)
1544+
_verify(layout[8], as: RawUnexpectedNodesSyntax?.self)
1545+
_verify(layout[9], as: RawTokenSyntax?.self)
1546+
break
1547+
case .conventionWitnessMethodAttributeArguments:
1548+
assert(layout.count == 6)
1549+
_verify(layout[0], as: RawUnexpectedNodesSyntax?.self)
1550+
_verify(layout[1], as: RawTokenSyntax.self)
1551+
_verify(layout[2], as: RawUnexpectedNodesSyntax?.self)
1552+
_verify(layout[3], as: RawTokenSyntax.self)
1553+
_verify(layout[4], as: RawUnexpectedNodesSyntax?.self)
1554+
_verify(layout[5], as: RawTokenSyntax.self)
1555+
break
15341556
case .labeledStmt:
15351557
assert(layout.count == 6)
15361558
_verify(layout[0], as: RawUnexpectedNodesSyntax?.self)

Sources/SwiftSyntax/gyb_generated/Misc.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,10 @@ extension Syntax {
383383
return node
384384
case .opaqueReturnTypeOfAttributeArguments(let node):
385385
return node
386+
case .conventionAttributeArguments(let node):
387+
return node
388+
case .conventionWitnessMethodAttributeArguments(let node):
389+
return node
386390
case .labeledStmt(let node):
387391
return node
388392
case .continueStmt(let node):
@@ -747,6 +751,8 @@ extension SyntaxKind {
747751
case .backDeployVersionList: return BackDeployVersionListSyntax.self
748752
case .backDeployVersionArgument: return BackDeployVersionArgumentSyntax.self
749753
case .opaqueReturnTypeOfAttributeArguments: return OpaqueReturnTypeOfAttributeArgumentsSyntax.self
754+
case .conventionAttributeArguments: return ConventionAttributeArgumentsSyntax.self
755+
case .conventionWitnessMethodAttributeArguments: return ConventionWitnessMethodAttributeArgumentsSyntax.self
750756
case .labeledStmt: return LabeledStmtSyntax.self
751757
case .continueStmt: return ContinueStmtSyntax.self
752758
case .whileStmt: return WhileStmtSyntax.self

Sources/SwiftSyntax/gyb_generated/SyntaxAnyVisitor.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1300,6 +1300,20 @@ open class SyntaxAnyVisitor: SyntaxVisitor {
13001300
override open func visitPost(_ node: OpaqueReturnTypeOfAttributeArgumentsSyntax) {
13011301
visitAnyPost(node._syntaxNode)
13021302
}
1303+
override open func visit(_ node: ConventionAttributeArgumentsSyntax) -> SyntaxVisitorContinueKind {
1304+
return visitAny(node._syntaxNode)
1305+
}
1306+
1307+
override open func visitPost(_ node: ConventionAttributeArgumentsSyntax) {
1308+
visitAnyPost(node._syntaxNode)
1309+
}
1310+
override open func visit(_ node: ConventionWitnessMethodAttributeArgumentsSyntax) -> SyntaxVisitorContinueKind {
1311+
return visitAny(node._syntaxNode)
1312+
}
1313+
1314+
override open func visitPost(_ node: ConventionWitnessMethodAttributeArgumentsSyntax) {
1315+
visitAnyPost(node._syntaxNode)
1316+
}
13031317
override open func visit(_ node: LabeledStmtSyntax) -> SyntaxVisitorContinueKind {
13041318
return visitAny(node._syntaxNode)
13051319
}

Sources/SwiftSyntax/gyb_generated/SyntaxEnum.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,8 @@ public enum SyntaxEnum {
193193
case backDeployVersionList(BackDeployVersionListSyntax)
194194
case backDeployVersionArgument(BackDeployVersionArgumentSyntax)
195195
case opaqueReturnTypeOfAttributeArguments(OpaqueReturnTypeOfAttributeArgumentsSyntax)
196+
case conventionAttributeArguments(ConventionAttributeArgumentsSyntax)
197+
case conventionWitnessMethodAttributeArguments(ConventionWitnessMethodAttributeArgumentsSyntax)
196198
case labeledStmt(LabeledStmtSyntax)
197199
case continueStmt(ContinueStmtSyntax)
198200
case whileStmt(WhileStmtSyntax)
@@ -643,6 +645,10 @@ public enum SyntaxEnum {
643645
return "version"
644646
case .opaqueReturnTypeOfAttributeArguments:
645647
return "opaque return type arguments"
648+
case .conventionAttributeArguments:
649+
return "@convention(...) arguments"
650+
case .conventionWitnessMethodAttributeArguments:
651+
return "@convention(...) arguments for witness methods"
646652
case .labeledStmt:
647653
return "labeled statement"
648654
case .continueStmt:
@@ -1187,6 +1193,10 @@ public extension Syntax {
11871193
return .backDeployVersionArgument(BackDeployVersionArgumentSyntax(self)!)
11881194
case .opaqueReturnTypeOfAttributeArguments:
11891195
return .opaqueReturnTypeOfAttributeArguments(OpaqueReturnTypeOfAttributeArgumentsSyntax(self)!)
1196+
case .conventionAttributeArguments:
1197+
return .conventionAttributeArguments(ConventionAttributeArgumentsSyntax(self)!)
1198+
case .conventionWitnessMethodAttributeArguments:
1199+
return .conventionWitnessMethodAttributeArguments(ConventionWitnessMethodAttributeArgumentsSyntax(self)!)
11901200
case .labeledStmt:
11911201
return .labeledStmt(LabeledStmtSyntax(self)!)
11921202
case .continueStmt:

0 commit comments

Comments
 (0)