Files
sdk/pkg/analysis_server/lib/src/lsp/client_capabilities.dart
T
Danny Tuppeny 80fb1a56db [analysis_server] Add shared protocol.dart file for LSP
In an upcoming change some types will between these files. To reduce the size of that (already very large) CL and because the distinction between spec-generated/custom-generated types was unnecessary anyway, this adds a single import for LSP protocol-related types.

Change-Id: I322447d6c979538c12014d87875176e1bf2adca7
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/244244
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
2022-05-11 15:28:35 +00:00

180 lines
7.4 KiB
Dart

// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:analysis_server/lsp_protocol/protocol.dart';
/// Wraps the client (editor) capabilities to improve performance.
///
/// Sets transferred as arrays in JSON will be converted to Sets for faster
/// lookups and default values and nulls will be handled here.
class LspClientCapabilities {
/// If the client does not provide capabilities.completion.completionItemKind.valueSet
/// then we must never send a kind that's not in this list.
static final Set<CompletionItemKind> defaultSupportedCompletionKinds = {
CompletionItemKind.Text,
CompletionItemKind.Method,
CompletionItemKind.Function,
CompletionItemKind.Constructor,
CompletionItemKind.Field,
CompletionItemKind.Variable,
CompletionItemKind.Class,
CompletionItemKind.Interface,
CompletionItemKind.Module,
CompletionItemKind.Property,
CompletionItemKind.Unit,
CompletionItemKind.Value,
CompletionItemKind.Enum,
CompletionItemKind.Keyword,
CompletionItemKind.Snippet,
CompletionItemKind.Color,
CompletionItemKind.File,
CompletionItemKind.Reference,
};
/// If the client does not provide capabilities.documentSymbol.symbolKind.valueSet
/// then we must never send a kind that's not in this list.
static final Set<SymbolKind> defaultSupportedSymbolKinds = {
SymbolKind.File,
SymbolKind.Module,
SymbolKind.Namespace,
SymbolKind.Package,
SymbolKind.Class,
SymbolKind.Method,
SymbolKind.Property,
SymbolKind.Field,
SymbolKind.Constructor,
SymbolKind.Enum,
SymbolKind.Interface,
SymbolKind.Function,
SymbolKind.Variable,
SymbolKind.Constant,
SymbolKind.Str,
SymbolKind.Number,
SymbolKind.Boolean,
SymbolKind.Array,
};
final ClientCapabilities raw;
final bool documentChanges;
final bool configuration;
final bool createResourceOperations;
final bool renameResourceOperations;
final bool completionDeprecatedFlag;
final bool applyEdit;
final bool workDoneProgress;
final bool completionSnippets;
final bool renameValidation;
final bool literalCodeActions;
final bool insertReplaceCompletionRanges;
final bool definitionLocationLink;
final bool typeDefinitionLocationLink;
final bool hierarchicalSymbols;
final bool diagnosticCodeDescription;
final Set<CodeActionKind> codeActionKinds;
final Set<CompletionItemTag> completionItemTags;
final Set<DiagnosticTag> diagnosticTags;
final Set<MarkupKind>? completionDocumentationFormats;
final Set<MarkupKind>? signatureHelpDocumentationFormats;
final Set<MarkupKind>? hoverContentFormats;
final Set<SymbolKind> documentSymbolKinds;
final Set<SymbolKind> workspaceSymbolKinds;
final Set<CompletionItemKind> completionItemKinds;
final Set<InsertTextMode> completionInsertTextModes;
final bool experimentalSnippetTextEdit;
LspClientCapabilities(this.raw)
: applyEdit = raw.workspace?.applyEdit ?? false,
codeActionKinds = _listToSet(raw.textDocument?.codeAction
?.codeActionLiteralSupport?.codeActionKind.valueSet),
completionDeprecatedFlag =
raw.textDocument?.completion?.completionItem?.deprecatedSupport ??
false,
completionDocumentationFormats = _completionDocumentationFormats(raw),
completionInsertTextModes = _listToSet(raw.textDocument?.completion
?.completionItem?.insertTextModeSupport?.valueSet),
completionItemKinds = _listToSet(
raw.textDocument?.completion?.completionItemKind?.valueSet,
defaults: defaultSupportedCompletionKinds),
completionSnippets =
raw.textDocument?.completion?.completionItem?.snippetSupport ??
false,
configuration = raw.workspace?.configuration ?? false,
createResourceOperations = raw
.workspace?.workspaceEdit?.resourceOperations
?.contains(ResourceOperationKind.Create) ??
false,
renameResourceOperations = raw
.workspace?.workspaceEdit?.resourceOperations
?.contains(ResourceOperationKind.Rename) ??
false,
definitionLocationLink =
raw.textDocument?.definition?.linkSupport ?? false,
typeDefinitionLocationLink =
raw.textDocument?.typeDefinition?.linkSupport ?? false,
completionItemTags = _listToSet(
raw.textDocument?.completion?.completionItem?.tagSupport?.valueSet),
diagnosticTags = _listToSet(
raw.textDocument?.publishDiagnostics?.tagSupport?.valueSet),
documentChanges =
raw.workspace?.workspaceEdit?.documentChanges ?? false,
documentSymbolKinds = _listToSet(
raw.textDocument?.documentSymbol?.symbolKind?.valueSet,
defaults: defaultSupportedSymbolKinds),
hierarchicalSymbols = raw.textDocument?.documentSymbol
?.hierarchicalDocumentSymbolSupport ??
false,
diagnosticCodeDescription =
raw.textDocument?.publishDiagnostics?.codeDescriptionSupport ??
false,
hoverContentFormats = _hoverContentFormats(raw),
insertReplaceCompletionRanges = raw.textDocument?.completion
?.completionItem?.insertReplaceSupport ??
false,
literalCodeActions =
raw.textDocument?.codeAction?.codeActionLiteralSupport != null,
renameValidation = raw.textDocument?.rename?.prepareSupport ?? false,
signatureHelpDocumentationFormats = _sigHelpDocumentationFormats(raw),
workDoneProgress = raw.window?.workDoneProgress ?? false,
workspaceSymbolKinds = _listToSet(
raw.workspace?.symbol?.symbolKind?.valueSet,
defaults: defaultSupportedSymbolKinds),
experimentalSnippetTextEdit =
raw.experimental is Map<String, Object?> &&
(raw.experimental as Map<String, Object?>)['snippetTextEdit'] ==
true;
static Set<MarkupKind>? _completionDocumentationFormats(
ClientCapabilities raw) {
// For formats, null is valid (which means only raw strings are supported,
// not [MarkupContent]).
return _listToNullableSet(
raw.textDocument?.completion?.completionItem?.documentationFormat);
}
static Set<MarkupKind>? _hoverContentFormats(ClientCapabilities raw) {
// For formats, null is valid (which means only raw strings are supported,
// not [MarkupContent]), so use null as default.
return _listToNullableSet(raw.textDocument?.hover?.contentFormat);
}
/// Converts a list to a `Set`, returning null if the list is null.
static Set<T>? _listToNullableSet<T>(List<T>? items) {
return items != null ? {...items} : null;
}
/// Converts a list to a `Set`, returning [defaults] if the list is null.
///
/// If [defaults] is not supplied, will return an empty set.
static Set<T> _listToSet<T>(List<T>? items, {Set<T> defaults = const {}}) {
return items != null ? {...items} : defaults;
}
static Set<MarkupKind>? _sigHelpDocumentationFormats(ClientCapabilities raw) {
// For formats, null is valid (which means only raw strings are supported,
// not [MarkupContent]), so use null as default.
return _listToNullableSet(raw.textDocument?.signatureHelp
?.signatureInformation?.documentationFormat);
}
}