// SPDX-FileCopyrightText: 2025 The Project Pterodactyl Developers // SPDX-FileCopyrightText: 2026 The Project Pterodactyl Developers // // SPDX-License-Identifier: MPL-2.0 import Algorithms import LanguageServerProtocol public struct LineMap: Codable, Sendable { private let utf16LineOffsets: [Int] public init(source: String) { var offsets: [Int] = [0] for idx in source.indices { if source[idx].isNewline { let next = source.index(after: idx) let utf16Offset = next.utf16Offset(in: source) offsets.append(utf16Offset) } } self.utf16LineOffsets = offsets } public func lspPosition(at utf16Offset: Int) -> LanguageServerProtocol.Position { let partitioningIndex = utf16LineOffsets.partitioningIndex { $0 > utf16Offset } let lineIndex = partitioningIndex == 0 ? 0 : partitioningIndex - 1 let lineStart = utf16LineOffsets[lineIndex] let lineNumber = lineIndex let columnNumber = utf16Offset - lineStart return Position(line: lineNumber, character: columnNumber) } public func lspRange(of range: Range) -> LanguageServerProtocol.LSPRange { let start = lspPosition(at: range.lowerBound) let end = lspPosition(at: range.upperBound) return LSPRange(start: start, end: end) } public func range(from lspRange: LSPRange) -> Range { offset(at: lspRange.start).. Int { let lineOffset = utf16LineOffsets[position.line] return lineOffset + position.character } }