mirror of
https://github.com/apple/sourcekit-lsp.git
synced 2026-03-02 18:23:24 +01:00
Request types should always have the suffix Request and notifications should end with Notification. Also moved all request and notification types into separate folders to reduce the number of files in the LanguageServerProtocol folder.
111 lines
4.3 KiB
Swift
111 lines
4.3 KiB
Swift
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2018 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
/// Request for code-completion items at the given document location.
|
|
///
|
|
/// The server may - or may not - filter and sort the results before returning them. If the server
|
|
/// performs server-side filtering, it should set the `isIncomplete` flag on the result. However,
|
|
/// since there are no particular rules specified for server-side filtering, the client likely will
|
|
/// want to perform its own filtering as well.
|
|
///
|
|
/// Servers that provide document highlights should set the `completionProvider` server capability.
|
|
///
|
|
/// - Parameters:
|
|
/// - textDocument: The document to perform completion in.
|
|
/// - position: The location to perform completion at.
|
|
///
|
|
/// - Returns: A list of completion items to complete the code at the given position.
|
|
public struct CompletionRequest: TextDocumentRequest, Hashable {
|
|
public static let method: String = "textDocument/completion"
|
|
public typealias Response = CompletionList
|
|
|
|
public var textDocument: TextDocumentIdentifier
|
|
|
|
public var position: Position
|
|
|
|
public var context: CompletionContext?
|
|
|
|
public init(textDocument: TextDocumentIdentifier, position: Position) {
|
|
self.textDocument = textDocument
|
|
self.position = position
|
|
}
|
|
}
|
|
|
|
/// How a completion was triggered
|
|
public struct CompletionTriggerKind: RawRepresentable, Codable, Hashable {
|
|
/// Completion was triggered by typing an identifier (24x7 code complete), manual invocation (e.g Ctrl+Space) or via API.
|
|
public static let invoked = CompletionTriggerKind(rawValue: 1)
|
|
|
|
/// Completion was triggered by a trigger character specified by the `triggerCharacters` properties of the `CompletionRegistrationOptions`.
|
|
public static let triggerCharacter = CompletionTriggerKind(rawValue: 2)
|
|
|
|
/// Completion was re-triggered as the current completion list is incomplete.
|
|
public static let triggerFromIncompleteCompletions = CompletionTriggerKind(rawValue: 3)
|
|
|
|
public let rawValue: Int
|
|
public init(rawValue: Int) {
|
|
self.rawValue = rawValue
|
|
}
|
|
}
|
|
|
|
/// Contains additional information about the context in which a completion request is triggered.
|
|
public struct CompletionContext: Codable, Hashable {
|
|
/// How the completion was triggered.
|
|
public var triggerKind: CompletionTriggerKind
|
|
|
|
/// The trigger character (a single character) that has trigger code complete. Is undefined if `triggerKind !== CompletionTriggerKind.TriggerCharacter`
|
|
public var triggerCharacter: String?
|
|
|
|
public init(triggerKind: CompletionTriggerKind, triggerCharacter: String? = nil) {
|
|
self.triggerKind = triggerKind
|
|
self.triggerCharacter = triggerCharacter
|
|
}
|
|
}
|
|
|
|
/// List of completion items. If this list has been filtered already, the `isIncomplete` flag
|
|
/// indicates that the client should re-query code-completions if the filter text changes.
|
|
public struct CompletionList: ResponseType, Hashable {
|
|
|
|
/// Whether the list of completions is "complete" or not.
|
|
///
|
|
/// When this value is `true`, the client should re-query the server when doing further filtering.
|
|
public var isIncomplete: Bool
|
|
|
|
/// The resulting completions.
|
|
public var items: [CompletionItem]
|
|
|
|
public init(isIncomplete: Bool, items: [CompletionItem]) {
|
|
self.isIncomplete = isIncomplete
|
|
self.items = items
|
|
}
|
|
|
|
public init(from decoder: Decoder) throws {
|
|
// Try decoding as CompletionList
|
|
do {
|
|
let container = try decoder.container(keyedBy: CodingKeys.self)
|
|
self.isIncomplete = try container.decode(Bool.self, forKey: .isIncomplete)
|
|
self.items = try container.decode([CompletionItem].self, forKey: .items)
|
|
return
|
|
} catch {}
|
|
|
|
// Try decoding as [CompletionItem]
|
|
do {
|
|
self.items = try [CompletionItem](from: decoder)
|
|
self.isIncomplete = false
|
|
return
|
|
} catch {}
|
|
|
|
let context = DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Expected CompletionList or [CompletionItem]")
|
|
throw DecodingError.dataCorrupted(context)
|
|
}
|
|
}
|