mirror of
https://github.com/apple/sourcekit-lsp.git
synced 2026-03-02 18:23:24 +01:00
265 lines
10 KiB
Swift
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
|
|
}
|
|
}
|