|
2 | 2 | // |
3 | 3 | // This source file is part of the Swift.org open source project |
4 | 4 | // |
5 | | -// Copyright (c) 2014 - 2024 Apple Inc. and the Swift project authors |
| 5 | +// Copyright (c) 2014 - 2023 Apple Inc. and the Swift project authors |
6 | 6 | // Licensed under Apache License v2.0 with Runtime Library Exception |
7 | 7 | // |
8 | 8 | // See https://swift.org/LICENSE.txt for license information |
9 | 9 | // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors |
10 | 10 | // |
11 | 11 | //===----------------------------------------------------------------------===// |
12 | 12 |
|
| 13 | +struct AbsoluteSyntaxPosition: Sendable { |
| 14 | + /// The UTF-8 offset of the syntax node in the source file |
| 15 | + let offset: UInt32 |
| 16 | + let indexInParent: UInt32 |
| 17 | + |
| 18 | + func advancedBySibling(_ raw: RawSyntax?) -> AbsoluteSyntaxPosition { |
| 19 | + let newOffset = self.offset + UInt32(truncatingIfNeeded: raw?.totalLength.utf8Length ?? 0) |
| 20 | + let newIndexInParent = self.indexInParent + 1 |
| 21 | + return .init(offset: newOffset, indexInParent: newIndexInParent) |
| 22 | + } |
| 23 | + |
| 24 | + func advancedToFirstChild() -> AbsoluteSyntaxPosition { |
| 25 | + return .init(offset: self.offset, indexInParent: 0) |
| 26 | + } |
| 27 | + |
| 28 | + static var forRoot: AbsoluteSyntaxPosition { |
| 29 | + return .init(offset: 0, indexInParent: 0) |
| 30 | + } |
| 31 | +} |
| 32 | + |
13 | 33 | /// `AbsoluteSyntaxInfo` represents the information that relates a `RawSyntax` |
14 | 34 | /// to a source file tree, like its absolute source offset. |
15 | 35 | struct AbsoluteSyntaxInfo: Sendable { |
16 | | - /// The UTF-8 offset at which the syntax node’s leading trivia start in the source file. |
17 | | - let offset: UInt32 |
18 | | - |
19 | | - /// Index in parent's layout. Note that this counts `nil` children. |
20 | | - let layoutIndexInParent: UInt32 |
| 36 | + let position: AbsoluteSyntaxPosition |
| 37 | + let nodeId: SyntaxIdentifier |
21 | 38 |
|
22 | | - /// Index of the node when traversing the syntax tree using a depth-first traversal. |
23 | | - /// This skips `nil` children in the parent's layout. |
24 | | - let indexInTree: UInt32 |
| 39 | + /// The UTF-8 offset of the syntax node in the source file |
| 40 | + var offset: UInt32 { return position.offset } |
| 41 | + var indexInParent: UInt32 { return position.indexInParent } |
25 | 42 |
|
26 | 43 | func advancedBySibling(_ raw: RawSyntax?) -> AbsoluteSyntaxInfo { |
27 | | - if let raw { |
28 | | - // '&+' operations are safe because we have the preconditions in 'forRoot(_:)'. |
29 | | - return AbsoluteSyntaxInfo( |
30 | | - offset: offset &+ UInt32(truncatingIfNeeded: raw.totalLength.utf8Length), |
31 | | - layoutIndexInParent: layoutIndexInParent &+ 1, |
32 | | - indexInTree: indexInTree &+ UInt32(truncatingIfNeeded: raw.totalNodes) |
33 | | - ) |
34 | | - } else { |
35 | | - return AbsoluteSyntaxInfo( |
36 | | - offset: offset, |
37 | | - layoutIndexInParent: layoutIndexInParent &+ 1, |
38 | | - indexInTree: indexInTree |
39 | | - ) |
40 | | - } |
| 44 | + let newPosition = position.advancedBySibling(raw) |
| 45 | + let newNodeId = nodeId.advancedBySibling(raw) |
| 46 | + return .init(position: newPosition, nodeId: newNodeId) |
41 | 47 | } |
42 | 48 |
|
43 | 49 | func advancedToFirstChild() -> AbsoluteSyntaxInfo { |
44 | | - return AbsoluteSyntaxInfo( |
45 | | - offset: offset, |
46 | | - layoutIndexInParent: 0, |
47 | | - indexInTree: indexInTree &+ 1 |
48 | | - ) |
| 50 | + let newPosition = position.advancedToFirstChild() |
| 51 | + let newNodeId = nodeId.advancedToFirstChild() |
| 52 | + return .init(position: newPosition, nodeId: newNodeId) |
49 | 53 | } |
50 | 54 |
|
51 | 55 | static func forRoot(_ raw: RawSyntax) -> AbsoluteSyntaxInfo { |
52 | | - // These checks ensure the safety of the unchecked arithmetic operations in 'advancedBySibling(_:)'. |
53 | | - precondition(raw.totalLength.utf8Length <= UInt32.max, "too long") |
54 | | - precondition(raw.totalNodes <= UInt32.max, "too many nodes") |
55 | | - return AbsoluteSyntaxInfo( |
56 | | - offset: 0, |
57 | | - layoutIndexInParent: 0, |
58 | | - indexInTree: 0 |
59 | | - ) |
| 56 | + return .init(position: .forRoot, nodeId: .forRoot(raw)) |
60 | 57 | } |
61 | 58 | } |
0 commit comments