Skip to content

Commit 58b985a

Browse files
committed
Parse Move Expressions
1 parent bf2ec56 commit 58b985a

File tree

3 files changed

+28
-8
lines changed

3 files changed

+28
-8
lines changed

Sources/SwiftParser/Expressions.swift

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -317,10 +317,11 @@ extension Parser {
317317
}
318318
}
319319

320-
switch self.at(anyIn: AwaitTry.self) {
320+
switch self.at(anyIn: AwaitTryMove.self) {
321321
case (.awaitContextualKeyword, let handle)?:
322322
let awaitTok = self.eat(handle)
323-
let sub = self.parseSequenceExpressionElement(flavor, inVarOrLet: inVarOrLet)
323+
let sub = self.parseSequenceExpressionElement(
324+
flavor, forDirective: forDirective, inVarOrLet: inVarOrLet)
324325
return RawExprSyntax(RawAwaitExprSyntax(
325326
awaitKeyword: awaitTok,
326327
expression: sub,
@@ -330,13 +331,22 @@ extension Parser {
330331
let tryKeyword = self.eat(handle)
331332
let mark = self.consume(ifAny: [.exclamationMark, .postfixQuestionMark])
332333

333-
let expression = self.parseSequenceExpressionElement(flavor, inVarOrLet: inVarOrLet)
334+
let expression = self.parseSequenceExpressionElement(
335+
flavor, forDirective: forDirective, inVarOrLet: inVarOrLet)
334336
return RawExprSyntax(RawTryExprSyntax(
335337
tryKeyword: tryKeyword,
336338
questionOrExclamationMark: mark,
337339
expression: expression,
338340
arena: self.arena
339341
))
342+
case (._moveContextualKeyword, let handle)?:
343+
let moveTok = self.eat(handle)
344+
let sub = self.parseSequenceExpressionElement(
345+
flavor, forDirective: forDirective, inVarOrLet: inVarOrLet)
346+
return RawExprSyntax(RawMoveExprSyntax(
347+
moveKeyword: moveTok,
348+
expression: sub,
349+
arena: self.arena))
340350
case nil:
341351
return self.parseUnaryExpression(flavor, forDirective: forDirective, inVarOrLet: inVarOrLet)
342352
}

Sources/SwiftParser/RawTokenKindSubset.swift

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -433,20 +433,23 @@ enum SwitchCaseStart: RawTokenKindSubset {
433433

434434
// MARK: Expression start
435435

436-
enum AwaitTry: RawTokenKindSubset {
436+
enum AwaitTryMove: RawTokenKindSubset {
437437
case awaitContextualKeyword
438+
case _moveContextualKeyword
438439
case tryKeyword
439440

440441
var rawTokenKind: RawTokenKind {
441442
switch self {
442443
case .awaitContextualKeyword: return .identifier
444+
case ._moveContextualKeyword: return .identifier
443445
case .tryKeyword: return .tryKeyword
444446
}
445447
}
446448

447449
var contextualKeyword: SyntaxText? {
448450
switch self {
449451
case .awaitContextualKeyword: return "await"
452+
case ._moveContextualKeyword: return "_move"
450453
default: return nil
451454
}
452455
}
@@ -573,21 +576,21 @@ enum PrimaryExpressionStart: RawTokenKindSubset {
573576
/// - `MatchingPatternStart`
574577
/// - `PrimaryExpressionStart`
575578
enum ExpressionStart: RawTokenKindSubset {
576-
case awaitTry(AwaitTry)
579+
case awaitTryMove(AwaitTryMove)
577580
case expressionPrefixOperator(ExpressionPrefixOperator)
578581
case matchingPatternStart(MatchingPatternStart)
579582
case primaryExpressionStart(PrimaryExpressionStart)
580583

581584
static var allCases: [ExpressionStart] {
582-
return AwaitTry.allCases.map(Self.awaitTry)
585+
return AwaitTryMove.allCases.map(Self.awaitTryMove)
583586
+ ExpressionPrefixOperator.allCases.map(Self.expressionPrefixOperator)
584587
+ MatchingPatternStart.allCases.map(Self.matchingPatternStart)
585588
+ PrimaryExpressionStart.allCases.map(Self.primaryExpressionStart)
586589
}
587590

588591
var rawTokenKind: RawTokenKind {
589592
switch self {
590-
case .awaitTry(let underlyingKind): return underlyingKind.rawTokenKind
593+
case .awaitTryMove(let underlyingKind): return underlyingKind.rawTokenKind
591594
case .expressionPrefixOperator(let underlyingKind): return underlyingKind.rawTokenKind
592595
case .matchingPatternStart(let underlyingKind): return underlyingKind.rawTokenKind
593596
case .primaryExpressionStart(let underlyingKind): return underlyingKind.rawTokenKind
@@ -596,7 +599,7 @@ enum ExpressionStart: RawTokenKindSubset {
596599

597600
var contextualKeyword: SyntaxText? {
598601
switch self {
599-
case .awaitTry(let underlyingKind): return underlyingKind.contextualKeyword
602+
case .awaitTryMove(let underlyingKind): return underlyingKind.contextualKeyword
600603
case .expressionPrefixOperator(let underlyingKind): return underlyingKind.contextualKeyword
601604
case .matchingPatternStart(let underlyingKind): return underlyingKind.contextualKeyword
602605
case .primaryExpressionStart(let underlyingKind): return underlyingKind.contextualKeyword

Tests/SwiftParserTest/Expressions.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,4 +495,11 @@ final class ExpressionTests: XCTestCase {
495495
func testTypeExpression() {
496496
AssertParse("_ = (any Sequence<Int>).self")
497497
}
498+
499+
func testMoveExpression() {
500+
AssertParse("_move msg")
501+
AssertParse("use(_move msg)")
502+
AssertParse("_move msg")
503+
AssertParse("let b = (_move self).buffer")
504+
}
498505
}

0 commit comments

Comments
 (0)