Files
sourcekit-lsp/Sources/LanguageServerProtocol/ServerCapabilities.swift
2019-09-24 17:21:32 -03:00

265 lines
10 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
//
//===----------------------------------------------------------------------===//
/// Capabilities provided by the language server.
public struct ServerCapabilities: Codable, Hashable {
public var textDocumentSync: TextDocumentSyncOptions?
/// Whether the server provides code-completion.
public var completionProvider: CompletionOptions?
/// Whether the server provides "textDocument/hover".
public var hoverProvider: Bool?
/// Whether the server provides "textDocument/definition".
public var definitionProvider: Bool?
/// Whether the server provides "textDocument/implementation".
public var implementationProvider: Bool?
/// Whether the server provides "textDocument/references".
public var referencesProvider: Bool?
/// Whether the server provides "textDocument/documentHighlight".
public var documentHighlightProvider: Bool?
/// Whether the server provides "textDocument/formatting".
public var documentFormattingProvider: Bool?
/// Whether the server provides "textDocument/rangeFormatting".
public var documentRangeFormattingProvider: Bool?
/// Whether the server provides "textDocument/onTypeFormatting".
public var documentOnTypeFormattingProvider: DocumentOnTypeFormattingOptions?
/// Whether the server provides "textDocument/foldingRange".
public var foldingRangeProvider: Bool?
/// Whether the server provides "textDocument/documentSymbol"
public var documentSymbolProvider: Bool?
/// Whether the server provides "textDocument/documentColor" and "textDocument/colorPresentation".
public var colorProvider: Bool?
/// Whether the server provides "textDocument/codeAction".
public var codeActionProvider: CodeActionServerCapabilities?
/// The server provides workspace symbol support.
public var workspaceSymbolProvider: Bool?
/// Whether the server provides "workspace/executeCommand".
public var executeCommandProvider: ExecuteCommandOptions?
// TODO: fill-in the rest.
public init(
textDocumentSync: TextDocumentSyncOptions? = nil,
completionProvider: CompletionOptions? = nil,
hoverProvider: Bool? = nil,
definitionProvider: Bool? = nil,
implementationProvider: Bool? = nil,
referencesProvider: Bool? = nil,
documentHighlightProvider: Bool? = nil,
documentFormattingProvider: Bool? = nil,
documentRangeFormattingProvider: Bool? = nil,
documentOnTypeFormattingProvider: DocumentOnTypeFormattingOptions? = nil,
foldingRangeProvider: Bool? = nil,
documentSymbolProvider: Bool? = nil,
colorProvider: Bool? = nil,
codeActionProvider: CodeActionServerCapabilities? = nil,
workspaceSymbolProvider: Bool? = nil,
executeCommandProvider: ExecuteCommandOptions? = nil
)
{
self.textDocumentSync = textDocumentSync
self.completionProvider = completionProvider
self.hoverProvider = hoverProvider
self.definitionProvider = definitionProvider
self.implementationProvider = implementationProvider
self.referencesProvider = referencesProvider
self.documentHighlightProvider = documentHighlightProvider
self.documentFormattingProvider = documentFormattingProvider
self.documentRangeFormattingProvider = documentRangeFormattingProvider
self.documentOnTypeFormattingProvider = documentOnTypeFormattingProvider
self.foldingRangeProvider = foldingRangeProvider
self.documentSymbolProvider = documentSymbolProvider
self.colorProvider = colorProvider
self.codeActionProvider = codeActionProvider
self.workspaceSymbolProvider = workspaceSymbolProvider
self.executeCommandProvider = executeCommandProvider
}
public init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.completionProvider = try container.decodeIfPresent(CompletionOptions.self, forKey: .completionProvider)
self.hoverProvider = try container.decodeIfPresent(Bool.self, forKey: .hoverProvider)
self.definitionProvider = try container.decodeIfPresent(Bool.self, forKey: .definitionProvider)
self.implementationProvider = try container.decodeIfPresent(Bool.self, forKey: .implementationProvider)
self.foldingRangeProvider = try container.decodeIfPresent(Bool.self, forKey: .foldingRangeProvider)
self.documentSymbolProvider = try container.decodeIfPresent(Bool.self, forKey: .documentSymbolProvider)
self.colorProvider = try container.decodeIfPresent(Bool.self, forKey: .colorProvider)
self.codeActionProvider = try container.decodeIfPresent(CodeActionServerCapabilities.self, forKey: .codeActionProvider)
self.workspaceSymbolProvider = try container.decodeIfPresent(Bool.self, forKey: .workspaceSymbolProvider)
self.executeCommandProvider = try container.decodeIfPresent(ExecuteCommandOptions.self, forKey: .executeCommandProvider)
if let textDocumentSync = try? container.decode(TextDocumentSyncOptions.self, forKey: .textDocumentSync) {
self.textDocumentSync = textDocumentSync
} else if let kind = try? container.decode(TextDocumentSyncKind.self, forKey: .textDocumentSync) {
// Legacy response
self.textDocumentSync = TextDocumentSyncOptions(openClose: nil, change: kind, willSave: nil, willSaveWaitUntil: nil, save: nil)
} else {
self.textDocumentSync = nil
}
}
}
public struct TextDocumentSyncOptions: Codable, Hashable {
/// Whether open/close notifications should be sent to the server.
public var openClose: Bool?
/// Whether and how the client should synchronize document changes with the server.
public var change: TextDocumentSyncKind?
/// Whether will-save notifications should be sent to the server.
public var willSave: Bool?
/// Whether will-save-wait-until notifications should be sent to the server.
public var willSaveWaitUntil: Bool?
public struct SaveOptions: Codable, Hashable {
/// Whether the client should include the file content in save notifications.
public var includeText: Bool
public init(includeText: Bool = false) {
self.includeText = includeText
}
}
/// Whether save notifications should be sent to the server.
public var save: SaveOptions?
public init(openClose: Bool? = true, change: TextDocumentSyncKind? = .incremental, willSave: Bool? = true, willSaveWaitUntil: Bool? = false, save: SaveOptions? = SaveOptions()) {
self.openClose = openClose
self.change = change
self.willSave = willSave
self.willSaveWaitUntil = willSaveWaitUntil
self.save = save
}
}
public enum TextDocumentSyncKind: Int, Codable, Hashable {
case none = 0
/// Documents are synced by sending the full content.
case full = 1
/// Documents are synced by sending incremental updates.
case incremental = 2
}
public struct CompletionOptions: Codable, Hashable {
/// Whether to use `textDocument/resolveCompletion`
public var resolveProvider: Bool?
/// The characters that should trigger automatic completion.
public var triggerCharacters: [String]
public init(resolveProvider: Bool? = false, triggerCharacters: [String]) {
self.resolveProvider = resolveProvider
self.triggerCharacters = triggerCharacters
}
}
public struct DocumentOnTypeFormattingOptions: Codable, Hashable {
/// A character that sould trigger formatting (e.g. '}').
public var firstTriggerCharacter: String
/// Additional triggers.
///
/// - note: The lack of plural matches the protocol.
public var moreTriggerCharacter: [String]?
public init(triggerCharacters: [String]) {
self.firstTriggerCharacter = triggerCharacters.first!
self.moreTriggerCharacter = Array(triggerCharacters.dropFirst())
}
}
/// Wrapper type for a server's CodeActions' capabilities.
/// If the client supports CodeAction literals, the server can return specific information about
/// how CodeActions will be sent. Otherwise, the server's capabilities are determined by a boolean.
public enum CodeActionServerCapabilities: Codable, Hashable {
case supportsCodeActionRequests(Bool)
case supportsCodeActionRequestsWithLiterals(CodeActionOptions)
public init(clientCapabilities: TextDocumentClientCapabilities.CodeAction?,
codeActionOptions: CodeActionOptions,
supportsCodeActions: Bool) {
if clientCapabilities?.codeActionLiteralSupport != nil {
self = .supportsCodeActionRequestsWithLiterals(codeActionOptions)
} else {
self = .supportsCodeActionRequests(supportsCodeActions)
}
}
public init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
if let supportsCodeActions = try? container.decode(Bool.self) {
self = .supportsCodeActionRequests(supportsCodeActions)
} else if let codeActionOptions = try? container.decode(CodeActionOptions.self) {
self = .supportsCodeActionRequestsWithLiterals(codeActionOptions)
} else {
let error = "CodeActionServerCapabilities cannot be decoded: Unrecognized type."
throw DecodingError.dataCorruptedError(in: container, debugDescription: error)
}
}
public func encode(to encoder: Encoder) throws {
var container = encoder.singleValueContainer()
switch self {
case .supportsCodeActionRequestsWithLiterals(let codeActionOptions):
try container.encode(codeActionOptions)
case .supportsCodeActionRequests(let supportCodeActions):
try container.encode(supportCodeActions)
}
}
}
public struct CodeActionOptions: Codable, Hashable {
/// CodeActionKinds that this server may return.
public var codeActionKinds: [CodeActionKind]?
public init(codeActionKinds: [CodeActionKind]?) {
self.codeActionKinds = codeActionKinds
}
}
public struct ExecuteCommandOptions: Codable, Hashable {
/// The commands to be executed on this server.
public var commands: [String]
public init(commands: [String]) {
self.commands = commands
}
}