Skip to content

Commit 6ae6c2c

Browse files
committed
add parsing for ~ (the 'without' operator)
1 parent 6e0e1fc commit 6ae6c2c

File tree

6 files changed

+114
-55
lines changed

6 files changed

+114
-55
lines changed

CodeGeneration/Sources/SyntaxSupport/DeclNodes.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -906,6 +906,14 @@ public let DECL_NODES: [Node] = [
906906
"WithTrailingComma"
907907
],
908908
children: [
909+
/// Indicates whether the 'without' operator was applied to the type to
910+
/// indicate the suppression of implicit conformance to this type.
911+
/// This child stores the token representing the 'without' operator.
912+
Child(
913+
name: "HasWithout",
914+
kind: .token(choices: [.token(tokenKind: "PrefixOperatorToken")]),
915+
isOptional: true
916+
),
909917
Child(
910918
name: "TypeName",
911919
kind: .node(kind: "Type")

Sources/SwiftParser/Nominals.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ extension Parser {
219219
var keepGoing: RawTokenSyntax? = nil
220220
var loopProgress = LoopProgressCondition()
221221
repeat {
222+
var withoutToken: RawTokenSyntax? = nil
222223
let type: RawTypeSyntax
223224
if let classKeyword = self.consume(if: .keyword(.class)) {
224225
type = RawTypeSyntax(
@@ -228,12 +229,16 @@ extension Parser {
228229
)
229230
)
230231
} else {
232+
if self.currentToken.starts(with: "~") {
233+
withoutToken = self.consumePrefix("~", as: .prefixOperator)
234+
}
231235
type = self.parseType()
232236
}
233237

234238
keepGoing = self.consume(if: .comma)
235239
elements.append(
236240
RawInheritedTypeSyntax(
241+
hasWithout: withoutToken,
237242
typeName: type,
238243
trailingComma: keepGoing,
239244
arena: self.arena

Sources/SwiftSyntax/generated/raw/RawSyntaxNodes.swift

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

1110411104
public init(
11105-
_ unexpectedBeforeTypeName: RawUnexpectedNodesSyntax? = nil,
11105+
_ unexpectedBeforeHasWithout: RawUnexpectedNodesSyntax? = nil,
11106+
hasWithout: RawTokenSyntax?,
11107+
_ unexpectedBetweenHasWithoutAndTypeName: RawUnexpectedNodesSyntax? = nil,
1110611108
typeName: RawTypeSyntax,
1110711109
_ unexpectedBetweenTypeNameAndTrailingComma: RawUnexpectedNodesSyntax? = nil,
1110811110
trailingComma: RawTokenSyntax?,
1110911111
_ unexpectedAfterTrailingComma: RawUnexpectedNodesSyntax? = nil,
1111011112
arena: __shared SyntaxArena
1111111113
) {
1111211114
let raw = RawSyntax.makeLayout(
11113-
kind: .inheritedType, uninitializedCount: 5, arena: arena) { layout in
11115+
kind: .inheritedType, uninitializedCount: 7, arena: arena) { layout in
1111411116
layout.initialize(repeating: nil)
11115-
layout[0] = unexpectedBeforeTypeName?.raw
11116-
layout[1] = typeName.raw
11117-
layout[2] = unexpectedBetweenTypeNameAndTrailingComma?.raw
11118-
layout[3] = trailingComma?.raw
11119-
layout[4] = unexpectedAfterTrailingComma?.raw
11117+
layout[0] = unexpectedBeforeHasWithout?.raw
11118+
layout[1] = hasWithout?.raw
11119+
layout[2] = unexpectedBetweenHasWithoutAndTypeName?.raw
11120+
layout[3] = typeName.raw
11121+
layout[4] = unexpectedBetweenTypeNameAndTrailingComma?.raw
11122+
layout[5] = trailingComma?.raw
11123+
layout[6] = unexpectedAfterTrailingComma?.raw
1112011124
}
1112111125
self.init(unchecked: raw)
1112211126
}
1112311127

11124-
public var unexpectedBeforeTypeName: RawUnexpectedNodesSyntax? {
11128+
public var unexpectedBeforeHasWithout: RawUnexpectedNodesSyntax? {
1112511129
layoutView.children[0].map(RawUnexpectedNodesSyntax.init(raw:))
1112611130
}
1112711131

11132+
public var hasWithout: RawTokenSyntax? {
11133+
layoutView.children[1].map(RawTokenSyntax.init(raw:))
11134+
}
11135+
11136+
public var unexpectedBetweenHasWithoutAndTypeName: RawUnexpectedNodesSyntax? {
11137+
layoutView.children[2].map(RawUnexpectedNodesSyntax.init(raw:))
11138+
}
11139+
1112811140
public var typeName: RawTypeSyntax {
11129-
layoutView.children[1].map(RawTypeSyntax.init(raw:))!
11141+
layoutView.children[3].map(RawTypeSyntax.init(raw:))!
1113011142
}
1113111143

1113211144
public var unexpectedBetweenTypeNameAndTrailingComma: RawUnexpectedNodesSyntax? {
11133-
layoutView.children[2].map(RawUnexpectedNodesSyntax.init(raw:))
11145+
layoutView.children[4].map(RawUnexpectedNodesSyntax.init(raw:))
1113411146
}
1113511147

1113611148
public var trailingComma: RawTokenSyntax? {
11137-
layoutView.children[3].map(RawTokenSyntax.init(raw:))
11149+
layoutView.children[5].map(RawTokenSyntax.init(raw:))
1113811150
}
1113911151

1114011152
public var unexpectedAfterTrailingComma: RawUnexpectedNodesSyntax? {
11141-
layoutView.children[4].map(RawUnexpectedNodesSyntax.init(raw:))
11153+
layoutView.children[6].map(RawUnexpectedNodesSyntax.init(raw:))
1114211154
}
1114311155
}
1114411156

Sources/SwiftSyntax/generated/raw/RawSyntaxValidation.swift

Lines changed: 21 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -227,12 +227,7 @@ func validateLayout(layout: RawSyntaxBuffer, as kind: SyntaxKind) {
227227
case .accessPathComponent:
228228
assert(layout.count == 5)
229229
assertNoError(kind, 0, verify(layout[0], as: RawUnexpectedNodesSyntax?.self))
230-
assertNoError(kind, 1, verify(layout[1], as: RawTokenSyntax.self, tokenChoices: [
231-
.tokenKind(.identifier),
232-
.tokenKind(.binaryOperator),
233-
.tokenKind(.prefixOperator),
234-
.tokenKind(.postfixOperator)
235-
]))
230+
assertNoError(kind, 1, verify(layout[1], as: RawTokenSyntax.self, tokenChoices: [.tokenKind(.identifier)]))
236231
assertNoError(kind, 2, verify(layout[2], as: RawUnexpectedNodesSyntax?.self))
237232
assertNoError(kind, 3, verify(layout[3], as: RawTokenSyntax?.self, tokenChoices: [.tokenKind(.period)]))
238233
assertNoError(kind, 4, verify(layout[4], as: RawUnexpectedNodesSyntax?.self))
@@ -835,13 +830,7 @@ func validateLayout(layout: RawSyntaxBuffer, as kind: SyntaxKind) {
835830
case .declName:
836831
assert(layout.count == 5)
837832
assertNoError(kind, 0, verify(layout[0], as: RawUnexpectedNodesSyntax?.self))
838-
assertNoError(kind, 1, verify(layout[1], as: RawTokenSyntax.self, tokenChoices: [
839-
.tokenKind(.identifier),
840-
.tokenKind(.binaryOperator),
841-
.keyword("init"),
842-
.keyword("self"),
843-
.keyword("Self")
844-
]))
833+
assertNoError(kind, 1, verify(layout[1], as: RawTokenSyntax.self, tokenChoices: [.tokenKind(.identifier), .tokenKind(.prefixOperator), .keyword("init")]))
845834
assertNoError(kind, 2, verify(layout[2], as: RawUnexpectedNodesSyntax?.self))
846835
assertNoError(kind, 3, verify(layout[3], as: RawDeclNameArgumentsSyntax?.self))
847836
assertNoError(kind, 4, verify(layout[4], as: RawUnexpectedNodesSyntax?.self))
@@ -962,7 +951,7 @@ func validateLayout(layout: RawSyntaxBuffer, as kind: SyntaxKind) {
962951
case .differentiableAttributeArguments:
963952
assert(layout.count == 11)
964953
assertNoError(kind, 0, verify(layout[0], as: RawUnexpectedNodesSyntax?.self))
965-
assertNoError(kind, 1, verify(layout[1], as: RawTokenSyntax?.self, tokenChoices: [.keyword("_forward"), .keyword("reverse"), .keyword("_linear")]))
954+
assertNoError(kind, 1, verify(layout[1], as: RawTokenSyntax?.self, tokenChoices: [.keyword("forward"), .keyword("reverse"), .keyword("linear")]))
966955
assertNoError(kind, 2, verify(layout[2], as: RawUnexpectedNodesSyntax?.self))
967956
assertNoError(kind, 3, verify(layout[3], as: RawTokenSyntax?.self, tokenChoices: [.tokenKind(.comma)]))
968957
assertNoError(kind, 4, verify(layout[4], as: RawUnexpectedNodesSyntax?.self))
@@ -1019,12 +1008,7 @@ func validateLayout(layout: RawSyntaxBuffer, as kind: SyntaxKind) {
10191008
case .editorPlaceholderExpr:
10201009
assert(layout.count == 3)
10211010
assertNoError(kind, 0, verify(layout[0], as: RawUnexpectedNodesSyntax?.self))
1022-
assertNoError(kind, 1, verify(layout[1], as: RawTokenSyntax.self, tokenChoices: [
1023-
.tokenKind(.identifier),
1024-
.keyword("self"),
1025-
.keyword("Self"),
1026-
.keyword("init")
1027-
]))
1011+
assertNoError(kind, 1, verify(layout[1], as: RawTokenSyntax.self, tokenChoices: [.tokenKind(.identifier)]))
10281012
assertNoError(kind, 2, verify(layout[2], as: RawUnexpectedNodesSyntax?.self))
10291013
case .effectsArguments:
10301014
for (index, element) in layout.enumerated() {
@@ -1455,12 +1439,14 @@ func validateLayout(layout: RawSyntaxBuffer, as kind: SyntaxKind) {
14551439
assertNoError(kind, index, verify(element, as: RawInheritedTypeSyntax.self))
14561440
}
14571441
case .inheritedType:
1458-
assert(layout.count == 5)
1442+
assert(layout.count == 7)
14591443
assertNoError(kind, 0, verify(layout[0], as: RawUnexpectedNodesSyntax?.self))
1460-
assertNoError(kind, 1, verify(layout[1], as: RawTypeSyntax.self))
1444+
assertNoError(kind, 1, verify(layout[1], as: RawTokenSyntax?.self, tokenChoices: [.tokenKind(.prefixOperator)]))
14611445
assertNoError(kind, 2, verify(layout[2], as: RawUnexpectedNodesSyntax?.self))
1462-
assertNoError(kind, 3, verify(layout[3], as: RawTokenSyntax?.self, tokenChoices: [.tokenKind(.comma)]))
1446+
assertNoError(kind, 3, verify(layout[3], as: RawTypeSyntax.self))
14631447
assertNoError(kind, 4, verify(layout[4], as: RawUnexpectedNodesSyntax?.self))
1448+
assertNoError(kind, 5, verify(layout[5], as: RawTokenSyntax?.self, tokenChoices: [.tokenKind(.comma)]))
1449+
assertNoError(kind, 6, verify(layout[6], as: RawUnexpectedNodesSyntax?.self))
14641450
case .initializerClause:
14651451
assert(layout.count == 5)
14661452
assertNoError(kind, 0, verify(layout[0], as: RawUnexpectedNodesSyntax?.self))
@@ -1561,7 +1547,14 @@ func validateLayout(layout: RawSyntaxBuffer, as kind: SyntaxKind) {
15611547
case .labeledSpecializeEntry:
15621548
assert(layout.count == 9)
15631549
assertNoError(kind, 0, verify(layout[0], as: RawUnexpectedNodesSyntax?.self))
1564-
assertNoError(kind, 1, verify(layout[1], as: RawTokenSyntax.self))
1550+
assertNoError(kind, 1, verify(layout[1], as: RawTokenSyntax.self, tokenChoices: [
1551+
.tokenKind(.identifier),
1552+
.keyword("available"),
1553+
.keyword("exported"),
1554+
.keyword("kind"),
1555+
.keyword("spi"),
1556+
.keyword("spiModule")
1557+
]))
15651558
assertNoError(kind, 2, verify(layout[2], as: RawUnexpectedNodesSyntax?.self))
15661559
assertNoError(kind, 3, verify(layout[3], as: RawTokenSyntax.self, tokenChoices: [.tokenKind(.colon)]))
15671560
assertNoError(kind, 4, verify(layout[4], as: RawUnexpectedNodesSyntax?.self))
@@ -1785,7 +1778,7 @@ func validateLayout(layout: RawSyntaxBuffer, as kind: SyntaxKind) {
17851778
case .objCSelectorPiece:
17861779
assert(layout.count == 5)
17871780
assertNoError(kind, 0, verify(layout[0], as: RawUnexpectedNodesSyntax?.self))
1788-
assertNoError(kind, 1, verify(layout[1], as: RawTokenSyntax?.self))
1781+
assertNoError(kind, 1, verify(layout[1], as: RawTokenSyntax?.self, tokenChoices: [.tokenKind(.identifier)]))
17891782
assertNoError(kind, 2, verify(layout[2], as: RawUnexpectedNodesSyntax?.self))
17901783
assertNoError(kind, 3, verify(layout[3], as: RawTokenSyntax?.self, tokenChoices: [.tokenKind(.colon)]))
17911784
assertNoError(kind, 4, verify(layout[4], as: RawUnexpectedNodesSyntax?.self))
@@ -2076,10 +2069,9 @@ func validateLayout(layout: RawSyntaxBuffer, as kind: SyntaxKind) {
20762069
assertNoError(kind, 4, verify(layout[4], as: RawUnexpectedNodesSyntax?.self))
20772070
assertNoError(kind, 5, verify(layout[5], as: RawTokenSyntax.self, tokenChoices: [
20782071
.tokenKind(.identifier),
2079-
.keyword("self"),
2080-
.keyword("Self"),
2081-
.keyword("init"),
2082-
.tokenKind(.binaryOperator)
2072+
.tokenKind(.binaryOperator),
2073+
.tokenKind(.prefixOperator),
2074+
.tokenKind(.postfixOperator)
20832075
]))
20842076
assertNoError(kind, 6, verify(layout[6], as: RawUnexpectedNodesSyntax?.self))
20852077
assertNoError(kind, 7, verify(layout[7], as: RawDeclNameArgumentsSyntax?.self))

Sources/SwiftSyntax/generated/syntaxNodes/SyntaxNodes.swift

Lines changed: 46 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11505,7 +11505,9 @@ public struct InheritedTypeSyntax: SyntaxProtocol, SyntaxHashable {
1150511505

1150611506
public init<T: TypeSyntaxProtocol>(
1150711507
leadingTrivia: Trivia? = nil,
11508-
_ unexpectedBeforeTypeName: UnexpectedNodesSyntax? = nil,
11508+
_ unexpectedBeforeHasWithout: UnexpectedNodesSyntax? = nil,
11509+
hasWithout: TokenSyntax? = nil,
11510+
_ unexpectedBetweenHasWithoutAndTypeName: UnexpectedNodesSyntax? = nil,
1150911511
typeName: T,
1151011512
_ unexpectedBetweenTypeNameAndTrailingComma: UnexpectedNodesSyntax? = nil,
1151111513
trailingComma: TokenSyntax? = nil,
@@ -11516,14 +11518,18 @@ public struct InheritedTypeSyntax: SyntaxProtocol, SyntaxHashable {
1151611518
// Extend the lifetime of all parameters so their arenas don't get destroyed
1151711519
// before they can be added as children of the new arena.
1151811520
let data: SyntaxData = withExtendedLifetime((SyntaxArena(), (
11519-
unexpectedBeforeTypeName,
11521+
unexpectedBeforeHasWithout,
11522+
hasWithout,
11523+
unexpectedBetweenHasWithoutAndTypeName,
1152011524
typeName,
1152111525
unexpectedBetweenTypeNameAndTrailingComma,
1152211526
trailingComma,
1152311527
unexpectedAfterTrailingComma
1152411528
))) {(arena, _) in
1152511529
let layout: [RawSyntax?] = [
11526-
unexpectedBeforeTypeName?.raw,
11530+
unexpectedBeforeHasWithout?.raw,
11531+
hasWithout?.raw,
11532+
unexpectedBetweenHasWithoutAndTypeName?.raw,
1152711533
typeName.raw,
1152811534
unexpectedBetweenTypeNameAndTrailingComma?.raw,
1152911535
trailingComma?.raw,
@@ -11541,7 +11547,7 @@ public struct InheritedTypeSyntax: SyntaxProtocol, SyntaxHashable {
1154111547
self.init(data)
1154211548
}
1154311549

11544-
public var unexpectedBeforeTypeName: UnexpectedNodesSyntax? {
11550+
public var unexpectedBeforeHasWithout: UnexpectedNodesSyntax? {
1154511551
get {
1154611552
return data.child(at: 0, parent: Syntax(self)).map(UnexpectedNodesSyntax.init)
1154711553
}
@@ -11550,16 +11556,16 @@ public struct InheritedTypeSyntax: SyntaxProtocol, SyntaxHashable {
1155011556
}
1155111557
}
1155211558

11553-
public var typeName: TypeSyntax {
11559+
public var hasWithout: TokenSyntax? {
1155411560
get {
11555-
return TypeSyntax(data.child(at: 1, parent: Syntax(self))!)
11561+
return data.child(at: 1, parent: Syntax(self)).map(TokenSyntax.init)
1155611562
}
1155711563
set(value) {
11558-
self = InheritedTypeSyntax(data.replacingChild(at: 1, with: value.raw, arena: SyntaxArena()))
11564+
self = InheritedTypeSyntax(data.replacingChild(at: 1, with: value?.raw, arena: SyntaxArena()))
1155911565
}
1156011566
}
1156111567

11562-
public var unexpectedBetweenTypeNameAndTrailingComma: UnexpectedNodesSyntax? {
11568+
public var unexpectedBetweenHasWithoutAndTypeName: UnexpectedNodesSyntax? {
1156311569
get {
1156411570
return data.child(at: 2, parent: Syntax(self)).map(UnexpectedNodesSyntax.init)
1156511571
}
@@ -11568,16 +11574,16 @@ public struct InheritedTypeSyntax: SyntaxProtocol, SyntaxHashable {
1156811574
}
1156911575
}
1157011576

11571-
public var trailingComma: TokenSyntax? {
11577+
public var typeName: TypeSyntax {
1157211578
get {
11573-
return data.child(at: 3, parent: Syntax(self)).map(TokenSyntax.init)
11579+
return TypeSyntax(data.child(at: 3, parent: Syntax(self))!)
1157411580
}
1157511581
set(value) {
11576-
self = InheritedTypeSyntax(data.replacingChild(at: 3, with: value?.raw, arena: SyntaxArena()))
11582+
self = InheritedTypeSyntax(data.replacingChild(at: 3, with: value.raw, arena: SyntaxArena()))
1157711583
}
1157811584
}
1157911585

11580-
public var unexpectedAfterTrailingComma: UnexpectedNodesSyntax? {
11586+
public var unexpectedBetweenTypeNameAndTrailingComma: UnexpectedNodesSyntax? {
1158111587
get {
1158211588
return data.child(at: 4, parent: Syntax(self)).map(UnexpectedNodesSyntax.init)
1158311589
}
@@ -11586,9 +11592,29 @@ public struct InheritedTypeSyntax: SyntaxProtocol, SyntaxHashable {
1158611592
}
1158711593
}
1158811594

11595+
public var trailingComma: TokenSyntax? {
11596+
get {
11597+
return data.child(at: 5, parent: Syntax(self)).map(TokenSyntax.init)
11598+
}
11599+
set(value) {
11600+
self = InheritedTypeSyntax(data.replacingChild(at: 5, with: value?.raw, arena: SyntaxArena()))
11601+
}
11602+
}
11603+
11604+
public var unexpectedAfterTrailingComma: UnexpectedNodesSyntax? {
11605+
get {
11606+
return data.child(at: 6, parent: Syntax(self)).map(UnexpectedNodesSyntax.init)
11607+
}
11608+
set(value) {
11609+
self = InheritedTypeSyntax(data.replacingChild(at: 6, with: value?.raw, arena: SyntaxArena()))
11610+
}
11611+
}
11612+
1158911613
public static var structure: SyntaxNodeStructure {
1159011614
return .layout([
11591-
\Self.unexpectedBeforeTypeName,
11615+
\Self.unexpectedBeforeHasWithout,
11616+
\Self.hasWithout,
11617+
\Self.unexpectedBetweenHasWithoutAndTypeName,
1159211618
\Self.typeName,
1159311619
\Self.unexpectedBetweenTypeNameAndTrailingComma,
1159411620
\Self.trailingComma,
@@ -11608,6 +11634,10 @@ public struct InheritedTypeSyntax: SyntaxProtocol, SyntaxHashable {
1160811634
return nil
1160911635
case 4:
1161011636
return nil
11637+
case 5:
11638+
return nil
11639+
case 6:
11640+
return nil
1161111641
default:
1161211642
fatalError("Invalid index")
1161311643
}
@@ -11617,7 +11647,9 @@ public struct InheritedTypeSyntax: SyntaxProtocol, SyntaxHashable {
1161711647
extension InheritedTypeSyntax: CustomReflectable {
1161811648
public var customMirror: Mirror {
1161911649
return Mirror(self, children: [
11620-
"unexpectedBeforeTypeName": unexpectedBeforeTypeName.map(Syntax.init)?.asProtocol(SyntaxProtocol.self) as Any ,
11650+
"unexpectedBeforeHasWithout": unexpectedBeforeHasWithout.map(Syntax.init)?.asProtocol(SyntaxProtocol.self) as Any ,
11651+
"hasWithout": hasWithout.map(Syntax.init)?.asProtocol(SyntaxProtocol.self) as Any ,
11652+
"unexpectedBetweenHasWithoutAndTypeName": unexpectedBetweenHasWithoutAndTypeName.map(Syntax.init)?.asProtocol(SyntaxProtocol.self) as Any ,
1162111653
"typeName": Syntax(typeName).asProtocol(SyntaxProtocol.self),
1162211654
"unexpectedBetweenTypeNameAndTrailingComma": unexpectedBetweenTypeNameAndTrailingComma.map(Syntax.init)?.asProtocol(SyntaxProtocol.self) as Any ,
1162311655
"trailingComma": trailingComma.map(Syntax.init)?.asProtocol(SyntaxProtocol.self) as Any ,

Tests/SwiftParserTest/DeclarationTests.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1551,6 +1551,16 @@ final class DeclarationTests: XCTestCase {
15511551
"""
15521552
)
15531553
}
1554+
1555+
func testSuppressedImplicitConformance() {
1556+
assertParse(
1557+
"""
1558+
struct Hello: ~Copyable {}
1559+
1560+
enum Whatever: Int, ~ Hashable, Equatable {}
1561+
"""
1562+
)
1563+
}
15541564
}
15551565

15561566
extension Parser.DeclAttributes {

0 commit comments

Comments
 (0)