Files
sourcekit-lsp/Sources/LanguageServerProtocol/Requests/CompletionRequest.swift
Alex Hoppen e2d7eedef8 Unify the naming of request and notification types
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.
2019-12-13 13:56:10 -08:00

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