File: SignatureHelpRequest.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (211 lines) | stat: -rw-r--r-- 7,881 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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2022 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
//
//===----------------------------------------------------------------------===//

public struct SignatureHelpRequest: TextDocumentRequest {
  public static let method: String = "textDocument/signatureHelp"
  public typealias Response = SignatureHelp?

  /// The document in which the given symbol is located.
  public var textDocument: TextDocumentIdentifier

  /// The document location of a given symbol.
  public var position: Position

  /// The signature help context. This is only available if the client
  /// specifies to send this using the client capability
  /// `textDocument.signatureHelp.contextSupport === true`
  public var context: SignatureHelpContext?

  public init(textDocument: TextDocumentIdentifier, position: Position, context: SignatureHelpContext? = nil) {
    self.textDocument = textDocument
    self.position = position
    self.context = context
  }
}

/// How a signature help was triggered.
public struct SignatureHelpTriggerKind: RawRepresentable, Codable, Hashable, Sendable {
  public var rawValue: Int

  public init(rawValue: Int) {
    self.rawValue = rawValue
  }

  /// Signature help was invoked manually by the user or by a command.
  public static let invoked = SignatureHelpTriggerKind(rawValue: 1)

  /// Signature help was triggered by a trigger character.
  public static let triggerCharacter = SignatureHelpTriggerKind(rawValue: 2)

  /// Signature help was triggered by the cursor moving or by the document
  /// content changing.
  public static let contentChange = SignatureHelpTriggerKind(rawValue: 3)
}

/// Additional information about the context in which a signature help request
/// was triggered.
public struct SignatureHelpContext: Codable, Hashable, Sendable {
  /// Action that caused signature help to be triggered.
  public var triggerKind: SignatureHelpTriggerKind

  /// Character that caused signature help to be triggered.
  ///
  /// This is undefined when triggerKind !==
  /// SignatureHelpTriggerKind.TriggerCharacter
  public var triggerCharacter: String?

  /// `true` if signature help was already showing when it was triggered.
  ///
  /// Retriggers occur when the signature help is already active and can be
  /// caused by actions such as typing a trigger character, a cursor move, or
  /// document content changes.
  public var isRetrigger: Bool

  /// The currently active `SignatureHelp`.
  ///
  /// The `activeSignatureHelp` has its `SignatureHelp.activeSignature` field
  /// updated based on the user navigating through available signatures.
  public var activeSignatureHelp: SignatureHelp?

  public init(
    triggerKind: SignatureHelpTriggerKind,
    triggerCharacter: String? = nil,
    isRetrigger: Bool,
    activeSignatureHelp: SignatureHelp? = nil
  ) {
    self.triggerKind = triggerKind
    self.triggerCharacter = triggerCharacter
    self.isRetrigger = isRetrigger
    self.activeSignatureHelp = activeSignatureHelp
  }
}

/// Signature help represents the signature of something
/// callable. There can be multiple signature but only one
/// active and only one active parameter.
public struct SignatureHelp: ResponseType, Hashable {
  /// One or more signatures. If no signatures are available the signature help
  /// request should return `null`.
  public var signatures: [SignatureInformation]

  /// The active signature. If omitted or the value lies outside the
  /// range of `signatures` the value defaults to zero or is ignore if
  /// the `SignatureHelp` as no signatures.
  ///
  /// Whenever possible implementors should make an active decision about
  /// the active signature and shouldn't rely on a default value.
  ///
  /// In future version of the protocol this property might become
  /// mandatory to better express this.
  public var activeSignature: Int?

  /// The active parameter of the active signature. If omitted or the value
  /// lies outside the range of `signatures[activeSignature].parameters`
  /// defaults to 0 if the active signature has parameters. If
  /// the active signature has no parameters it is ignored.
  /// In future version of the protocol this property might become
  /// mandatory to better express the active parameter if the
  /// active signature does have any.
  public var activeParameter: Int?

  public init(signatures: [SignatureInformation], activeSignature: Int? = nil, activeParameter: Int? = nil) {
    self.signatures = signatures
    self.activeSignature = activeSignature
    self.activeParameter = activeParameter
  }
}

/// Represents the signature of something callable. A signature
/// can have a label, like a function-name, a doc-comment, and
/// a set of parameters.
public struct SignatureInformation: Codable, Hashable, Sendable {
  /// The label of this signature. Will be shown in
  /// the UI.
  public var label: String

  /// The human-readable doc-comment of this signature. Will be shown
  /// in the UI but can be omitted.
  public var documentation: StringOrMarkupContent?

  /// The parameters of this signature.
  public var parameters: [ParameterInformation]?

  /// The index of the active parameter.
  ///
  /// If provided, this is used in place of `SignatureHelp.activeParameter`.
  public var activeParameter: Int?

  public init(
    label: String,
    documentation: StringOrMarkupContent? = nil,
    parameters: [ParameterInformation]? = nil,
    activeParameter: Int? = nil
  ) {
    self.label = label
    self.documentation = documentation
    self.parameters = parameters
    self.activeParameter = activeParameter
  }
}

/// Represents a parameter of a callable-signature. A parameter can
/// have a label and a doc-comment.
public struct ParameterInformation: Codable, Hashable, Sendable {
  public enum Label: Codable, Hashable, Sendable {
    case string(String)
    case offsets(start: Int, end: Int)

    public init(from decoder: Decoder) throws {
      if let string = try? String(from: decoder) {
        self = .string(string)
      } else if let offsets = try? Array<Int>(from: decoder), offsets.count == 2 {
        self = .offsets(start: offsets[0], end: offsets[1])
      } else {
        let context = DecodingError.Context(
          codingPath: decoder.codingPath,
          debugDescription: "Expected String or an array containing two integers"
        )
        throw DecodingError.dataCorrupted(context)
      }
    }

    public func encode(to encoder: Encoder) throws {
      switch self {
      case .string(let string):
        try string.encode(to: encoder)
      case .offsets(start: let start, end: let end):
        try [start, end].encode(to: encoder)
      }
    }
  }

  /// The label of this parameter information.
  ///
  /// Either a string or an inclusive start and exclusive end offsets within
  /// its containing signature label. (see SignatureInformation.label). The
  /// offsets are based on a UTF-16 string representation as `Position` and
  /// `Range` does.
  ///
  /// *Note*: a label of type string should be a substring of its containing
  /// signature label. Its intended use case is to highlight the parameter
  /// label part in the `SignatureInformation.label`.
  public var label: Label

  /// The human-readable doc-comment of this parameter. Will be shown
  /// in the UI but can be omitted.
  public var documentation: StringOrMarkupContent?

  public init(label: Label, documentation: StringOrMarkupContent? = nil) {
    self.label = label
    self.documentation = documentation
  }
}