Skip to content

Commit 537023c

Browse files
committed
[borrow-expr] Add support for borrow expr.
1 parent a2d31e8 commit 537023c

File tree

5 files changed

+76
-0
lines changed

5 files changed

+76
-0
lines changed

Sources/SwiftParser/Expressions.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,20 @@ extension Parser {
465465
arena: self.arena
466466
)
467467
)
468+
case (._borrowContextualKeyword, let handle)?:
469+
let borrowTok = self.eat(handle)
470+
let sub = self.parseSequenceExpressionElement(
471+
flavor,
472+
forDirective: forDirective,
473+
pattern: pattern
474+
)
475+
return RawExprSyntax(
476+
RawBorrowExprSyntax(
477+
borrowKeyword: borrowTok,
478+
expression: sub,
479+
arena: self.arena
480+
)
481+
)
468482
case nil:
469483
return self.parseUnaryExpression(flavor, forDirective: forDirective, pattern: pattern)
470484
}

Sources/SwiftParser/RawTokenKindSubset.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -583,13 +583,15 @@ public enum TypeSpecifier: RawTokenKindSubset {
583583
enum AwaitTryMove: RawTokenKindSubset {
584584
case awaitContextualKeyword
585585
case _moveContextualKeyword
586+
case _borrowContextualKeyword
586587
case tryKeyword
587588

588589
init?(lexeme: Lexer.Lexeme) {
589590
switch (lexeme.tokenKind, lexeme.tokenText) {
590591
case (.tryKeyword, _): self = .tryKeyword
591592
case (.identifier, "await"): self = .awaitContextualKeyword
592593
case (.identifier, "_move"): self = ._moveContextualKeyword
594+
case (.identifier, "_borrow"): self = ._borrowContextualKeyword
593595
default: return nil
594596
}
595597
}
@@ -598,6 +600,7 @@ enum AwaitTryMove: RawTokenKindSubset {
598600
switch self {
599601
case .awaitContextualKeyword: return .identifier
600602
case ._moveContextualKeyword: return .identifier
603+
case ._borrowContextualKeyword: return .identifier
601604
case .tryKeyword: return .tryKeyword
602605
}
603606
}
@@ -606,6 +609,7 @@ enum AwaitTryMove: RawTokenKindSubset {
606609
switch self {
607610
case .awaitContextualKeyword: return "await"
608611
case ._moveContextualKeyword: return "_move"
612+
case ._borrowContextualKeyword: return "_borrow"
609613
default: return nil
610614
}
611615
}

Tests/SwiftParserTest/ExpressionTests.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -727,6 +727,13 @@ final class ExpressionTests: XCTestCase {
727727
AssertParse("let b = (_move self).buffer")
728728
}
729729

730+
func testMoveExpression() {
731+
AssertParse("_borrow msg")
732+
AssertParse("use(_borrow msg)")
733+
AssertParse("_borrow msg")
734+
AssertParse("let b = (_borrow self).buffer")
735+
}
736+
730737
func testCodeCompletionExpressions() {
731738
AssertParse("if !<#b1#> && !<#b2#> {}")
732739
AssertParse("if <#test#> {}")
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
d//===----------------------------------------------------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2022 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
// This test file has been translated from swift/test/Parse/borrow_expr.swift
14+
15+
import XCTest
16+
17+
final class BorrowExprTests: XCTestCase {
18+
func testBorrowExpr1() {
19+
AssertParse(
20+
"""
21+
func useString(_ str: String) {}
22+
var global: String = "123"
23+
func testGlobal() {
24+
useString(_borrow global)
25+
}
26+
"""
27+
)
28+
}
29+
30+
func testBorrowExpr2() {
31+
AssertParse(
32+
"""
33+
func useString(_ str: String) {}
34+
func testVar() {
35+
var t = String()
36+
t = String()
37+
useString(_borrow t)
38+
}
39+
"""
40+
)
41+
}
42+
43+
}

gyb_syntax_support/ExprNodes.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,14 @@
6262
Child('Expression', kind='Expr'),
6363
]),
6464

65+
# The borow expr
66+
Node('BorrowExpr', name_for_diagnostics="'_borrow' expression", kind='Expr',
67+
children=[
68+
Child('BorrowKeyword', kind='ContextualKeywordToken',
69+
text_choices=['_borrow']),
70+
Child('Expression', kind='Expr'),
71+
]),
72+
6573
# declname-arguments -> '(' declname-argument-list ')'
6674
# declname-argument-list -> declname-argument*
6775
# declname-argument -> identifier ':'

0 commit comments

Comments
 (0)