Skip to content

Commit a283982

Browse files
committed
add parsing for ~ (the 'without' operator)
1 parent 27cd619 commit a283982

File tree

8 files changed

+99
-32
lines changed

8 files changed

+99
-32
lines changed

CodeGeneration/Sources/SyntaxSupport/DeclNodes.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1029,6 +1029,14 @@ public let DECL_NODES: [Node] = [
10291029
"WithTrailingComma"
10301030
],
10311031
children: [
1032+
/// Indicates whether the 'without' operator was applied to the type to
1033+
/// indicate the suppression of implicit conformance to this type.
1034+
/// This child stores the token representing the 'without' operator.
1035+
Child(
1036+
name: "HasWithout",
1037+
kind: .token(choices: [.token(tokenKind: "PrefixOperatorToken")]),
1038+
isOptional: true
1039+
),
10321040
Child(
10331041
name: "TypeName",
10341042
kind: .node(kind: "Type")

Sources/SwiftParser/Nominals.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,7 @@ extension Parser {
279279
var keepGoing: RawTokenSyntax? = nil
280280
var loopProgress = LoopProgressCondition()
281281
repeat {
282+
var withoutToken: RawTokenSyntax? = nil
282283
let type: RawTypeSyntax
283284
if let classKeyword = self.consume(if: .keyword(.class)) {
284285
type = RawTypeSyntax(
@@ -288,12 +289,16 @@ extension Parser {
288289
)
289290
)
290291
} else {
292+
if self.currentToken.starts(with: "~") {
293+
withoutToken = self.consumePrefix("~", as: .prefixOperator)
294+
}
291295
type = self.parseType()
292296
}
293297

294298
keepGoing = self.consume(if: .comma)
295299
elements.append(
296300
RawInheritedTypeSyntax(
301+
hasWithout: withoutToken,
297302
typeName: type,
298303
trailingComma: keepGoing,
299304
arena: self.arena

Sources/SwiftSyntax/generated/ChildNameForKeyPath.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1713,8 +1713,12 @@ public func childName(_ keyPath: AnyKeyPath) -> String? {
17131713
return "rightOperand"
17141714
case \InfixOperatorExprSyntax.unexpectedAfterRightOperand:
17151715
return "unexpectedAfterRightOperand"
1716-
case \InheritedTypeSyntax.unexpectedBeforeTypeName:
1717-
return "unexpectedBeforeTypeName"
1716+
case \InheritedTypeSyntax.unexpectedBeforeHasWithout:
1717+
return "unexpectedBeforeHasWithout"
1718+
case \InheritedTypeSyntax.hasWithout:
1719+
return "hasWithout"
1720+
case \InheritedTypeSyntax.unexpectedBetweenHasWithoutAndTypeName:
1721+
return "unexpectedBetweenHasWithoutAndTypeName"
17181722
case \InheritedTypeSyntax.typeName:
17191723
return "typeName"
17201724
case \InheritedTypeSyntax.unexpectedBetweenTypeNameAndTrailingComma:

Sources/SwiftSyntax/generated/raw/RawSyntaxNodes.swift

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11708,43 +11708,55 @@ public struct RawInheritedTypeSyntax: RawSyntaxNodeProtocol {
1170811708
}
1170911709

1171011710
public init(
11711-
_ unexpectedBeforeTypeName: RawUnexpectedNodesSyntax? = nil,
11711+
_ unexpectedBeforeHasWithout: RawUnexpectedNodesSyntax? = nil,
11712+
hasWithout: RawTokenSyntax?,
11713+
_ unexpectedBetweenHasWithoutAndTypeName: RawUnexpectedNodesSyntax? = nil,
1171211714
typeName: RawTypeSyntax,
1171311715
_ unexpectedBetweenTypeNameAndTrailingComma: RawUnexpectedNodesSyntax? = nil,
1171411716
trailingComma: RawTokenSyntax?,
1171511717
_ unexpectedAfterTrailingComma: RawUnexpectedNodesSyntax? = nil,
1171611718
arena: __shared SyntaxArena
1171711719
) {
1171811720
let raw = RawSyntax.makeLayout(
11719-
kind: .inheritedType, uninitializedCount: 5, arena: arena) { layout in
11721+
kind: .inheritedType, uninitializedCount: 7, arena: arena) { layout in
1172011722
layout.initialize(repeating: nil)
11721-
layout[0] = unexpectedBeforeTypeName?.raw
11722-
layout[1] = typeName.raw
11723-
layout[2] = unexpectedBetweenTypeNameAndTrailingComma?.raw
11724-
layout[3] = trailingComma?.raw
11725-
layout[4] = unexpectedAfterTrailingComma?.raw
11723+
layout[0] = unexpectedBeforeHasWithout?.raw
11724+
layout[1] = hasWithout?.raw
11725+
layout[2] = unexpectedBetweenHasWithoutAndTypeName?.raw
11726+
layout[3] = typeName.raw
11727+
layout[4] = unexpectedBetweenTypeNameAndTrailingComma?.raw
11728+
layout[5] = trailingComma?.raw
11729+
layout[6] = unexpectedAfterTrailingComma?.raw
1172611730
}
1172711731
self.init(unchecked: raw)
1172811732
}
1172911733

11730-
public var unexpectedBeforeTypeName: RawUnexpectedNodesSyntax? {
11734+
public var unexpectedBeforeHasWithout: RawUnexpectedNodesSyntax? {
1173111735
layoutView.children[0].map(RawUnexpectedNodesSyntax.init(raw:))
1173211736
}
1173311737

11738+
public var hasWithout: RawTokenSyntax? {
11739+
layoutView.children[1].map(RawTokenSyntax.init(raw:))
11740+
}
11741+
11742+
public var unexpectedBetweenHasWithoutAndTypeName: RawUnexpectedNodesSyntax? {
11743+
layoutView.children[2].map(RawUnexpectedNodesSyntax.init(raw:))
11744+
}
11745+
1173411746
public var typeName: RawTypeSyntax {
11735-
layoutView.children[1].map(RawTypeSyntax.init(raw:))!
11747+
layoutView.children[3].map(RawTypeSyntax.init(raw:))!
1173611748
}
1173711749

1173811750
public var unexpectedBetweenTypeNameAndTrailingComma: RawUnexpectedNodesSyntax? {
11739-
layoutView.children[2].map(RawUnexpectedNodesSyntax.init(raw:))
11751+
layoutView.children[4].map(RawUnexpectedNodesSyntax.init(raw:))
1174011752
}
1174111753

1174211754
public var trailingComma: RawTokenSyntax? {
11743-
layoutView.children[3].map(RawTokenSyntax.init(raw:))
11755+
layoutView.children[5].map(RawTokenSyntax.init(raw:))
1174411756
}
1174511757

1174611758
public var unexpectedAfterTrailingComma: RawUnexpectedNodesSyntax? {
11747-
layoutView.children[4].map(RawUnexpectedNodesSyntax.init(raw:))
11759+
layoutView.children[6].map(RawUnexpectedNodesSyntax.init(raw:))
1174811760
}
1174911761
}
1175011762

Sources/SwiftSyntax/generated/raw/RawSyntaxValidation.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1503,12 +1503,14 @@ func validateLayout(layout: RawSyntaxBuffer, as kind: SyntaxKind) {
15031503
assertNoError(kind, index, verify(element, as: RawInheritedTypeSyntax.self))
15041504
}
15051505
case .inheritedType:
1506-
assert(layout.count == 5)
1506+
assert(layout.count == 7)
15071507
assertNoError(kind, 0, verify(layout[0], as: RawUnexpectedNodesSyntax?.self))
1508-
assertNoError(kind, 1, verify(layout[1], as: RawTypeSyntax.self))
1508+
assertNoError(kind, 1, verify(layout[1], as: RawTokenSyntax?.self, tokenChoices: [.tokenKind(.prefixOperator)]))
15091509
assertNoError(kind, 2, verify(layout[2], as: RawUnexpectedNodesSyntax?.self))
1510-
assertNoError(kind, 3, verify(layout[3], as: RawTokenSyntax?.self, tokenChoices: [.tokenKind(.comma)]))
1510+
assertNoError(kind, 3, verify(layout[3], as: RawTypeSyntax.self))
15111511
assertNoError(kind, 4, verify(layout[4], as: RawUnexpectedNodesSyntax?.self))
1512+
assertNoError(kind, 5, verify(layout[5], as: RawTokenSyntax?.self, tokenChoices: [.tokenKind(.comma)]))
1513+
assertNoError(kind, 6, verify(layout[6], as: RawUnexpectedNodesSyntax?.self))
15121514
case .initializerClause:
15131515
assert(layout.count == 5)
15141516
assertNoError(kind, 0, verify(layout[0], as: RawUnexpectedNodesSyntax?.self))

Sources/SwiftSyntax/generated/syntaxNodes/SyntaxNodes.swift

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10564,7 +10564,9 @@ public struct InheritedTypeSyntax: SyntaxProtocol, SyntaxHashable {
1056410564

1056510565
public init<T: TypeSyntaxProtocol>(
1056610566
leadingTrivia: Trivia? = nil,
10567-
_ unexpectedBeforeTypeName: UnexpectedNodesSyntax? = nil,
10567+
_ unexpectedBeforeHasWithout: UnexpectedNodesSyntax? = nil,
10568+
hasWithout: TokenSyntax? = nil,
10569+
_ unexpectedBetweenHasWithoutAndTypeName: UnexpectedNodesSyntax? = nil,
1056810570
typeName: T,
1056910571
_ unexpectedBetweenTypeNameAndTrailingComma: UnexpectedNodesSyntax? = nil,
1057010572
trailingComma: TokenSyntax? = nil,
@@ -10575,14 +10577,18 @@ public struct InheritedTypeSyntax: SyntaxProtocol, SyntaxHashable {
1057510577
// Extend the lifetime of all parameters so their arenas don't get destroyed
1057610578
// before they can be added as children of the new arena.
1057710579
let data: SyntaxData = withExtendedLifetime((SyntaxArena(), (
10578-
unexpectedBeforeTypeName,
10580+
unexpectedBeforeHasWithout,
10581+
hasWithout,
10582+
unexpectedBetweenHasWithoutAndTypeName,
1057910583
typeName,
1058010584
unexpectedBetweenTypeNameAndTrailingComma,
1058110585
trailingComma,
1058210586
unexpectedAfterTrailingComma
1058310587
))) {(arena, _) in
1058410588
let layout: [RawSyntax?] = [
10585-
unexpectedBeforeTypeName?.raw,
10589+
unexpectedBeforeHasWithout?.raw,
10590+
hasWithout?.raw,
10591+
unexpectedBetweenHasWithoutAndTypeName?.raw,
1058610592
typeName.raw,
1058710593
unexpectedBetweenTypeNameAndTrailingComma?.raw,
1058810594
trailingComma?.raw,
@@ -10601,7 +10607,7 @@ public struct InheritedTypeSyntax: SyntaxProtocol, SyntaxHashable {
1060110607
self.init(data)
1060210608
}
1060310609

10604-
public var unexpectedBeforeTypeName: UnexpectedNodesSyntax? {
10610+
public var unexpectedBeforeHasWithout: UnexpectedNodesSyntax? {
1060510611
get {
1060610612
return data.child(at: 0, parent: Syntax(self)).map(UnexpectedNodesSyntax.init)
1060710613
}
@@ -10610,16 +10616,16 @@ public struct InheritedTypeSyntax: SyntaxProtocol, SyntaxHashable {
1061010616
}
1061110617
}
1061210618

10613-
public var typeName: TypeSyntax {
10619+
public var hasWithout: TokenSyntax? {
1061410620
get {
10615-
return TypeSyntax(data.child(at: 1, parent: Syntax(self))!)
10621+
return data.child(at: 1, parent: Syntax(self)).map(TokenSyntax.init)
1061610622
}
1061710623
set(value) {
10618-
self = InheritedTypeSyntax(data.replacingChild(at: 1, with: value.raw, arena: SyntaxArena()))
10624+
self = InheritedTypeSyntax(data.replacingChild(at: 1, with: value?.raw, arena: SyntaxArena()))
1061910625
}
1062010626
}
1062110627

10622-
public var unexpectedBetweenTypeNameAndTrailingComma: UnexpectedNodesSyntax? {
10628+
public var unexpectedBetweenHasWithoutAndTypeName: UnexpectedNodesSyntax? {
1062310629
get {
1062410630
return data.child(at: 2, parent: Syntax(self)).map(UnexpectedNodesSyntax.init)
1062510631
}
@@ -10628,16 +10634,16 @@ public struct InheritedTypeSyntax: SyntaxProtocol, SyntaxHashable {
1062810634
}
1062910635
}
1063010636

10631-
public var trailingComma: TokenSyntax? {
10637+
public var typeName: TypeSyntax {
1063210638
get {
10633-
return data.child(at: 3, parent: Syntax(self)).map(TokenSyntax.init)
10639+
return TypeSyntax(data.child(at: 3, parent: Syntax(self))!)
1063410640
}
1063510641
set(value) {
10636-
self = InheritedTypeSyntax(data.replacingChild(at: 3, with: value?.raw, arena: SyntaxArena()))
10642+
self = InheritedTypeSyntax(data.replacingChild(at: 3, with: value.raw, arena: SyntaxArena()))
1063710643
}
1063810644
}
1063910645

10640-
public var unexpectedAfterTrailingComma: UnexpectedNodesSyntax? {
10646+
public var unexpectedBetweenTypeNameAndTrailingComma: UnexpectedNodesSyntax? {
1064110647
get {
1064210648
return data.child(at: 4, parent: Syntax(self)).map(UnexpectedNodesSyntax.init)
1064310649
}
@@ -10646,9 +10652,29 @@ public struct InheritedTypeSyntax: SyntaxProtocol, SyntaxHashable {
1064610652
}
1064710653
}
1064810654

10655+
public var trailingComma: TokenSyntax? {
10656+
get {
10657+
return data.child(at: 5, parent: Syntax(self)).map(TokenSyntax.init)
10658+
}
10659+
set(value) {
10660+
self = InheritedTypeSyntax(data.replacingChild(at: 5, with: value?.raw, arena: SyntaxArena()))
10661+
}
10662+
}
10663+
10664+
public var unexpectedAfterTrailingComma: UnexpectedNodesSyntax? {
10665+
get {
10666+
return data.child(at: 6, parent: Syntax(self)).map(UnexpectedNodesSyntax.init)
10667+
}
10668+
set(value) {
10669+
self = InheritedTypeSyntax(data.replacingChild(at: 6, with: value?.raw, arena: SyntaxArena()))
10670+
}
10671+
}
10672+
1064910673
public static var structure: SyntaxNodeStructure {
1065010674
return .layout([
10651-
\Self.unexpectedBeforeTypeName,
10675+
\Self.unexpectedBeforeHasWithout,
10676+
\Self.hasWithout,
10677+
\Self.unexpectedBetweenHasWithoutAndTypeName,
1065210678
\Self.typeName,
1065310679
\Self.unexpectedBetweenTypeNameAndTrailingComma,
1065410680
\Self.trailingComma,

Tests/SwiftParserTest/Assertions.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
import XCTest
1414
@_spi(RawSyntax) import SwiftSyntax
15-
@_spi(Testing)@_spi(RawSyntax) import SwiftParser
15+
@_spi(Testing) @_spi(RawSyntax) import SwiftParser
1616
@_spi(RawSyntax) import SwiftParserDiagnostics
1717
import SwiftDiagnostics
1818
import _SwiftSyntaxTestSupport

Tests/SwiftParserTest/DeclarationTests.swift

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
@_spi(RawSyntax) import SwiftSyntax
14-
@_spi(Testing)@_spi(RawSyntax) import SwiftParser
14+
@_spi(Testing) @_spi(RawSyntax) import SwiftParser
1515
import SwiftSyntaxBuilder
1616
import SwiftBasicFormat
1717
import XCTest
@@ -1561,6 +1561,16 @@ final class DeclarationTests: XCTestCase {
15611561
]
15621562
)
15631563
}
1564+
1565+
func testSuppressedImplicitConformance() {
1566+
assertParse(
1567+
"""
1568+
struct Hello: ~Copyable {}
1569+
1570+
enum Whatever: Int, ~ Hashable, Equatable {}
1571+
"""
1572+
)
1573+
}
15641574
}
15651575

15661576
extension Parser.DeclAttributes {

0 commit comments

Comments
 (0)