Initial config revamp

This commit is contained in:
Lukas Wirth 2022-04-26 13:00:45 +02:00
parent 5c88d9344c
commit 61643aca49
3 changed files with 196 additions and 144 deletions

View file

@ -35,6 +35,16 @@ use crate::{
lsp_ext::{self, supports_utf8, WorkspaceSymbolSearchKind, WorkspaceSymbolSearchScope},
};
// Conventions for configuration keys to preserve maximal extendability without breakage:
// - Toggles (be it binary true/false or with more options in-between) should always suffix as `_enable`
// - In general be wary of using the namespace of something verbatim, it prevents us from adding subkeys in the future
// - Don't use abbreviations unless really necessary
// - foo_command = overrides the subcommand, foo_overrideCommand allows full overwriting
// - We could in theory only use `command` and have it change behavior depending on whether its a string or array?
// - TODO: conventions regarding config keys for commands and their args
// - TODO: command, overrideCommand, extraArgs
// - TODO: conventions regarding config polarity
// Defines the server-side configuration of the rust-analyzer. We generate
// *parts* of VS Code's `package.json` config from this.
//
@ -46,57 +56,51 @@ use crate::{
config_data! {
struct ConfigData {
/// Placeholder for missing expressions in assists.
assist_exprFillDefault: ExprFillDefaultDef = "\"todo\"",
assist_expressionFillDefault: ExprFillDefaultDef = "\"todo\"",
/// How imports should be grouped into use statements.
assist_importGranularity |
assist_importMergeBehavior |
assist_importMergeBehaviour: ImportGranularityDef = "\"crate\"",
imports_granularity: ImportGranularityDef = "\"crate\"",
/// Whether to enforce the import granularity setting for all files. If set to false rust-analyzer will try to keep import styles consistent per file.
assist_importEnforceGranularity: bool = "false",
imports_enforceGranularity: bool = "false",
/// The path structure for newly inserted paths to use.
assist_importPrefix: ImportPrefixDef = "\"plain\"",
imports_prefix: ImportPrefixDef = "\"plain\"",
/// Group inserted imports by the https://rust-analyzer.github.io/manual.html#auto-import[following order]. Groups are separated by newlines.
assist_importGroup: bool = "true",
// TODO: Shouldn't be a bool
imports_group: bool = "true",
/// Whether to allow import insertion to merge new imports into single path glob imports like `use std::fmt::*;`.
assist_allowMergingIntoGlobImports: bool = "true",
imports_mergeIntoGlob: bool = "true",
/// Warm up caches on project load.
cache_warmup: bool = "true",
/// Show function name and docs in parameter hints.
callInfo_full: bool = "true",
// TODO: needs a better name
/// Show full signature of the callable. Only shows parameters if disabled.
signatureInfo_signature_enable: bool = "true",
/// Show documentation.
signatureInfo_documentation_enable: bool = "true",
/// Automatically refresh project info via `cargo metadata` on
/// `Cargo.toml` changes.
cargo_autoreload: bool = "true",
/// Activate all available features (`--all-features`).
cargo_allFeatures: bool = "false",
/// Unsets `#[cfg(test)]` for the specified crates.
cargo_unsetTest: Vec<String> = "[\"core\"]",
/// List of features to activate.
cargo_features: Vec<String> = "[]",
/// List of features to activate. Set to `"all"` to pass `--all-features` to cargo.
cargo_features: CargoFeatures = "[]",
/// Run build scripts (`build.rs`) for more precise code analysis.
cargo_runBuildScripts |
cargo_loadOutDirsFromCheck: bool = "true",
cargo_buildScripts_enable: bool = "true",
/// Advanced option, fully override the command rust-analyzer uses to
/// run build scripts and build procedural macros. The command should
/// include `--message-format=json` or a similar option.
cargo_runBuildScriptsCommand: Option<Vec<String>> = "null",
cargo_buildScripts_overrideCommand: Option<Vec<String>> = "null",
/// Use `RUSTC_WRAPPER=rust-analyzer` when running build scripts to
/// avoid compiling unnecessary things.
cargo_useRustcWrapperForBuildScripts: bool = "true",
cargo_buildScripts_useRustcWrapper: bool = "true",
/// Do not activate the `default` feature.
cargo_noDefaultFeatures: bool = "false",
/// Compilation target (target triple).
/// Compilation target override (target triple).
cargo_target: Option<String> = "null",
/// Internal config for debugging, disables loading of sysroot crates.
cargo_noSysroot: bool = "false",
/// Run specified `cargo check` command for diagnostics on save.
checkOnSave_enable: bool = "true",
/// Check with all features (`--all-features`).
/// Defaults to `#rust-analyzer.cargo.allFeatures#`.
checkOnSave_allFeatures: Option<bool> = "null",
/// Check all targets and tests (`--all-targets`).
checkOnSave_allTargets: bool = "true",
/// Cargo command to use for `cargo check`.
@ -109,21 +113,19 @@ config_data! {
/// Extra arguments for `cargo check`.
checkOnSave_extraArgs: Vec<String> = "[]",
/// List of features to activate. Defaults to
/// `#rust-analyzer.cargo.features#`.
checkOnSave_features: Option<Vec<String>> = "null",
/// `#rust-analyzer.cargo.features#`. Set to `"all"` to pass `--all-features` to cargo.
checkOnSave_features: Option<CargoFeatures> = "null",
/// Advanced option, fully override the command rust-analyzer uses for
/// checking. The command should include `--message-format=json` or
/// similar option.
checkOnSave_overrideCommand: Option<Vec<String>> = "null",
/// Whether to add argument snippets when completing functions.
/// Only applies when `#rust-analyzer.completion.addCallParenthesis#` is set.
completion_addCallArgumentSnippets: bool = "true",
/// Whether to add parenthesis when completing functions.
completion_addCallParenthesis: bool = "true",
// TODO: needs better name
/// Whether to add parenthesis and argument snippets when completing function.
completion_callable_snippets: CallableCompletionDef = "fillArguments",
/// Custom completion snippets.
// NOTE: Keep this list in sync with the feature docs of user snippets.
completion_snippets: FxHashMap<String, SnippetDef> = r#"{
completion_snippets_custom: FxHashMap<String, SnippetDef> = r#"{
"Arc::new": {
"postfix": "arc",
"body": "Arc::new(${receiver})",
@ -169,6 +171,7 @@ config_data! {
/// Toggles the additional completions that automatically add imports when completed.
/// Note that your client must specify the `additionalTextEdits` LSP client capability to truly have this feature enabled.
completion_autoimport_enable: bool = "true",
// TODO: Do we have a better name for this? I never really liked it
/// Toggles the additional completions that automatically show method calls and field accesses
/// with `self` prefixed to them when inside a method.
completion_autoself_enable: bool = "true",
@ -179,7 +182,7 @@ config_data! {
diagnostics_enable: bool = "true",
/// Whether to show experimental rust-analyzer diagnostics that might
/// have more false positives than usual.
diagnostics_enableExperimental: bool = "false",
diagnostics_experimental_enable: bool = "false",
/// List of rust-analyzer diagnostics to disable.
diagnostics_disabled: FxHashSet<String> = "[]",
/// Map of prefixes to be substituted when parsing diagnostic file paths.
@ -196,9 +199,6 @@ config_data! {
/// and a blue icon in the `Problems Panel`.
diagnostics_warningsAsInfo: Vec<String> = "[]",
/// Expand attribute macros.
experimental_procAttrMacros: bool = "true",
/// Controls file watching implementation.
files_watcher: String = "\"client\"",
/// These directories will be ignored by rust-analyzer. They are
@ -207,44 +207,44 @@ config_data! {
files_excludeDirs: Vec<PathBuf> = "[]",
/// Enables highlighting of related references while hovering your mouse above any identifier.
highlightRelated_references: bool = "true",
highlightRelated_references_enable: bool = "true",
/// Enables highlighting of all exit points while hovering your mouse above any `return`, `?`, or return type arrow (`->`).
highlightRelated_exitPoints: bool = "true",
highlightRelated_exitPoints_enable: bool = "true",
/// Enables highlighting of related references while hovering your mouse `break`, `loop`, `while`, or `for` keywords.
highlightRelated_breakPoints: bool = "true",
highlightRelated_breakPoints_enable: bool = "true",
/// Enables highlighting of all break points for a loop or block context while hovering your mouse above any `async` or `await` keywords.
highlightRelated_yieldPoints: bool = "true",
highlightRelated_yieldPoints_enable: bool = "true",
/// Use semantic tokens for strings.
///
/// In some editors (e.g. vscode) semantic tokens override other highlighting grammars.
/// By disabling semantic tokens for strings, other grammars can be used to highlight
/// their contents.
highlighting_strings: bool = "true",
semanticHighlighting_strings_enable: bool = "true",
/// Whether to show documentation on hover.
hover_documentation: bool = "true",
hover_documentation_enable: bool = "true",
/// Use markdown syntax for links in hover.
hover_linksInHover |
hoverActions_linksInHover: bool = "true",
hover_links_enable: bool = "true",
/// Whether to show `Debug` action. Only applies when
/// `#rust-analyzer.hoverActions.enable#` is set.
hoverActions_debug: bool = "true",
hover_actions_debug_enable: bool = "true",
// TODO: There is not point in having a global option is there?
/// Whether to show HoverActions in Rust files.
hoverActions_enable: bool = "true",
hover_actions_enable: bool = "true",
/// Whether to show `Go to Type Definition` action. Only applies when
/// `#rust-analyzer.hoverActions.enable#` is set.
hoverActions_gotoTypeDef: bool = "true",
hover_actions_gotoTypeDef_enable: bool = "true",
/// Whether to show `Implementations` action. Only applies when
/// `#rust-analyzer.hoverActions.enable#` is set.
hoverActions_implementations: bool = "true",
hover_actions_implementations_enable: bool = "true",
/// Whether to show `References` action. Only applies when
/// `#rust-analyzer.hoverActions.enable#` is set.
hoverActions_references: bool = "false",
hover_actions_references_enable: bool = "false",
/// Whether to show `Run` action. Only applies when
/// `#rust-analyzer.hoverActions.enable#` is set.
hoverActions_run: bool = "true",
hover_actions_run_enable: bool = "true",
/// Whether to render trailing colons for parameter hints, and trailing colons for parameter hints.
inlayHints_renderColons: bool = "true",
@ -252,21 +252,21 @@ config_data! {
inlayHints_maxLength: Option<usize> = "25",
/// Whether to show function parameter name inlay hints at the call
/// site.
inlayHints_parameterHints: bool = "true",
inlayHints_parameterHints_enable: bool = "true",
/// Whether to show inlay type hints for variables.
inlayHints_typeHints: bool = "true",
inlayHints_typeHints_enable: bool = "true",
/// Whether to show inlay type hints for method chains.
inlayHints_chainingHints: bool = "true",
inlayHints_chainingHints_enable: bool = "true",
/// Whether to hide inlay hints for constructors.
inlayHints_typeHints_hideNamedConstructor: bool = "false",
/// Whether to show inlay type hints for return types of closures with blocks.
inlayHints_closureReturnTypeHints: bool = "false",
inlayHints_closureReturnTypeHints_enable: bool = "false",
/// Whether to show inlay type hints for compiler inserted reborrows.
inlayHints_reborrowHints: bool = "false",
inlayHints_reborrowHints_enable: bool = "false",
/// Whether to show inlay type hints for elided lifetimes in function signatures.
inlayHints_lifetimeElisionHints_enable: LifetimeElisionDef = "\"never\"",
/// Whether to prefer using parameter names as the name for elided lifetime hints if possible.
inlayHints_lifetimeElisionHints_useParameterNames: bool = "false",
/// Whether to hide inlay hints for constructors.
inlayHints_hideNamedConstructorHints: bool = "false",
/// Join lines inserts else between consecutive ifs.
joinLines_joinElseIf: bool = "true",
@ -279,24 +279,28 @@ config_data! {
/// Whether to show `Debug` lens. Only applies when
/// `#rust-analyzer.lens.enable#` is set.
lens_debug: bool = "true",
lens_debug_enable: bool = "true",
// TODO: Does a global enable make sense even?
/// Whether to show CodeLens in Rust files.
lens_enable: bool = "true",
/// Whether to show `Implementations` lens. Only applies when
/// `#rust-analyzer.lens.enable#` is set.
lens_implementations: bool = "true",
lens_implementations_enable: bool = "true",
/// Whether to show `Run` lens. Only applies when
/// `#rust-analyzer.lens.enable#` is set.
lens_run: bool = "true",
lens_run_enable: bool = "true",
/// Whether to show `Method References` lens. Only applies when
/// `#rust-analyzer.lens.enable#` is set.
lens_methodReferences: bool = "false",
/// Whether to show `References` lens for Struct, Enum, Union and Trait.
lens_references_method_enable: bool = "false",
/// Whether to show `References` lens for Struct, Enum, and Union.
/// Only applies when `#rust-analyzer.lens.enable#` is set.
lens_references: bool = "false",
lens_references_adt_enable: bool = "false",
/// Whether to show `References` lens for Trait.
/// Only applies when `#rust-analyzer.lens.enable#` is set.
lens_references_trait_enable: bool = "false",
/// Whether to show `References` lens for Enum Variants.
/// Only applies when `#rust-analyzer.lens.enable#` is set.
lens_enumVariantReferences: bool = "false",
lens_references_adt_variant_enable: bool = "false",
/// Internal config: use custom client-side commands even when the
/// client doesn't set the corresponding capability.
lens_forceCustomCommands: bool = "true",
@ -309,13 +313,15 @@ config_data! {
linkedProjects: Vec<ManifestOrProjectJson> = "[]",
/// Number of syntax trees rust-analyzer keeps in memory. Defaults to 128.
lruCapacity: Option<usize> = "null",
lru_capacity: Option<usize> = "null",
/// Whether to show `can't find Cargo.toml` error message.
notifications_cargoTomlNotFound: bool = "true",
/// How many worker threads to to handle priming caches. The default `0` means to pick automatically.
primeCaches_numThreads: ParallelPrimeCachesNumThreads = "0",
/// Warm up caches on project load.
primeCaches_enable: bool = "true",
/// Enable support for procedural macros, implies `#rust-analyzer.cargo.runBuildScripts#`.
procMacro_enable: bool = "true",
@ -326,12 +332,14 @@ config_data! {
///
/// This config takes a map of crate names with the exported proc-macro names to ignore as values.
procMacro_ignored: FxHashMap<Box<str>, Box<[Box<str>]>> = "{}",
/// Expand attribute macros. Requires `#rust-analyzer.procMacro.enable#` to be set.
procMacro_attributes_enable: bool = "true",
/// Command to be executed instead of 'cargo' for runnables.
runnables_overrideCargo: Option<String> = "null",
runnables_command: Option<String> = "null",
/// Additional arguments to be passed to cargo for runnables such as
/// tests or binaries. For example, it may be `--release`.
runnables_cargoExtraArgs: Vec<String> = "[]",
runnables_extraArgs: Vec<String> = "[]",
/// Path to the Cargo.toml of the rust compiler workspace, for usage in rustc_private
/// projects, or "discover" to try to automatically find it if the `rustc-dev` component
@ -341,7 +349,7 @@ config_data! {
/// crates must set `[package.metadata.rust-analyzer] rustc_private=true` to use it.
///
/// This option does not take effect until rust-analyzer is restarted.
rustcSource: Option<String> = "null",
rustc_source: Option<String> = "null",
/// Additional arguments to `rustfmt`.
rustfmt_extraArgs: Vec<String> = "[]",
@ -351,7 +359,7 @@ config_data! {
/// Enables the use of rustfmt's unstable range formatting command for the
/// `textDocument/rangeFormatting` request. The rustfmt option is unstable and only
/// available on a nightly build.
rustfmt_enableRangeFormatting: bool = "false",
rustfmt_rangeFormatting_enable: bool = "false",
/// Workspace symbol search scope.
workspace_symbol_search_scope: WorkspaceSymbolSearchScopeDef = "\"workspace\"",
@ -400,6 +408,11 @@ impl From<ProjectJson> for LinkedProject {
}
}
pub struct CallInfoConfig {
pub params_only: bool,
pub docs: bool,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct LensConfig {
// runnables
@ -411,7 +424,8 @@ pub struct LensConfig {
// references
pub method_refs: bool,
pub refs: bool, // for Struct, Enum, Union and Trait
pub refs_adt: bool, // for Struct, Enum, Union and Trait
pub refs_trait: bool, // for Struct, Enum, Union and Trait
pub enum_variant_refs: bool,
}
@ -421,7 +435,8 @@ impl LensConfig {
|| self.debug
|| self.implementations
|| self.method_refs
|| self.refs
|| self.refs_adt
|| self.refs_trait
|| self.enum_variant_refs
}
@ -434,7 +449,7 @@ impl LensConfig {
}
pub fn references(&self) -> bool {
self.method_refs || self.refs || self.enum_variant_refs
self.method_refs || self.refs_adt || self.refs_trait || self.enum_variant_refs
}
}
@ -566,7 +581,7 @@ impl Config {
.collect();
self.data = ConfigData::from_json(json, &mut errors);
self.snippets.clear();
for (name, def) in self.data.completion_snippets.iter() {
for (name, def) in self.data.completion_snippets_custom.iter() {
if def.prefix.is_empty() && def.postfix.is_empty() {
continue;
}
@ -685,7 +700,7 @@ impl Config {
}
pub fn prefill_caches(&self) -> bool {
self.data.cache_warmup
self.data.primeCaches_enable
}
pub fn location_link(&self) -> bool {
@ -795,9 +810,9 @@ impl Config {
pub fn diagnostics(&self) -> DiagnosticsConfig {
DiagnosticsConfig {
disable_experimental: !self.data.diagnostics_enableExperimental,
disable_experimental: !self.data.diagnostics_experimental_enable,
disabled: self.data.diagnostics_disabled.clone(),
expr_fill_default: match self.data.assist_exprFillDefault {
expr_fill_default: match self.data.assist_expressionFillDefault {
ExprFillDefaultDef::Todo => ExprFillDefaultMode::Todo,
ExprFillDefaultDef::Default => ExprFillDefaultMode::Default,
},
@ -813,7 +828,7 @@ impl Config {
}
pub fn lru_capacity(&self) -> Option<usize> {
self.data.lruCapacity
self.data.lru_capacity
}
pub fn proc_macro_srv(&self) -> Option<(AbsPathBuf, Vec<OsString>)> {
@ -832,7 +847,7 @@ impl Config {
}
pub fn expand_proc_attr_macros(&self) -> bool {
self.data.experimental_procAttrMacros
self.data.procMacro_attributes_enable
}
pub fn files(&self) -> FilesConfig {
@ -857,11 +872,11 @@ impl Config {
}
pub fn run_build_scripts(&self) -> bool {
self.data.cargo_runBuildScripts || self.data.procMacro_enable
self.data.cargo_buildScripts_enable || self.data.procMacro_enable
}
pub fn cargo(&self) -> CargoConfig {
let rustc_source = self.data.rustcSource.as_ref().map(|rustc_src| {
let rustc_source = self.data.rustc_source.as_ref().map(|rustc_src| {
if rustc_src == "discover" {
RustcSource::Discover
} else {
@ -871,14 +886,17 @@ impl Config {
CargoConfig {
no_default_features: self.data.cargo_noDefaultFeatures,
all_features: self.data.cargo_allFeatures,
features: self.data.cargo_features.clone(),
all_features: matches!(self.data.cargo_features, CargoFeatures::All),
features: match &self.data.cargo_features {
CargoFeatures::All => vec![],
CargoFeatures::Listed(it) => it.clone(),
},
target: self.data.cargo_target.clone(),
no_sysroot: self.data.cargo_noSysroot,
rustc_source,
unset_test_crates: UnsetTestCrates::Only(self.data.cargo_unsetTest.clone()),
wrap_rustc_in_build_scripts: self.data.cargo_useRustcWrapperForBuildScripts,
run_build_script_command: self.data.cargo_runBuildScriptsCommand.clone(),
wrap_rustc_in_build_scripts: self.data.cargo_buildScripts_useRustcWrapper,
run_build_script_command: self.data.cargo_buildScripts_overrideCommand.clone(),
}
}
@ -891,7 +909,7 @@ impl Config {
}
Some(_) | None => RustfmtConfig::Rustfmt {
extra_args: self.data.rustfmt_extraArgs.clone(),
enable_range_formatting: self.data.rustfmt_enableRangeFormatting,
enable_range_formatting: self.data.rustfmt_rangeFormatting_enable,
},
}
}
@ -918,15 +936,19 @@ impl Config {
.data
.checkOnSave_noDefaultFeatures
.unwrap_or(self.data.cargo_noDefaultFeatures),
all_features: self
.data
.checkOnSave_allFeatures
.unwrap_or(self.data.cargo_allFeatures),
features: self
all_features: matches!(
self.data.checkOnSave_features.as_ref().unwrap_or(&self.data.cargo_features),
CargoFeatures::All
),
features: match self
.data
.checkOnSave_features
.clone()
.unwrap_or_else(|| self.data.cargo_features.clone()),
.unwrap_or_else(|| self.data.cargo_features.clone())
{
CargoFeatures::All => vec![],
CargoFeatures::Listed(it) => it,
},
extra_args: self.data.checkOnSave_extraArgs.clone(),
},
};
@ -935,25 +957,25 @@ impl Config {
pub fn runnables(&self) -> RunnablesConfig {
RunnablesConfig {
override_cargo: self.data.runnables_overrideCargo.clone(),
cargo_extra_args: self.data.runnables_cargoExtraArgs.clone(),
override_cargo: self.data.runnables_command.clone(),
cargo_extra_args: self.data.runnables_extraArgs.clone(),
}
}
pub fn inlay_hints(&self) -> InlayHintsConfig {
InlayHintsConfig {
render_colons: self.data.inlayHints_renderColons,
type_hints: self.data.inlayHints_typeHints,
parameter_hints: self.data.inlayHints_parameterHints,
chaining_hints: self.data.inlayHints_chainingHints,
closure_return_type_hints: self.data.inlayHints_closureReturnTypeHints,
type_hints: self.data.inlayHints_typeHints_enable,
parameter_hints: self.data.inlayHints_parameterHints_enable,
chaining_hints: self.data.inlayHints_chainingHints_enable,
closure_return_type_hints: self.data.inlayHints_closureReturnTypeHints_enable,
lifetime_elision_hints: match self.data.inlayHints_lifetimeElisionHints_enable {
LifetimeElisionDef::Always => LifetimeElisionHints::Always,
LifetimeElisionDef::Never => LifetimeElisionHints::Never,
LifetimeElisionDef::SkipTrivial => LifetimeElisionHints::SkipTrivial,
},
hide_named_constructor_hints: self.data.inlayHints_hideNamedConstructorHints,
reborrow_hints: self.data.inlayHints_reborrowHints,
hide_named_constructor_hints: self.data.inlayHints_typeHints_hideNamedConstructor,
reborrow_hints: self.data.inlayHints_reborrowHints_enable,
param_names_for_lifetime_elision_hints: self
.data
.inlayHints_lifetimeElisionHints_useParameterNames,
@ -963,20 +985,20 @@ impl Config {
fn insert_use_config(&self) -> InsertUseConfig {
InsertUseConfig {
granularity: match self.data.assist_importGranularity {
granularity: match self.data.imports_granularity {
ImportGranularityDef::Preserve => ImportGranularity::Preserve,
ImportGranularityDef::Item => ImportGranularity::Item,
ImportGranularityDef::Crate => ImportGranularity::Crate,
ImportGranularityDef::Module => ImportGranularity::Module,
},
enforce_granularity: self.data.assist_importEnforceGranularity,
prefix_kind: match self.data.assist_importPrefix {
enforce_granularity: self.data.imports_enforceGranularity,
prefix_kind: match self.data.imports_prefix {
ImportPrefixDef::Plain => PrefixKind::Plain,
ImportPrefixDef::ByCrate => PrefixKind::ByCrate,
ImportPrefixDef::BySelf => PrefixKind::BySelf,
},
group: self.data.assist_importGroup,
skip_glob_imports: !self.data.assist_allowMergingIntoGlobImports,
group: self.data.imports_group,
skip_glob_imports: !self.data.imports_mergeIntoGlob,
}
}
@ -987,8 +1009,14 @@ impl Config {
&& completion_item_edit_resolve(&self.caps),
enable_self_on_the_fly: self.data.completion_autoself_enable,
enable_private_editable: self.data.completion_privateEditable_enable,
add_call_parenthesis: self.data.completion_addCallParenthesis,
add_call_argument_snippets: self.data.completion_addCallArgumentSnippets,
add_call_parenthesis: matches!(
self.data.completion_callable_snippets,
CallableCompletionDef::AddParentheses
),
add_call_argument_snippets: matches!(
self.data.completion_callable_snippets,
CallableCompletionDef::FillArguments
),
insert_use: self.insert_use_config(),
snippet_cap: SnippetCap::new(try_or_def!(
self.caps
@ -1021,40 +1049,45 @@ impl Config {
}
}
pub fn call_info_full(&self) -> bool {
self.data.callInfo_full
pub fn call_info(&self) -> CallInfoConfig {
CallInfoConfig {
params_only: self.data.signatureInfo_signature_enable,
docs: self.data.signatureInfo_documentation_enable,
}
}
pub fn lens(&self) -> LensConfig {
LensConfig {
run: self.data.lens_enable && self.data.lens_run,
debug: self.data.lens_enable && self.data.lens_debug,
implementations: self.data.lens_enable && self.data.lens_implementations,
method_refs: self.data.lens_enable && self.data.lens_methodReferences,
refs: self.data.lens_enable && self.data.lens_references,
enum_variant_refs: self.data.lens_enable && self.data.lens_enumVariantReferences,
run: self.data.lens_enable && self.data.lens_run_enable,
debug: self.data.lens_enable && self.data.lens_debug_enable,
implementations: self.data.lens_enable && self.data.lens_implementations_enable,
method_refs: self.data.lens_enable && self.data.lens_references_method_enable,
refs_adt: self.data.lens_enable && self.data.lens_references_adt_enable,
refs_trait: self.data.lens_enable && self.data.lens_references_trait_enable,
enum_variant_refs: self.data.lens_enable
&& self.data.lens_references_adt_variant_enable,
}
}
pub fn hover_actions(&self) -> HoverActionsConfig {
let enable = self.experimental("hoverActions") && self.data.hoverActions_enable;
let enable = self.experimental("hoverActions") && self.data.hover_actions_enable;
HoverActionsConfig {
implementations: enable && self.data.hoverActions_implementations,
references: enable && self.data.hoverActions_references,
run: enable && self.data.hoverActions_run,
debug: enable && self.data.hoverActions_debug,
goto_type_def: enable && self.data.hoverActions_gotoTypeDef,
implementations: enable && self.data.hover_actions_implementations_enable,
references: enable && self.data.hover_actions_references_enable,
run: enable && self.data.hover_actions_run_enable,
debug: enable && self.data.hover_actions_debug_enable,
goto_type_def: enable && self.data.hover_actions_gotoTypeDef_enable,
}
}
pub fn highlighting_strings(&self) -> bool {
self.data.highlighting_strings
self.data.semanticHighlighting_strings_enable
}
pub fn hover(&self) -> HoverConfig {
HoverConfig {
links_in_hover: self.data.hover_linksInHover,
documentation: self.data.hover_documentation.then(|| {
links_in_hover: self.data.hover_links_enable,
documentation: self.data.hover_documentation_enable.then(|| {
let is_markdown = try_or_def!(self
.caps
.text_document
@ -1132,10 +1165,10 @@ impl Config {
pub fn highlight_related(&self) -> HighlightRelatedConfig {
HighlightRelatedConfig {
references: self.data.highlightRelated_references,
break_points: self.data.highlightRelated_breakPoints,
exit_points: self.data.highlightRelated_exitPoints,
yield_points: self.data.highlightRelated_yieldPoints,
references: self.data.highlightRelated_references_enable,
break_points: self.data.highlightRelated_breakPoints_enable,
exit_points: self.data.highlightRelated_exitPoints_enable,
yield_points: self.data.highlightRelated_yieldPoints_enable,
}
}
@ -1237,6 +1270,23 @@ enum ImportGranularityDef {
Module,
}
#[derive(Deserialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
enum CallableCompletionDef {
FillArguments,
AddParentheses,
#[serde(alias = "false")]
None,
}
#[derive(Deserialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
#[serde(untagged)]
enum CargoFeatures {
All,
Listed(Vec<String>),
}
#[derive(Deserialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
enum LifetimeElisionDef {
@ -1317,6 +1367,12 @@ macro_rules! _config_data {
])
}
}
// TODO: Uncomment this and sort once everything is done
// #[test]
// fn fields_are_sorted() {
// [$(stringify!($field)),*].windows(2).for_each(|w| assert!(w[0] <= w[1], "{} <= {} does not hold", w[0], w[1]));
// }
};
}
use _config_data as config_data;

View file

@ -911,8 +911,8 @@ pub(crate) fn handle_signature_help(
Some(it) => it,
None => return Ok(None),
};
let concise = !snap.config.call_info_full();
let res = to_proto::signature_help(help, concise, snap.config.signature_help_label_offsets());
let config = snap.config.call_info();
let res = to_proto::signature_help(help, config, snap.config.signature_help_label_offsets());
Ok(Some(res))
}
@ -1215,7 +1215,7 @@ pub(crate) fn handle_code_lens(
.unwrap_or(false),
annotate_runnables: lens_config.runnable(),
annotate_impls: lens_config.implementations,
annotate_references: lens_config.refs,
annotate_references: lens_config.refs_adt,
annotate_method_references: lens_config.method_refs,
annotate_enum_variant_references: lens_config.enum_variant_refs,
},

View file

@ -18,7 +18,7 @@ use vfs::AbsPath;
use crate::{
cargo_target_spec::CargoTargetSpec,
config::Config,
config::{CallInfoConfig, Config},
global_state::GlobalStateSnapshot,
line_index::{LineEndings, LineIndex, OffsetEncoding},
lsp_ext,
@ -338,11 +338,11 @@ fn completion_item(
pub(crate) fn signature_help(
call_info: SignatureHelp,
concise: bool,
config: CallInfoConfig,
label_offsets: bool,
) -> lsp_types::SignatureHelp {
let (label, parameters) = match (concise, label_offsets) {
(_, false) => {
let (label, parameters) = match (!config.params_only, label_offsets) {
(concise, false) => {
let params = call_info
.parameter_labels()
.map(|label| lsp_types::ParameterInformation {
@ -388,16 +388,12 @@ pub(crate) fn signature_help(
}
};
let documentation = if concise {
None
} else {
call_info.doc.map(|doc| {
let documentation = call_info.doc.filter(|_| config.docs).map(|doc| {
lsp_types::Documentation::MarkupContent(lsp_types::MarkupContent {
kind: lsp_types::MarkupKind::Markdown,
value: doc,
})
})
};
});
let active_parameter = call_info.active_parameter.map(|it| it as u32);