Skip to content

Commit 2c97ee0

Browse files
committed
support parsing discard in place of _forget
SE-390 concluded with choosing the keyword `discard` rather than `forget`. This commit begins the process of deprecating the old keyword on the swift-syntax side. rdar://108859077
1 parent 7fbb726 commit 2c97ee0

19 files changed

+358
-325
lines changed

CodeGeneration/Sources/SyntaxSupport/KeywordSpec.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,8 @@ public let KEYWORDS: [KeywordSpec] = [
134134
KeywordSpec("fileprivate", isLexerClassified: true, requiresTrailingSpace: true),
135135
KeywordSpec("final"),
136136
KeywordSpec("for", isLexerClassified: true, requiresTrailingSpace: true),
137-
KeywordSpec("_forget"),
137+
KeywordSpec("_forget"), // NOTE: support for deprecated _forget
138+
KeywordSpec("discard"),
138139
KeywordSpec("forward"),
139140
KeywordSpec("func", isLexerClassified: true, requiresTrailingSpace: true),
140141
KeywordSpec("get"),

CodeGeneration/Sources/SyntaxSupport/StmtNodes.swift

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -333,15 +333,18 @@ public let STMT_NODES: [Node] = [
333333
]
334334
),
335335

336-
// forget-stmt -> 'forget' expr ';'?
336+
// discard-stmt -> 'discard' expr ';'?
337337
Node(
338-
name: "ForgetStmt",
339-
nameForDiagnostics: "'forget' statement",
338+
name: "DiscardStmt",
339+
nameForDiagnostics: "'discard' statement",
340340
kind: "Stmt",
341341
children: [
342342
Child(
343-
name: "ForgetKeyword",
344-
kind: .token(choices: [.keyword(text: "_forget")])
343+
name: "DiscardKeyword",
344+
kind: .token(choices: [
345+
.keyword(text: "_forget"), // NOTE: support for deprecated _forget
346+
.keyword(text: "discard"),
347+
])
345348
),
346349
Child(
347350
name: "Expression",

Sources/SwiftParser/Statements.swift

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ extension Parser {
5555
/// statement → control-transfer-statement ';'?
5656
/// statement → defer-statement ';'?
5757
/// statement → do-statement ';'?
58-
/// statement → forget-statement ';'?
58+
/// statement → discard-statement ';'?
5959
///
6060
/// loop-statement → for-in-statement
6161
/// loop-statement → while-statement
@@ -124,8 +124,10 @@ extension Parser {
124124
return label(self.parseContinueStatement(continueHandle: handle), with: optLabel)
125125
case (.fallthroughKeyword, let handle)?:
126126
return label(self.parseFallthroughStatement(fallthroughHandle: handle), with: optLabel)
127-
case (.forgetKeyword, let handle)?:
128-
return label(self.parseForgetStatement(forgetHandle: handle), with: optLabel)
127+
case (.forgetKeyword, let handle)?: // NOTE: support for deprecated _forget
128+
fallthrough
129+
case (.discardKeyword, let handle)?:
130+
return label(self.parseDiscardStatement(discardHandle: handle), with: optLabel)
129131
case (.returnKeyword, let handle)?:
130132
return label(self.parseReturnStatement(returnHandle: handle), with: optLabel)
131133
case (.throwKeyword, let handle)?:
@@ -393,22 +395,24 @@ extension Parser {
393395
}
394396
}
395397

396-
// MARK: Forget Statements
398+
// MARK: Discard Statements
397399

398400
extension Parser {
399-
/// Parse a forget statement.
401+
/// Parse a discard statement.
400402
///
401403
/// Grammar
402404
/// =======
403405
///
404-
/// forget-statement → 'forget' expression
406+
/// discard-statement → 'discard' expression
407+
///
408+
/// where expression's first token is an identifier.
405409
@_spi(RawSyntax)
406-
public mutating func parseForgetStatement(forgetHandle: RecoveryConsumptionHandle) -> RawForgetStmtSyntax {
407-
let (unexpectedBeforeForgetKeyword, forgetKeyword) = self.eat(forgetHandle)
410+
public mutating func parseDiscardStatement(discardHandle: RecoveryConsumptionHandle) -> RawDiscardStmtSyntax {
411+
let (unexpectedBeforeDiscardKeyword, discardKeyword) = self.eat(discardHandle)
408412
let expr = self.parseExpression()
409-
return RawForgetStmtSyntax(
410-
unexpectedBeforeForgetKeyword,
411-
forgetKeyword: forgetKeyword,
413+
return RawDiscardStmtSyntax(
414+
unexpectedBeforeDiscardKeyword,
415+
discardKeyword: discardKeyword,
412416
expression: expr,
413417
arena: self.arena
414418
)
@@ -1009,22 +1013,24 @@ extension Parser.Lookahead {
10091013
// yield statement of some singular expression.
10101014
return !self.peek().isAtStartOfLine
10111015
}
1012-
case .forgetKeyword?:
1016+
case .forgetKeyword?: // NOTE: support for deprecated _forget
1017+
fallthrough
1018+
case .discardKeyword?:
10131019
let next = peek()
1014-
// The thing to be forgotten must be on the same line as `forget`.
1020+
// The thing to be discarded must be on the same line as `discard`.
10151021
if next.isAtStartOfLine {
10161022
return false
10171023
}
10181024
switch next.rawTokenKind {
10191025
case .identifier, .keyword:
10201026
// Since some identifiers like "self" are classified as keywords,
1021-
// we want to recognize those too, to handle "forget self". We also
1027+
// we want to recognize those too, to handle "discard self". We also
10221028
// accept any identifier since we want to emit a nice error message
10231029
// later on during type checking.
10241030
return true
10251031
default:
1026-
// any other token following "forget" means it's not the statement.
1027-
// For example, could be the function call "forget()".
1032+
// any other token following "discard" means it's not the statement.
1033+
// For example, could be the function call "discard()".
10281034
return false
10291035
}
10301036
case nil:

Sources/SwiftParser/TokenSpecSet.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ enum CanBeStatementStart: TokenSpecSet {
8080
case doKeyword
8181
case fallthroughKeyword
8282
case forKeyword
83-
case forgetKeyword
83+
case forgetKeyword // NOTE: support for deprecated _forget
84+
case discardKeyword
8485
case guardKeyword
8586
case ifKeyword
8687
case repeatKeyword
@@ -99,6 +100,7 @@ enum CanBeStatementStart: TokenSpecSet {
99100
case TokenSpec(.fallthrough): self = .fallthroughKeyword
100101
case TokenSpec(.for): self = .forKeyword
101102
case TokenSpec(._forget): self = .forgetKeyword
103+
case TokenSpec(.discard): self = .discardKeyword
102104
case TokenSpec(.guard): self = .guardKeyword
103105
case TokenSpec(.if): self = .ifKeyword
104106
case TokenSpec(.repeat): self = .repeatKeyword
@@ -120,6 +122,7 @@ enum CanBeStatementStart: TokenSpecSet {
120122
case .fallthroughKeyword: return .keyword(.fallthrough)
121123
case .forKeyword: return .keyword(.for)
122124
case .forgetKeyword: return TokenSpec(._forget, recoveryPrecedence: .stmtKeyword)
125+
case .discardKeyword: return TokenSpec(.discard, recoveryPrecedence: .stmtKeyword)
123126
case .guardKeyword: return .keyword(.guard)
124127
case .ifKeyword: return .keyword(.if)
125128
case .repeatKeyword: return .keyword(.repeat)

Sources/SwiftParserDiagnostics/generated/SyntaxKindNameForDiagnostics.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@ extension SyntaxKind {
133133
return "differentiability parameters"
134134
case .differentiableAttributeArguments:
135135
return "'@differentiable' arguments"
136+
case .discardStmt:
137+
return "'discard' statement"
136138
case .doStmt:
137139
return "'do' statement"
138140
case .documentationAttributeArgument:
@@ -173,8 +175,6 @@ extension SyntaxKind {
173175
return "'for' statement"
174176
case .forcedValueExpr:
175177
return "force unwrap"
176-
case .forgetStmt:
177-
return "'forget' statement"
178178
case .functionCallExpr:
179179
return "function call"
180180
case .functionDecl:

Sources/SwiftSyntax/Documentation.docc/generated/SwiftSyntax.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,11 +153,11 @@ allows Swift tools to parse, inspect, generate, and transform Swift source code.
153153
- <doc:SwiftSyntax/BreakStmtSyntax>
154154
- <doc:SwiftSyntax/ContinueStmtSyntax>
155155
- <doc:SwiftSyntax/DeferStmtSyntax>
156+
- <doc:SwiftSyntax/DiscardStmtSyntax>
156157
- <doc:SwiftSyntax/DoStmtSyntax>
157158
- <doc:SwiftSyntax/ExpressionStmtSyntax>
158159
- <doc:SwiftSyntax/FallthroughStmtSyntax>
159160
- <doc:SwiftSyntax/ForInStmtSyntax>
160-
- <doc:SwiftSyntax/ForgetStmtSyntax>
161161
- <doc:SwiftSyntax/GuardStmtSyntax>
162162
- <doc:SwiftSyntax/LabeledStmtSyntax>
163163
- <doc:SwiftSyntax/RepeatWhileStmtSyntax>

Sources/SwiftSyntax/generated/ChildNameForKeyPath.swift

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1003,6 +1003,16 @@ public func childName(_ keyPath: AnyKeyPath) -> String? {
10031003
return "wildcard"
10041004
case \DiscardAssignmentExprSyntax.unexpectedAfterWildcard:
10051005
return "unexpectedAfterWildcard"
1006+
case \DiscardStmtSyntax.unexpectedBeforeDiscardKeyword:
1007+
return "unexpectedBeforeDiscardKeyword"
1008+
case \DiscardStmtSyntax.discardKeyword:
1009+
return "discardKeyword"
1010+
case \DiscardStmtSyntax.unexpectedBetweenDiscardKeywordAndExpression:
1011+
return "unexpectedBetweenDiscardKeywordAndExpression"
1012+
case \DiscardStmtSyntax.expression:
1013+
return "expression"
1014+
case \DiscardStmtSyntax.unexpectedAfterExpression:
1015+
return "unexpectedAfterExpression"
10061016
case \DoStmtSyntax.unexpectedBeforeDoKeyword:
10071017
return "unexpectedBeforeDoKeyword"
10081018
case \DoStmtSyntax.doKeyword:
@@ -1317,16 +1327,6 @@ public func childName(_ keyPath: AnyKeyPath) -> String? {
13171327
return "exclamationMark"
13181328
case \ForcedValueExprSyntax.unexpectedAfterExclamationMark:
13191329
return "unexpectedAfterExclamationMark"
1320-
case \ForgetStmtSyntax.unexpectedBeforeForgetKeyword:
1321-
return "unexpectedBeforeForgetKeyword"
1322-
case \ForgetStmtSyntax.forgetKeyword:
1323-
return "forgetKeyword"
1324-
case \ForgetStmtSyntax.unexpectedBetweenForgetKeywordAndExpression:
1325-
return "unexpectedBetweenForgetKeywordAndExpression"
1326-
case \ForgetStmtSyntax.expression:
1327-
return "expression"
1328-
case \ForgetStmtSyntax.unexpectedAfterExpression:
1329-
return "unexpectedAfterExpression"
13301330
case \FunctionCallExprSyntax.unexpectedBeforeCalledExpression:
13311331
return "unexpectedBeforeCalledExpression"
13321332
case \FunctionCallExprSyntax.calledExpression:

Sources/SwiftSyntax/generated/Keyword.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ public enum Keyword: UInt8, Hashable {
112112
case final
113113
case `for`
114114
case _forget
115+
case discard
115116
case forward
116117
case `func`
117118
case get
@@ -427,6 +428,8 @@ public enum Keyword: UInt8, Hashable {
427428
self = .dynamic
428429
case "_forget":
429430
self = ._forget
431+
case "discard":
432+
self = .discard
430433
case "forward":
431434
self = .forward
432435
case "message":
@@ -832,6 +835,7 @@ public enum Keyword: UInt8, Hashable {
832835
"final",
833836
"for",
834837
"_forget",
838+
"discard",
835839
"forward",
836840
"func",
837841
"get",

Sources/SwiftSyntax/generated/SyntaxAnyVisitor.swift

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -741,6 +741,14 @@ open class SyntaxAnyVisitor: SyntaxVisitor {
741741
visitAnyPost(node._syntaxNode)
742742
}
743743

744+
override open func visit(_ node: DiscardStmtSyntax) -> SyntaxVisitorContinueKind {
745+
return visitAny(node._syntaxNode)
746+
}
747+
748+
override open func visitPost(_ node: DiscardStmtSyntax) {
749+
visitAnyPost(node._syntaxNode)
750+
}
751+
744752
override open func visit(_ node: DoStmtSyntax) -> SyntaxVisitorContinueKind {
745753
return visitAny(node._syntaxNode)
746754
}
@@ -933,14 +941,6 @@ open class SyntaxAnyVisitor: SyntaxVisitor {
933941
visitAnyPost(node._syntaxNode)
934942
}
935943

936-
override open func visit(_ node: ForgetStmtSyntax) -> SyntaxVisitorContinueKind {
937-
return visitAny(node._syntaxNode)
938-
}
939-
940-
override open func visitPost(_ node: ForgetStmtSyntax) {
941-
visitAnyPost(node._syntaxNode)
942-
}
943-
944944
override open func visit(_ node: FunctionCallExprSyntax) -> SyntaxVisitorContinueKind {
945945
return visitAny(node._syntaxNode)
946946
}

Sources/SwiftSyntax/generated/SyntaxBaseNodes.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,7 @@ public struct StmtSyntax: StmtSyntaxProtocol, SyntaxHashable {
483483

484484
public init?<S: SyntaxProtocol>(_ node: S) {
485485
switch node.raw.kind {
486-
case .breakStmt, .continueStmt, .deferStmt, .doStmt, .expressionStmt, .fallthroughStmt, .forInStmt, .forgetStmt, .guardStmt, .labeledStmt, .missingStmt, .repeatWhileStmt, .returnStmt, .throwStmt, .whileStmt, .yieldStmt:
486+
case .breakStmt, .continueStmt, .deferStmt, .discardStmt, .doStmt, .expressionStmt, .fallthroughStmt, .forInStmt, .guardStmt, .labeledStmt, .missingStmt, .repeatWhileStmt, .returnStmt, .throwStmt, .whileStmt, .yieldStmt:
487487
self._syntaxNode = node._syntaxNode
488488
default:
489489
return nil
@@ -495,7 +495,7 @@ public struct StmtSyntax: StmtSyntaxProtocol, SyntaxHashable {
495495
/// is undefined.
496496
internal init(_ data: SyntaxData) {
497497
switch data.raw.kind {
498-
case .breakStmt, .continueStmt, .deferStmt, .doStmt, .expressionStmt, .fallthroughStmt, .forInStmt, .forgetStmt, .guardStmt, .labeledStmt, .missingStmt, .repeatWhileStmt, .returnStmt, .throwStmt, .whileStmt, .yieldStmt:
498+
case .breakStmt, .continueStmt, .deferStmt, .discardStmt, .doStmt, .expressionStmt, .fallthroughStmt, .forInStmt, .guardStmt, .labeledStmt, .missingStmt, .repeatWhileStmt, .returnStmt, .throwStmt, .whileStmt, .yieldStmt:
499499
break
500500
default:
501501
preconditionFailure("Unable to create StmtSyntax from \(data.raw.kind)")
@@ -534,11 +534,11 @@ public struct StmtSyntax: StmtSyntaxProtocol, SyntaxHashable {
534534
.node(BreakStmtSyntax.self),
535535
.node(ContinueStmtSyntax.self),
536536
.node(DeferStmtSyntax.self),
537+
.node(DiscardStmtSyntax.self),
537538
.node(DoStmtSyntax.self),
538539
.node(ExpressionStmtSyntax.self),
539540
.node(FallthroughStmtSyntax.self),
540541
.node(ForInStmtSyntax.self),
541-
.node(ForgetStmtSyntax.self),
542542
.node(GuardStmtSyntax.self),
543543
.node(LabeledStmtSyntax.self),
544544
.node(MissingStmtSyntax.self),
@@ -770,6 +770,7 @@ extension Syntax {
770770
.node(DifferentiabilityParamsSyntax.self),
771771
.node(DifferentiableAttributeArgumentsSyntax.self),
772772
.node(DiscardAssignmentExprSyntax.self),
773+
.node(DiscardStmtSyntax.self),
773774
.node(DoStmtSyntax.self),
774775
.node(DocumentationAttributeArgumentSyntax.self),
775776
.node(DocumentationAttributeArgumentsSyntax.self),
@@ -794,7 +795,6 @@ extension Syntax {
794795
.node(FloatLiteralExprSyntax.self),
795796
.node(ForInStmtSyntax.self),
796797
.node(ForcedValueExprSyntax.self),
797-
.node(ForgetStmtSyntax.self),
798798
.node(FunctionCallExprSyntax.self),
799799
.node(FunctionDeclSyntax.self),
800800
.node(FunctionEffectSpecifiersSyntax.self),

Sources/SwiftSyntax/generated/SyntaxEnum.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ public enum SyntaxEnum {
102102
case differentiabilityParams(DifferentiabilityParamsSyntax)
103103
case differentiableAttributeArguments(DifferentiableAttributeArgumentsSyntax)
104104
case discardAssignmentExpr(DiscardAssignmentExprSyntax)
105+
case discardStmt(DiscardStmtSyntax)
105106
case doStmt(DoStmtSyntax)
106107
case documentationAttributeArgument(DocumentationAttributeArgumentSyntax)
107108
case documentationAttributeArguments(DocumentationAttributeArgumentsSyntax)
@@ -126,7 +127,6 @@ public enum SyntaxEnum {
126127
case floatLiteralExpr(FloatLiteralExprSyntax)
127128
case forInStmt(ForInStmtSyntax)
128129
case forcedValueExpr(ForcedValueExprSyntax)
129-
case forgetStmt(ForgetStmtSyntax)
130130
case functionCallExpr(FunctionCallExprSyntax)
131131
case functionDecl(FunctionDeclSyntax)
132132
case functionEffectSpecifiers(FunctionEffectSpecifiersSyntax)
@@ -465,6 +465,8 @@ public extension Syntax {
465465
return .differentiableAttributeArguments(DifferentiableAttributeArgumentsSyntax(self)!)
466466
case .discardAssignmentExpr:
467467
return .discardAssignmentExpr(DiscardAssignmentExprSyntax(self)!)
468+
case .discardStmt:
469+
return .discardStmt(DiscardStmtSyntax(self)!)
468470
case .doStmt:
469471
return .doStmt(DoStmtSyntax(self)!)
470472
case .documentationAttributeArgument:
@@ -513,8 +515,6 @@ public extension Syntax {
513515
return .forInStmt(ForInStmtSyntax(self)!)
514516
case .forcedValueExpr:
515517
return .forcedValueExpr(ForcedValueExprSyntax(self)!)
516-
case .forgetStmt:
517-
return .forgetStmt(ForgetStmtSyntax(self)!)
518518
case .functionCallExpr:
519519
return .functionCallExpr(FunctionCallExprSyntax(self)!)
520520
case .functionDecl:

Sources/SwiftSyntax/generated/SyntaxKind.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ public enum SyntaxKind {
102102
case differentiabilityParams
103103
case differentiableAttributeArguments
104104
case discardAssignmentExpr
105+
case discardStmt
105106
case doStmt
106107
case documentationAttributeArgument
107108
case documentationAttributeArguments
@@ -126,7 +127,6 @@ public enum SyntaxKind {
126127
case floatLiteralExpr
127128
case forInStmt
128129
case forcedValueExpr
129-
case forgetStmt
130130
case functionCallExpr
131131
case functionDecl
132132
case functionEffectSpecifiers
@@ -580,6 +580,8 @@ public enum SyntaxKind {
580580
return DifferentiableAttributeArgumentsSyntax.self
581581
case .discardAssignmentExpr:
582582
return DiscardAssignmentExprSyntax.self
583+
case .discardStmt:
584+
return DiscardStmtSyntax.self
583585
case .doStmt:
584586
return DoStmtSyntax.self
585587
case .documentationAttributeArgument:
@@ -628,8 +630,6 @@ public enum SyntaxKind {
628630
return ForInStmtSyntax.self
629631
case .forcedValueExpr:
630632
return ForcedValueExprSyntax.self
631-
case .forgetStmt:
632-
return ForgetStmtSyntax.self
633633
case .functionCallExpr:
634634
return FunctionCallExprSyntax.self
635635
case .functionDecl:

0 commit comments

Comments
 (0)