diff options
-rw-r--r-- | crates/ra_lsp_server/src/main.rs | 11 | ||||
-rw-r--r-- | crates/ra_lsp_server/src/main_loop.rs | 8 | ||||
-rw-r--r-- | editors/code/package.json | 11 | ||||
-rw-r--r-- | editors/code/src/server.ts | 26 |
4 files changed, 47 insertions, 9 deletions
diff --git a/crates/ra_lsp_server/src/main.rs b/crates/ra_lsp_server/src/main.rs index eae601f91..33aa30d70 100644 --- a/crates/ra_lsp_server/src/main.rs +++ b/crates/ra_lsp_server/src/main.rs | |||
@@ -27,7 +27,10 @@ fn main() -> Result<()> { | |||
27 | #[derive(Deserialize)] | 27 | #[derive(Deserialize)] |
28 | #[serde(rename_all = "camelCase")] | 28 | #[serde(rename_all = "camelCase")] |
29 | struct InitializationOptions { | 29 | struct InitializationOptions { |
30 | publish_decorations: bool, | 30 | // Whether the client supports our custom highlighting publishing decorations. |
31 | // This is different to the highlightingOn setting, which is whether the user | ||
32 | // wants our custom highlighting to be used. | ||
33 | publish_decorations: Option<bool>, | ||
31 | } | 34 | } |
32 | 35 | ||
33 | fn main_inner() -> Result<()> { | 36 | fn main_inner() -> Result<()> { |
@@ -42,12 +45,12 @@ fn main_inner() -> Result<()> { | |||
42 | .root_uri | 45 | .root_uri |
43 | .and_then(|it| it.to_file_path().ok()) | 46 | .and_then(|it| it.to_file_path().ok()) |
44 | .unwrap_or(cwd); | 47 | .unwrap_or(cwd); |
45 | let publish_decorations = params | 48 | let supports_decorations = params |
46 | .initialization_options | 49 | .initialization_options |
47 | .and_then(|v| InitializationOptions::deserialize(v).ok()) | 50 | .and_then(|v| InitializationOptions::deserialize(v).ok()) |
48 | .map(|it| it.publish_decorations) | 51 | .and_then(|it| it.publish_decorations) |
49 | == Some(true); | 52 | == Some(true); |
50 | ra_lsp_server::main_loop(false, root, publish_decorations, r, s) | 53 | ra_lsp_server::main_loop(false, root, supports_decorations, r, s) |
51 | }, | 54 | }, |
52 | )?; | 55 | )?; |
53 | log::info!("shutting down IO..."); | 56 | log::info!("shutting down IO..."); |
diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs index 565ec92af..a5a2b5eec 100644 --- a/crates/ra_lsp_server/src/main_loop.rs +++ b/crates/ra_lsp_server/src/main_loop.rs | |||
@@ -54,7 +54,7 @@ enum Task { | |||
54 | pub fn main_loop( | 54 | pub fn main_loop( |
55 | internal_mode: bool, | 55 | internal_mode: bool, |
56 | ws_root: PathBuf, | 56 | ws_root: PathBuf, |
57 | publish_decorations: bool, | 57 | supports_decorations: bool, |
58 | msg_receiver: &Receiver<RawMessage>, | 58 | msg_receiver: &Receiver<RawMessage>, |
59 | msg_sender: &Sender<RawMessage>, | 59 | msg_sender: &Sender<RawMessage>, |
60 | ) -> Result<()> { | 60 | ) -> Result<()> { |
@@ -83,7 +83,7 @@ pub fn main_loop( | |||
83 | let mut subs = Subscriptions::new(); | 83 | let mut subs = Subscriptions::new(); |
84 | let main_res = main_loop_inner( | 84 | let main_res = main_loop_inner( |
85 | internal_mode, | 85 | internal_mode, |
86 | publish_decorations, | 86 | supports_decorations, |
87 | &pool, | 87 | &pool, |
88 | msg_sender, | 88 | msg_sender, |
89 | msg_receiver, | 89 | msg_receiver, |
@@ -156,7 +156,7 @@ impl fmt::Debug for Event { | |||
156 | 156 | ||
157 | fn main_loop_inner( | 157 | fn main_loop_inner( |
158 | internal_mode: bool, | 158 | internal_mode: bool, |
159 | publish_decorations: bool, | 159 | supports_decorations: bool, |
160 | pool: &ThreadPool, | 160 | pool: &ThreadPool, |
161 | msg_sender: &Sender<RawMessage>, | 161 | msg_sender: &Sender<RawMessage>, |
162 | msg_receiver: &Receiver<RawMessage>, | 162 | msg_receiver: &Receiver<RawMessage>, |
@@ -240,7 +240,7 @@ fn main_loop_inner( | |||
240 | update_file_notifications_on_threadpool( | 240 | update_file_notifications_on_threadpool( |
241 | pool, | 241 | pool, |
242 | state.snapshot(), | 242 | state.snapshot(), |
243 | publish_decorations, | 243 | supports_decorations, |
244 | task_sender.clone(), | 244 | task_sender.clone(), |
245 | subs.subscriptions(), | 245 | subs.subscriptions(), |
246 | ) | 246 | ) |
diff --git a/editors/code/package.json b/editors/code/package.json index d53e44b21..2989a7016 100644 --- a/editors/code/package.json +++ b/editors/code/package.json | |||
@@ -131,6 +131,17 @@ | |||
131 | "type": "boolean", | 131 | "type": "boolean", |
132 | "default": true, | 132 | "default": true, |
133 | "description": "Highlight Rust code (overrides built-in syntax highlighting)" | 133 | "description": "Highlight Rust code (overrides built-in syntax highlighting)" |
134 | }, | ||
135 | "ra-lsp.trace.server": { | ||
136 | "type": "string", | ||
137 | "scope": "window", | ||
138 | "enum": [ | ||
139 | "off", | ||
140 | "messages", | ||
141 | "verbose" | ||
142 | ], | ||
143 | "default": "off", | ||
144 | "description": "Trace requests to the ra-lsp server" | ||
134 | } | 145 | } |
135 | } | 146 | } |
136 | }, | 147 | }, |
diff --git a/editors/code/src/server.ts b/editors/code/src/server.ts index 75e273f37..75bdf3207 100644 --- a/editors/code/src/server.ts +++ b/editors/code/src/server.ts | |||
@@ -22,7 +22,7 @@ export class Server { | |||
22 | const clientOptions: lc.LanguageClientOptions = { | 22 | const clientOptions: lc.LanguageClientOptions = { |
23 | documentSelector: [{ scheme: 'file', language: 'rust' }], | 23 | documentSelector: [{ scheme: 'file', language: 'rust' }], |
24 | initializationOptions: { | 24 | initializationOptions: { |
25 | publishDecorations: true, | 25 | publishDecorations: true |
26 | } | 26 | } |
27 | }; | 27 | }; |
28 | 28 | ||
@@ -32,6 +32,30 @@ export class Server { | |||
32 | serverOptions, | 32 | serverOptions, |
33 | clientOptions | 33 | clientOptions |
34 | ); | 34 | ); |
35 | // HACK: This is an awful way of filtering out the decorations notifications | ||
36 | // However, pending proper support, this is the most effecitve approach | ||
37 | // Proper support for this would entail a change to vscode-languageclient to allow not notifying on certain messages | ||
38 | // Or the ability to disable the serverside component of highlighting (but this means that to do tracing we need to disable hihlighting) | ||
39 | // This also requires considering our settings strategy, which is work which needs doing | ||
40 | // @ts-ignore The tracer is private to vscode-languageclient, but we need access to it to not log publishDecorations requests | ||
41 | Server.client._tracer = { | ||
42 | log: (messageOrDataObject: string | any, data?: string) => { | ||
43 | if (typeof messageOrDataObject === 'string') { | ||
44 | if ( | ||
45 | messageOrDataObject.includes('m/publishDecorations') || | ||
46 | messageOrDataObject.includes('m/decorationsRequest') | ||
47 | ) { | ||
48 | // Don't log publish decorations requests | ||
49 | } else { | ||
50 | // @ts-ignore This is just a utility function | ||
51 | Server.client.logTrace(messageOrDataObject, data); | ||
52 | } | ||
53 | } else { | ||
54 | // @ts-ignore | ||
55 | Server.client.logObjectTrace(messageOrDataObject); | ||
56 | } | ||
57 | } | ||
58 | }; | ||
35 | Server.client.onReady().then(() => { | 59 | Server.client.onReady().then(() => { |
36 | for (const [type, handler] of notificationHandlers) { | 60 | for (const [type, handler] of notificationHandlers) { |
37 | Server.client.onNotification(type, handler); | 61 | Server.client.onNotification(type, handler); |