@@ -1759,6 +1759,30 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
1759
1759
}
1760
1760
1761
1761
override func visit( _ node: KeyPathExprSyntax ) -> SyntaxVisitorContinueKind {
1762
+ before ( node. backslash, tokens: . open)
1763
+ after ( node. lastToken ( viewMode: . sourceAccurate) , tokens: . close)
1764
+ return . visitChildren
1765
+ }
1766
+
1767
+ override func visit( _ node: KeyPathComponentSyntax ) -> SyntaxVisitorContinueKind {
1768
+ // If this is the first component (immediately after the backslash), allow a break after the
1769
+ // slash only if a typename follows it. Do not break in the middle of `\.`.
1770
+ var breakBeforePeriod = true
1771
+ if let keyPathComponents = node. parent? . as ( KeyPathComponentListSyntax . self) ,
1772
+ let keyPathExpr = keyPathComponents. parent? . as ( KeyPathExprSyntax . self) ,
1773
+ node == keyPathExpr. components. first, keyPathExpr. root == nil
1774
+ {
1775
+ breakBeforePeriod = false
1776
+ }
1777
+ if breakBeforePeriod {
1778
+ before ( node. period, tokens: . break( . continue, size: 0 ) )
1779
+ }
1780
+ return . visitChildren
1781
+ }
1782
+
1783
+ override func visit( _ node: KeyPathSubscriptComponentSyntax ) -> SyntaxVisitorContinueKind {
1784
+ after ( node. leftBracket, tokens: . break( . open, size: 0 ) , . open)
1785
+ before ( node. rightBracket, tokens: . break( . close, size: 0 ) , . close)
1762
1786
return . visitChildren
1763
1787
}
1764
1788
@@ -1846,24 +1870,6 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
1846
1870
}
1847
1871
1848
1872
override func visit( _ node: InfixOperatorExprSyntax ) -> SyntaxVisitorContinueKind {
1849
- // FIXME: This is a workaround/hack for https://github.com/apple/swift-syntax/issues/928. For
1850
- // keypaths like `\.?.foo`, they get represented (after folding) as an infix operator expression
1851
- // with an empty keypath, followed by the "binary operator" `.?.`, followed by other
1852
- // expressions. We can detect this and treat the whole thing as a verbatim node, which mimics
1853
- // what we do today for keypaths (i.e., nothing).
1854
- if let keyPathExpr = node. leftOperand. as ( KeyPathExprSyntax . self) ,
1855
- keyPathExpr. components. isEmpty
1856
- {
1857
- // If there were spaces in the trailing trivia of the previous token, they would have been
1858
- // ignored (since this expression would be expected to insert its own preceding breaks).
1859
- // Preserve that whitespace verbatim for now.
1860
- if let previousToken = node. firstToken ( viewMode: . sourceAccurate) ? . previousToken ( viewMode: . sourceAccurate) {
1861
- appendTrailingTrivia ( previousToken, forced: true )
1862
- }
1863
- verbatimToken ( Syntax ( node) , indentingBehavior: . none)
1864
- return . skipChildren
1865
- }
1866
-
1867
1873
let binOp = node. operatorOperand
1868
1874
if binOp. is ( ArrowExprSyntax . self) {
1869
1875
// `ArrowExprSyntax` nodes occur when a function type is written in an expression context;
0 commit comments