this repo has no description
www.jonmsterling.com/01HC/
1// SPDX-FileCopyrightText: 2025 The Project Pterodactyl Developers
2//
3// SPDX-License-Identifier: MPL-2.0
4
5import Foundation
6import LanguageServerProtocol
7
8private enum ArraySymmetry {
9 case identity
10 case reverse
11}
12
13fileprivate extension Array {
14 func apply(symmetry: ArraySymmetry) -> any Collection<Element> {
15 switch symmetry {
16 case .identity: self
17 case .reverse: reversed()
18 }
19 }
20}
21
22extension SyntaxCursor {
23 private func firstVisibleNode(under symmetry: ArraySymmetry) -> SyntaxCursor? {
24 switch node {
25 case .token(let token, _):
26 return token.kind.isVisible ? self : nil
27 case .tree:
28 for child in children.apply(symmetry: symmetry) {
29 if let visibleChild = child.firstVisibleNode(under: symmetry) { return visibleChild }
30 }
31
32 return nil
33 }
34 }
35
36 private var visibleUtf16Range: Range<Int>? {
37 guard
38 let firstNode = firstVisibleNode(under: .identity),
39 let lastNode = firstVisibleNode(under: .reverse)
40 else { return nil }
41 return firstNode.utf16Range.lowerBound..<lastNode.utf16Range.upperBound
42 }
43
44 private func collectFoldingRanges(_ sink: inout [FoldingRange]) {
45 if let foldingRangeKind = node.tree?.metadata?.delimitedFoldingRangeKind, let visibleUtf16Range {
46 let startLocation = lineMap.location(at: visibleUtf16Range.lowerBound)
47 let endLocation = lineMap.location(at: visibleUtf16Range.upperBound)
48 let foldingRange = FoldingRange(startLine: startLocation.line, endLine: endLocation.line, kind: foldingRangeKind)
49 sink.append(foldingRange)
50 }
51
52 for child in children {
53 child.collectFoldingRanges(&sink)
54 }
55 }
56
57 public var foldingRanges: [FoldingRange] {
58 var sink: [FoldingRange] = []
59 collectFoldingRanges(&sink)
60 return sink
61 }
62}