Skip to content

Commit fb9d8d2

Browse files
authored
Merge pull request swiftlang#1461 from kavon/without-operator
add parsing for ~ (the 'without' operator)
2 parents 92178c0 + 6ae6c2c commit fb9d8d2

File tree

6 files changed

+98
-29
lines changed

6 files changed

+98
-29
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: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1439,12 +1439,14 @@ func validateLayout(layout: RawSyntaxBuffer, as kind: SyntaxKind) {
14391439
assertNoError(kind, index, verify(element, as: RawInheritedTypeSyntax.self))
14401440
}
14411441
case .inheritedType:
1442-
assert(layout.count == 5)
1442+
assert(layout.count == 7)
14431443
assertNoError(kind, 0, verify(layout[0], as: RawUnexpectedNodesSyntax?.self))
1444-
assertNoError(kind, 1, verify(layout[1], as: RawTypeSyntax.self))
1444+
assertNoError(kind, 1, verify(layout[1], as: RawTokenSyntax?.self, tokenChoices: [.tokenKind(.prefixOperator)]))
14451445
assertNoError(kind, 2, verify(layout[2], as: RawUnexpectedNodesSyntax?.self))
1446-
assertNoError(kind, 3, verify(layout[3], as: RawTokenSyntax?.self, tokenChoices: [.tokenKind(.comma)]))
1446+
assertNoError(kind, 3, verify(layout[3], as: RawTypeSyntax.self))
14471447
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))
14481450
case .initializerClause:
14491451
assert(layout.count == 5)
14501452
assertNoError(kind, 0, verify(layout[0], as: RawUnexpectedNodesSyntax?.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
@@ -1549,6 +1549,16 @@ final class DeclarationTests: XCTestCase {
15491549
"""
15501550
)
15511551
}
1552+
1553+
func testSuppressedImplicitConformance() {
1554+
assertParse(
1555+
"""
1556+
struct Hello: ~Copyable {}
1557+
1558+
enum Whatever: Int, ~ Hashable, Equatable {}
1559+
"""
1560+
)
1561+
}
15521562
}
15531563

15541564
extension Parser.DeclAttributes {

0 commit comments

Comments
 (0)