1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2024 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
package import LanguageServerProtocol
import SourceKitD
/// Represents an edit from semantic refactor response. Notionally, a subclass of `TextEdit`
package struct RefactoringEdit: Hashable, Sendable, Codable {
/// The range of text to be replaced.
@CustomCodable<PositionRange>
package var range: Range<Position>
/// The new text.
package var newText: String
/// If the new text of the edit should not be applied to the original source
/// file but to a separate buffer, a fake name for that buffer. For example
/// for expansion of macros, this is @ followed by the mangled name of the
/// macro expansion, followed by .swift.
package var bufferName: String?
package init(range: Range<Position>, newText: String, bufferName: String?) {
self._range = CustomCodable<PositionRange>(wrappedValue: range)
self.newText = newText
self.bufferName = bufferName
}
}
extension RefactoringEdit: LSPAnyCodable {
package init?(fromLSPDictionary dictionary: [String: LSPAny]) {
guard case .dictionary(let rangeDict) = dictionary[CodingKeys.range.stringValue],
case .string(let newText) = dictionary[CodingKeys.newText.stringValue]
else {
return nil
}
guard let range = Range<Position>(fromLSPDictionary: rangeDict) else {
return nil
}
self._range = CustomCodable<PositionRange>(wrappedValue: range)
self.newText = newText
if case .string(let bufferName) = dictionary[CodingKeys.bufferName.stringValue] {
self.bufferName = bufferName
} else {
self.bufferName = nil
}
}
package func encodeToLSPAny() -> LSPAny {
guard let bufferName = bufferName else {
return .dictionary([
CodingKeys.range.stringValue: range.encodeToLSPAny(),
CodingKeys.newText.stringValue: .string(newText),
])
}
return .dictionary([
CodingKeys.range.stringValue: range.encodeToLSPAny(),
CodingKeys.newText.stringValue: .string(newText),
CodingKeys.bufferName.stringValue: .string(bufferName),
])
}
}
|