File: RefactoringEdit.swift

package info (click to toggle)
swiftlang 6.2.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,856,264 kB
  • sloc: cpp: 9,995,718; ansic: 2,234,019; asm: 1,092,167; python: 313,940; objc: 82,726; f90: 80,126; lisp: 38,373; pascal: 25,580; sh: 20,378; ml: 5,058; perl: 4,751; makefile: 4,725; awk: 3,535; javascript: 3,018; xml: 918; fortran: 664; cs: 573; ruby: 396
file content (74 lines) | stat: -rw-r--r-- 2,562 bytes parent folder | download
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),
    ])
  }
}