Skip to content

Commit 51050ae

Browse files
committed
Redo the Modeling of precedencegroup Data
Strike the "list" of designated types in favor of a single optional designated type node.
1 parent e04df32 commit 51050ae

File tree

10 files changed

+249
-69
lines changed

10 files changed

+249
-69
lines changed

Sources/SwiftParser/Declarations.swift

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1882,10 +1882,28 @@ extension Parser {
18821882
// checking.
18831883
let precedenceAndTypes: RawOperatorPrecedenceAndTypesSyntax?
18841884
if let colon = self.consume(if: .colon) {
1885-
let identifier = self.expectIdentifierWithoutRecovery()
1885+
let (unexpectedBeforeIdentifier, identifier) = self.expectIdentifier()
1886+
let unexpectedBeforeComma: RawUnexpectedNodesSyntax?
1887+
let comma: RawTokenSyntax?
1888+
let unexpectedBeforeDesignatedType: RawUnexpectedNodesSyntax?
1889+
let designatedType: RawTokenSyntax?
1890+
if self.at(.comma) {
1891+
(unexpectedBeforeComma, comma) = self.expect(.comma)
1892+
(unexpectedBeforeDesignatedType, designatedType) = self.expectIdentifier()
1893+
} else {
1894+
unexpectedBeforeComma = nil
1895+
comma = nil
1896+
unexpectedBeforeDesignatedType = nil
1897+
designatedType = nil
1898+
}
18861899
precedenceAndTypes = RawOperatorPrecedenceAndTypesSyntax(
18871900
colon: colon,
1888-
precedenceGroupAndDesignatedTypes: RawIdentifierListSyntax(elements: [ identifier ], arena: self.arena),
1901+
unexpectedBeforeIdentifier,
1902+
precedenceGroup: identifier,
1903+
unexpectedBeforeComma,
1904+
comma: comma,
1905+
unexpectedBeforeDesignatedType,
1906+
designatedType: designatedType,
18891907
arena: self.arena)
18901908
} else {
18911909
precedenceAndTypes = nil

Sources/SwiftSyntax/Raw/gyb_generated/RawSyntaxNodes.swift

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8637,17 +8637,25 @@ public struct RawOperatorPrecedenceAndTypesSyntax: RawSyntaxNodeProtocol {
86378637
public init(
86388638
_ unexpectedBeforeColon: RawUnexpectedNodesSyntax? = nil,
86398639
colon: RawTokenSyntax,
8640-
_ unexpectedBetweenColonAndPrecedenceGroupAndDesignatedTypes: RawUnexpectedNodesSyntax? = nil,
8641-
precedenceGroupAndDesignatedTypes: RawIdentifierListSyntax,
8640+
_ unexpectedBetweenColonAndPrecedenceGroup: RawUnexpectedNodesSyntax? = nil,
8641+
precedenceGroup: RawTokenSyntax,
8642+
_ unexpectedBetweenPrecedenceGroupAndComma: RawUnexpectedNodesSyntax? = nil,
8643+
comma: RawTokenSyntax?,
8644+
_ unexpectedBetweenCommaAndDesignatedType: RawUnexpectedNodesSyntax? = nil,
8645+
designatedType: RawTokenSyntax?,
86428646
arena: __shared SyntaxArena
86438647
) {
86448648
let raw = RawSyntax.makeLayout(
8645-
kind: .operatorPrecedenceAndTypes, uninitializedCount: 4, arena: arena) { layout in
8649+
kind: .operatorPrecedenceAndTypes, uninitializedCount: 8, arena: arena) { layout in
86468650
layout.initialize(repeating: nil)
86478651
layout[0] = unexpectedBeforeColon?.raw
86488652
layout[1] = colon.raw
8649-
layout[2] = unexpectedBetweenColonAndPrecedenceGroupAndDesignatedTypes?.raw
8650-
layout[3] = precedenceGroupAndDesignatedTypes.raw
8653+
layout[2] = unexpectedBetweenColonAndPrecedenceGroup?.raw
8654+
layout[3] = precedenceGroup.raw
8655+
layout[4] = unexpectedBetweenPrecedenceGroupAndComma?.raw
8656+
layout[5] = comma?.raw
8657+
layout[6] = unexpectedBetweenCommaAndDesignatedType?.raw
8658+
layout[7] = designatedType?.raw
86518659
}
86528660
self.init(raw: raw)
86538661
}
@@ -8658,11 +8666,23 @@ public struct RawOperatorPrecedenceAndTypesSyntax: RawSyntaxNodeProtocol {
86588666
public var colon: RawTokenSyntax {
86598667
layoutView.children[1].map(RawTokenSyntax.init(raw:))!
86608668
}
8661-
public var unexpectedBetweenColonAndPrecedenceGroupAndDesignatedTypes: RawUnexpectedNodesSyntax? {
8669+
public var unexpectedBetweenColonAndPrecedenceGroup: RawUnexpectedNodesSyntax? {
86628670
layoutView.children[2].map(RawUnexpectedNodesSyntax.init(raw:))
86638671
}
8664-
public var precedenceGroupAndDesignatedTypes: RawIdentifierListSyntax {
8665-
layoutView.children[3].map(RawIdentifierListSyntax.init(raw:))!
8672+
public var precedenceGroup: RawTokenSyntax {
8673+
layoutView.children[3].map(RawTokenSyntax.init(raw:))!
8674+
}
8675+
public var unexpectedBetweenPrecedenceGroupAndComma: RawUnexpectedNodesSyntax? {
8676+
layoutView.children[4].map(RawUnexpectedNodesSyntax.init(raw:))
8677+
}
8678+
public var comma: RawTokenSyntax? {
8679+
layoutView.children[5].map(RawTokenSyntax.init(raw:))
8680+
}
8681+
public var unexpectedBetweenCommaAndDesignatedType: RawUnexpectedNodesSyntax? {
8682+
layoutView.children[6].map(RawUnexpectedNodesSyntax.init(raw:))
8683+
}
8684+
public var designatedType: RawTokenSyntax? {
8685+
layoutView.children[7].map(RawTokenSyntax.init(raw:))
86668686
}
86678687
}
86688688

Sources/SwiftSyntax/Raw/gyb_generated/RawSyntaxValidation.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1236,11 +1236,15 @@ func validateLayout(layout: RawSyntaxBuffer, as kind: SyntaxKind) {
12361236
}
12371237
break
12381238
case .operatorPrecedenceAndTypes:
1239-
assert(layout.count == 4)
1239+
assert(layout.count == 8)
12401240
_verify(layout[0], as: RawUnexpectedNodesSyntax?.self)
12411241
_verify(layout[1], as: RawTokenSyntax.self)
12421242
_verify(layout[2], as: RawUnexpectedNodesSyntax?.self)
1243-
_verify(layout[3], as: RawIdentifierListSyntax.self)
1243+
_verify(layout[3], as: RawTokenSyntax.self)
1244+
_verify(layout[4], as: RawUnexpectedNodesSyntax?.self)
1245+
_verify(layout[5], as: RawTokenSyntax?.self)
1246+
_verify(layout[6], as: RawUnexpectedNodesSyntax?.self)
1247+
_verify(layout[7], as: RawTokenSyntax?.self)
12441248
break
12451249
case .precedenceGroupDecl:
12461250
assert(layout.count == 14)

Sources/SwiftSyntax/gyb_generated/SyntaxFactory.swift

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3840,12 +3840,16 @@ public enum SyntaxFactory {
38403840
return IdentifierListSyntax(data)
38413841
}
38423842
@available(*, deprecated, message: "Use initializer on OperatorPrecedenceAndTypesSyntax")
3843-
public static func makeOperatorPrecedenceAndTypes(_ unexpectedBeforeColon: UnexpectedNodesSyntax? = nil, colon: TokenSyntax, _ unexpectedBetweenColonAndPrecedenceGroupAndDesignatedTypes: UnexpectedNodesSyntax? = nil, precedenceGroupAndDesignatedTypes: IdentifierListSyntax) -> OperatorPrecedenceAndTypesSyntax {
3843+
public static func makeOperatorPrecedenceAndTypes(_ unexpectedBeforeColon: UnexpectedNodesSyntax? = nil, colon: TokenSyntax, _ unexpectedBetweenColonAndPrecedenceGroup: UnexpectedNodesSyntax? = nil, precedenceGroup: TokenSyntax, _ unexpectedBetweenPrecedenceGroupAndComma: UnexpectedNodesSyntax? = nil, comma: TokenSyntax?, _ unexpectedBetweenCommaAndDesignatedType: UnexpectedNodesSyntax? = nil, designatedType: TokenSyntax?) -> OperatorPrecedenceAndTypesSyntax {
38443844
let layout: [RawSyntax?] = [
38453845
unexpectedBeforeColon?.raw,
38463846
colon.raw,
3847-
unexpectedBetweenColonAndPrecedenceGroupAndDesignatedTypes?.raw,
3848-
precedenceGroupAndDesignatedTypes.raw,
3847+
unexpectedBetweenColonAndPrecedenceGroup?.raw,
3848+
precedenceGroup.raw,
3849+
unexpectedBetweenPrecedenceGroupAndComma?.raw,
3850+
comma?.raw,
3851+
unexpectedBetweenCommaAndDesignatedType?.raw,
3852+
designatedType?.raw,
38493853
]
38503854
let raw = RawSyntax.makeLayout(kind: SyntaxKind.operatorPrecedenceAndTypes,
38513855
from: layout, arena: .default)
@@ -3860,7 +3864,11 @@ public enum SyntaxFactory {
38603864
nil,
38613865
RawSyntax.makeMissingToken(kind: TokenKind.colon, arena: .default),
38623866
nil,
3863-
RawSyntax.makeEmptyLayout(kind: SyntaxKind.identifierList, arena: .default),
3867+
RawSyntax.makeMissingToken(kind: TokenKind.identifier(""), arena: .default),
3868+
nil,
3869+
nil,
3870+
nil,
3871+
nil,
38643872
], arena: .default))
38653873
return OperatorPrecedenceAndTypesSyntax(data)
38663874
}

Sources/SwiftSyntax/gyb_generated/syntax_nodes/SyntaxNodes.swift

Lines changed: 118 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -7234,14 +7234,22 @@ public struct OperatorPrecedenceAndTypesSyntax: SyntaxProtocol, SyntaxHashable {
72347234
public init(
72357235
_ unexpectedBeforeColon: UnexpectedNodesSyntax? = nil,
72367236
colon: TokenSyntax,
7237-
_ unexpectedBetweenColonAndPrecedenceGroupAndDesignatedTypes: UnexpectedNodesSyntax? = nil,
7238-
precedenceGroupAndDesignatedTypes: IdentifierListSyntax
7237+
_ unexpectedBetweenColonAndPrecedenceGroup: UnexpectedNodesSyntax? = nil,
7238+
precedenceGroup: TokenSyntax,
7239+
_ unexpectedBetweenPrecedenceGroupAndComma: UnexpectedNodesSyntax? = nil,
7240+
comma: TokenSyntax?,
7241+
_ unexpectedBetweenCommaAndDesignatedType: UnexpectedNodesSyntax? = nil,
7242+
designatedType: TokenSyntax?
72397243
) {
72407244
let layout: [RawSyntax?] = [
72417245
unexpectedBeforeColon?.raw,
72427246
colon.raw,
7243-
unexpectedBetweenColonAndPrecedenceGroupAndDesignatedTypes?.raw,
7244-
precedenceGroupAndDesignatedTypes.raw,
7247+
unexpectedBetweenColonAndPrecedenceGroup?.raw,
7248+
precedenceGroup.raw,
7249+
unexpectedBetweenPrecedenceGroupAndComma?.raw,
7250+
comma?.raw,
7251+
unexpectedBetweenCommaAndDesignatedType?.raw,
7252+
designatedType?.raw,
72457253
]
72467254
let raw = RawSyntax.makeLayout(kind: SyntaxKind.operatorPrecedenceAndTypes,
72477255
from: layout, arena: .default)
@@ -7290,65 +7298,134 @@ public struct OperatorPrecedenceAndTypesSyntax: SyntaxProtocol, SyntaxHashable {
72907298
return OperatorPrecedenceAndTypesSyntax(newData)
72917299
}
72927300

7293-
public var unexpectedBetweenColonAndPrecedenceGroupAndDesignatedTypes: UnexpectedNodesSyntax? {
7301+
public var unexpectedBetweenColonAndPrecedenceGroup: UnexpectedNodesSyntax? {
72947302
get {
72957303
let childData = data.child(at: 2, parent: Syntax(self))
72967304
if childData == nil { return nil }
72977305
return UnexpectedNodesSyntax(childData!)
72987306
}
72997307
set(value) {
7300-
self = withUnexpectedBetweenColonAndPrecedenceGroupAndDesignatedTypes(value)
7308+
self = withUnexpectedBetweenColonAndPrecedenceGroup(value)
73017309
}
73027310
}
73037311

7304-
/// Returns a copy of the receiver with its `unexpectedBetweenColonAndPrecedenceGroupAndDesignatedTypes` replaced.
7305-
/// - param newChild: The new `unexpectedBetweenColonAndPrecedenceGroupAndDesignatedTypes` to replace the node's
7306-
/// current `unexpectedBetweenColonAndPrecedenceGroupAndDesignatedTypes`, if present.
7307-
public func withUnexpectedBetweenColonAndPrecedenceGroupAndDesignatedTypes(
7312+
/// Returns a copy of the receiver with its `unexpectedBetweenColonAndPrecedenceGroup` replaced.
7313+
/// - param newChild: The new `unexpectedBetweenColonAndPrecedenceGroup` to replace the node's
7314+
/// current `unexpectedBetweenColonAndPrecedenceGroup`, if present.
7315+
public func withUnexpectedBetweenColonAndPrecedenceGroup(
73087316
_ newChild: UnexpectedNodesSyntax?) -> OperatorPrecedenceAndTypesSyntax {
73097317
let raw = newChild?.raw
73107318
let newData = data.replacingChild(raw, at: 2)
73117319
return OperatorPrecedenceAndTypesSyntax(newData)
73127320
}
73137321

73147322
///
7315-
/// The precedence group and designated types for this operator
7323+
/// The precedence group for this operator
73167324
///
7317-
public var precedenceGroupAndDesignatedTypes: IdentifierListSyntax {
7325+
public var precedenceGroup: TokenSyntax {
73187326
get {
73197327
let childData = data.child(at: 3, parent: Syntax(self))
7320-
return IdentifierListSyntax(childData!)
7328+
return TokenSyntax(childData!)
73217329
}
73227330
set(value) {
7323-
self = withPrecedenceGroupAndDesignatedTypes(value)
7331+
self = withPrecedenceGroup(value)
73247332
}
73257333
}
73267334

7327-
/// Adds the provided `PrecedenceGroupAndDesignatedType` to the node's `precedenceGroupAndDesignatedTypes`
7328-
/// collection.
7329-
/// - param element: The new `PrecedenceGroupAndDesignatedType` to add to the node's
7330-
/// `precedenceGroupAndDesignatedTypes` collection.
7331-
/// - returns: A copy of the receiver with the provided `PrecedenceGroupAndDesignatedType`
7332-
/// appended to its `precedenceGroupAndDesignatedTypes` collection.
7333-
public func addPrecedenceGroupAndDesignatedType(_ element: TokenSyntax) -> OperatorPrecedenceAndTypesSyntax {
7334-
var collection: RawSyntax
7335-
if let col = raw.layoutView!.children[3] {
7336-
collection = col.layoutView!.appending(element.raw, arena: .default)
7337-
} else {
7338-
collection = RawSyntax.makeLayout(kind: SyntaxKind.identifierList,
7339-
from: [element.raw], arena: .default)
7335+
/// Returns a copy of the receiver with its `precedenceGroup` replaced.
7336+
/// - param newChild: The new `precedenceGroup` to replace the node's
7337+
/// current `precedenceGroup`, if present.
7338+
public func withPrecedenceGroup(
7339+
_ newChild: TokenSyntax?) -> OperatorPrecedenceAndTypesSyntax {
7340+
let raw = newChild?.raw ?? RawSyntax.makeMissingToken(kind: TokenKind.identifier(""), arena: .default)
7341+
let newData = data.replacingChild(raw, at: 3)
7342+
return OperatorPrecedenceAndTypesSyntax(newData)
7343+
}
7344+
7345+
public var unexpectedBetweenPrecedenceGroupAndComma: UnexpectedNodesSyntax? {
7346+
get {
7347+
let childData = data.child(at: 4, parent: Syntax(self))
7348+
if childData == nil { return nil }
7349+
return UnexpectedNodesSyntax(childData!)
73407350
}
7341-
let newData = data.replacingChild(collection, at: 3)
7351+
set(value) {
7352+
self = withUnexpectedBetweenPrecedenceGroupAndComma(value)
7353+
}
7354+
}
7355+
7356+
/// Returns a copy of the receiver with its `unexpectedBetweenPrecedenceGroupAndComma` replaced.
7357+
/// - param newChild: The new `unexpectedBetweenPrecedenceGroupAndComma` to replace the node's
7358+
/// current `unexpectedBetweenPrecedenceGroupAndComma`, if present.
7359+
public func withUnexpectedBetweenPrecedenceGroupAndComma(
7360+
_ newChild: UnexpectedNodesSyntax?) -> OperatorPrecedenceAndTypesSyntax {
7361+
let raw = newChild?.raw
7362+
let newData = data.replacingChild(raw, at: 4)
73427363
return OperatorPrecedenceAndTypesSyntax(newData)
73437364
}
73447365

7345-
/// Returns a copy of the receiver with its `precedenceGroupAndDesignatedTypes` replaced.
7346-
/// - param newChild: The new `precedenceGroupAndDesignatedTypes` to replace the node's
7347-
/// current `precedenceGroupAndDesignatedTypes`, if present.
7348-
public func withPrecedenceGroupAndDesignatedTypes(
7349-
_ newChild: IdentifierListSyntax?) -> OperatorPrecedenceAndTypesSyntax {
7350-
let raw = newChild?.raw ?? RawSyntax.makeEmptyLayout(kind: SyntaxKind.identifierList, arena: .default)
7351-
let newData = data.replacingChild(raw, at: 3)
7366+
public var comma: TokenSyntax? {
7367+
get {
7368+
let childData = data.child(at: 5, parent: Syntax(self))
7369+
if childData == nil { return nil }
7370+
return TokenSyntax(childData!)
7371+
}
7372+
set(value) {
7373+
self = withComma(value)
7374+
}
7375+
}
7376+
7377+
/// Returns a copy of the receiver with its `comma` replaced.
7378+
/// - param newChild: The new `comma` to replace the node's
7379+
/// current `comma`, if present.
7380+
public func withComma(
7381+
_ newChild: TokenSyntax?) -> OperatorPrecedenceAndTypesSyntax {
7382+
let raw = newChild?.raw
7383+
let newData = data.replacingChild(raw, at: 5)
7384+
return OperatorPrecedenceAndTypesSyntax(newData)
7385+
}
7386+
7387+
public var unexpectedBetweenCommaAndDesignatedType: UnexpectedNodesSyntax? {
7388+
get {
7389+
let childData = data.child(at: 6, parent: Syntax(self))
7390+
if childData == nil { return nil }
7391+
return UnexpectedNodesSyntax(childData!)
7392+
}
7393+
set(value) {
7394+
self = withUnexpectedBetweenCommaAndDesignatedType(value)
7395+
}
7396+
}
7397+
7398+
/// Returns a copy of the receiver with its `unexpectedBetweenCommaAndDesignatedType` replaced.
7399+
/// - param newChild: The new `unexpectedBetweenCommaAndDesignatedType` to replace the node's
7400+
/// current `unexpectedBetweenCommaAndDesignatedType`, if present.
7401+
public func withUnexpectedBetweenCommaAndDesignatedType(
7402+
_ newChild: UnexpectedNodesSyntax?) -> OperatorPrecedenceAndTypesSyntax {
7403+
let raw = newChild?.raw
7404+
let newData = data.replacingChild(raw, at: 6)
7405+
return OperatorPrecedenceAndTypesSyntax(newData)
7406+
}
7407+
7408+
///
7409+
/// The designated types for this operator
7410+
///
7411+
public var designatedType: TokenSyntax? {
7412+
get {
7413+
let childData = data.child(at: 7, parent: Syntax(self))
7414+
if childData == nil { return nil }
7415+
return TokenSyntax(childData!)
7416+
}
7417+
set(value) {
7418+
self = withDesignatedType(value)
7419+
}
7420+
}
7421+
7422+
/// Returns a copy of the receiver with its `designatedType` replaced.
7423+
/// - param newChild: The new `designatedType` to replace the node's
7424+
/// current `designatedType`, if present.
7425+
public func withDesignatedType(
7426+
_ newChild: TokenSyntax?) -> OperatorPrecedenceAndTypesSyntax {
7427+
let raw = newChild?.raw
7428+
let newData = data.replacingChild(raw, at: 7)
73527429
return OperatorPrecedenceAndTypesSyntax(newData)
73537430
}
73547431
}
@@ -7358,8 +7435,12 @@ extension OperatorPrecedenceAndTypesSyntax: CustomReflectable {
73587435
return Mirror(self, children: [
73597436
"unexpectedBeforeColon": unexpectedBeforeColon.map(Syntax.init)?.asProtocol(SyntaxProtocol.self) as Any,
73607437
"colon": Syntax(colon).asProtocol(SyntaxProtocol.self),
7361-
"unexpectedBetweenColonAndPrecedenceGroupAndDesignatedTypes": unexpectedBetweenColonAndPrecedenceGroupAndDesignatedTypes.map(Syntax.init)?.asProtocol(SyntaxProtocol.self) as Any,
7362-
"precedenceGroupAndDesignatedTypes": Syntax(precedenceGroupAndDesignatedTypes).asProtocol(SyntaxProtocol.self),
7438+
"unexpectedBetweenColonAndPrecedenceGroup": unexpectedBetweenColonAndPrecedenceGroup.map(Syntax.init)?.asProtocol(SyntaxProtocol.self) as Any,
7439+
"precedenceGroup": Syntax(precedenceGroup).asProtocol(SyntaxProtocol.self),
7440+
"unexpectedBetweenPrecedenceGroupAndComma": unexpectedBetweenPrecedenceGroupAndComma.map(Syntax.init)?.asProtocol(SyntaxProtocol.self) as Any,
7441+
"comma": comma.map(Syntax.init)?.asProtocol(SyntaxProtocol.self) as Any,
7442+
"unexpectedBetweenCommaAndDesignatedType": unexpectedBetweenCommaAndDesignatedType.map(Syntax.init)?.asProtocol(SyntaxProtocol.self) as Any,
7443+
"designatedType": designatedType.map(Syntax.init)?.asProtocol(SyntaxProtocol.self) as Any,
73637444
])
73647445
}
73657446
}

0 commit comments

Comments
 (0)