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
}
}
|