at main 1.7 kB view raw
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}