summaryrefslogtreecommitdiff
path: root/test_util/src
diff options
context:
space:
mode:
Diffstat (limited to 'test_util/src')
-rw-r--r--test_util/src/lsp.rs144
1 files changed, 91 insertions, 53 deletions
diff --git a/test_util/src/lsp.rs b/test_util/src/lsp.rs
index 4e87503f2..352f5d365 100644
--- a/test_util/src/lsp.rs
+++ b/test_util/src/lsp.rs
@@ -210,7 +210,22 @@ pub struct InitializeParamsBuilder {
impl InitializeParamsBuilder {
#[allow(clippy::new_without_default)]
- pub fn new() -> Self {
+ pub fn new(config: Value) -> Self {
+ let mut config_as_options = json!({});
+ if let Some(object) = config.as_object() {
+ if let Some(deno) = object.get("deno") {
+ if let Some(deno) = deno.as_object() {
+ config_as_options = json!(deno.clone());
+ }
+ }
+ let config_as_options = config_as_options.as_object_mut().unwrap();
+ if let Some(typescript) = object.get("typescript") {
+ config_as_options.insert("typescript".to_string(), typescript.clone());
+ }
+ if let Some(javascript) = object.get("javascript") {
+ config_as_options.insert("javascript".to_string(), javascript.clone());
+ }
+ }
Self {
params: InitializeParams {
process_id: None,
@@ -219,38 +234,7 @@ impl InitializeParamsBuilder {
version: Some("1.0.0".to_string()),
}),
root_uri: None,
- initialization_options: Some(json!({
- "enableBuiltinCommands": true,
- "enable": true,
- "cache": null,
- "certificateStores": null,
- "codeLens": {
- "implementations": true,
- "references": true,
- "test": true
- },
- "config": null,
- "importMap": null,
- "lint": true,
- "suggest": {
- "autoImports": true,
- "completeFunctionCalls": false,
- "names": true,
- "paths": true,
- "imports": {
- "hosts": {}
- }
- },
- "testing": {
- "args": [
- "--allow-all"
- ],
- "enable": true
- },
- "tlsCertificate": null,
- "unsafelyIgnoreCertificateErrors": null,
- "unstable": false
- })),
+ initialization_options: Some(config_as_options),
capabilities: ClientCapabilities {
text_document: Some(TextDocumentClientCapabilities {
code_action: Some(CodeActionClientCapabilities {
@@ -686,21 +670,70 @@ impl LspClient {
) {
self.initialize_with_config(
do_build,
- json!({"deno":{
- "enable": true
- }}),
+ json!({ "deno": {
+ "enableBuiltinCommands": true,
+ "enable": true,
+ "cache": null,
+ "certificateStores": null,
+ "codeLens": {
+ "implementations": true,
+ "references": true,
+ "test": true,
+ },
+ "config": null,
+ "importMap": null,
+ "lint": true,
+ "suggest": {
+ "autoImports": true,
+ "completeFunctionCalls": false,
+ "names": true,
+ "paths": true,
+ "imports": {
+ "hosts": {},
+ },
+ },
+ "testing": {
+ "args": [
+ "--allow-all"
+ ],
+ "enable": true,
+ },
+ "tlsCertificate": null,
+ "unsafelyIgnoreCertificateErrors": null,
+ "unstable": false,
+ } }),
)
}
pub fn initialize_with_config(
&mut self,
do_build: impl Fn(&mut InitializeParamsBuilder),
- config: Value,
+ mut config: Value,
) {
- let mut builder = InitializeParamsBuilder::new();
+ let mut builder = InitializeParamsBuilder::new(config.clone());
builder.set_root_uri(self.context.temp_dir().uri());
do_build(&mut builder);
let params: InitializeParams = builder.build();
+ // `config` must be updated to account for the builder changes.
+ // TODO(nayeemrmn): Remove config-related methods from builder.
+ if let Some(options) = &params.initialization_options {
+ if let Some(options) = options.as_object() {
+ if let Some(config) = config.as_object_mut() {
+ let mut deno = options.clone();
+ let typescript = options.get("typescript");
+ let javascript = options.get("javascript");
+ deno.remove("typescript");
+ deno.remove("javascript");
+ config.insert("deno".to_string(), json!(deno));
+ if let Some(typescript) = typescript {
+ config.insert("typescript".to_string(), typescript.clone());
+ }
+ if let Some(javascript) = javascript {
+ config.insert("javascript".to_string(), javascript.clone());
+ }
+ }
+ }
+ }
self.supports_workspace_configuration = match &params.capabilities.workspace
{
Some(workspace) => workspace.configuration == Some(true),
@@ -710,23 +743,12 @@ impl LspClient {
self.write_notification("initialized", json!({}));
self.config = config;
if self.supports_workspace_configuration {
- self.handle_configuration_request(&self.config.clone());
+ self.handle_configuration_request();
}
}
pub fn did_open(&mut self, params: Value) -> CollectedDiagnostics {
- self.did_open_with_config(params, &self.config.clone())
- }
-
- pub fn did_open_with_config(
- &mut self,
- params: Value,
- config: &Value,
- ) -> CollectedDiagnostics {
self.did_open_raw(params);
- if self.supports_workspace_configuration {
- self.handle_configuration_request(config);
- }
self.read_diagnostics()
}
@@ -734,17 +756,33 @@ impl LspClient {
self.write_notification("textDocument/didOpen", params);
}
- pub fn handle_configuration_request(&mut self, settings: &Value) {
+ pub fn change_configuration(&mut self, config: Value) {
+ self.config = config;
+ if self.supports_workspace_configuration {
+ self.write_notification(
+ "workspace/didChangeConfiguration",
+ json!({ "settings": {} }),
+ );
+ self.handle_configuration_request();
+ } else {
+ self.write_notification(
+ "workspace/didChangeConfiguration",
+ json!({ "settings": &self.config }),
+ );
+ }
+ }
+
+ pub fn handle_configuration_request(&mut self) {
let (id, method, args) = self.read_request::<Value>();
assert_eq!(method, "workspace/configuration");
let params = args.as_ref().unwrap().as_object().unwrap();
let items = params.get("items").unwrap().as_array().unwrap();
- let settings_object = settings.as_object().unwrap();
+ let config_object = self.config.as_object().unwrap();
let mut result = vec![];
for item in items {
let item = item.as_object().unwrap();
let section = item.get("section").unwrap().as_str().unwrap();
- result.push(settings_object.get(section).cloned().unwrap_or_default());
+ result.push(config_object.get(section).cloned().unwrap_or_default());
}
self.write_response(id, result);
}