aboutsummaryrefslogtreecommitdiff
path: root/editors/code
diff options
context:
space:
mode:
Diffstat (limited to 'editors/code')
-rw-r--r--editors/code/.vscodeignore1
-rw-r--r--editors/code/icon.pngbin0 -> 15341 bytes
-rw-r--r--editors/code/package-lock.json34
-rw-r--r--editors/code/package.json11
-rw-r--r--editors/code/rollup.config.js2
-rw-r--r--editors/code/src/commands/index.ts13
-rw-r--r--editors/code/src/config.ts16
-rw-r--r--editors/code/src/inlay_hints.ts51
-rw-r--r--editors/code/src/main.ts1
-rw-r--r--editors/code/src/status_display.ts36
10 files changed, 103 insertions, 62 deletions
diff --git a/editors/code/.vscodeignore b/editors/code/.vscodeignore
index 9bcd28e61..3d1156d3b 100644
--- a/editors/code/.vscodeignore
+++ b/editors/code/.vscodeignore
@@ -2,3 +2,4 @@
2!out/main.js 2!out/main.js
3!package.json 3!package.json
4!package-lock.json 4!package-lock.json
5!icon.png
diff --git a/editors/code/icon.png b/editors/code/icon.png
new file mode 100644
index 000000000..072090c6f
--- /dev/null
+++ b/editors/code/icon.png
Binary files differ
diff --git a/editors/code/package-lock.json b/editors/code/package-lock.json
index adb01760a..05c57c7ff 100644
--- a/editors/code/package-lock.json
+++ b/editors/code/package-lock.json
@@ -1,6 +1,6 @@
1{ 1{
2 "name": "ra-lsp", 2 "name": "rust-analyzer",
3 "version": "0.0.1", 3 "version": "0.1.0",
4 "lockfileVersion": 1, 4 "lockfileVersion": 1,
5 "requires": true, 5 "requires": true,
6 "dependencies": { 6 "dependencies": {
@@ -889,32 +889,32 @@
889 } 889 }
890 }, 890 },
891 "vscode-jsonrpc": { 891 "vscode-jsonrpc": {
892 "version": "5.0.0-next.5", 892 "version": "5.0.0",
893 "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-5.0.0-next.5.tgz", 893 "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-5.0.0.tgz",
894 "integrity": "sha512-k9akfglxWgr0dtLNscq2uBq48XJwnhf4EaDxn05KQowRwR0DkNML0zeYqFRLtXZe6x5vpL5ppyu4o6GqL+23YQ==" 894 "integrity": "sha512-QeAniC/xTWauVQgyNgEqNJ0Qm/Jw8QySGRQhRFPwb8c4FPp9k6QNgJp0ayXWws5qhdaHkiXkGPlzjOPZFQQKLw=="
895 }, 895 },
896 "vscode-languageclient": { 896 "vscode-languageclient": {
897 "version": "6.0.0-next.9", 897 "version": "6.0.0",
898 "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-6.0.0-next.9.tgz", 898 "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-6.0.0.tgz",
899 "integrity": "sha512-NEpeeFM9FKrrRqlBHXGfwpkhtnjruDz3zfFBP+Cymr10qigAEtE/JsODJsIG/ErGqjh3/JXxu8SUOVTGu5oK+w==", 899 "integrity": "sha512-6MDksAP79GRbcHFsXS6ndo12s0m/h7eNdS/IanRgWxaezqB4a4KzHIHrE0bE+nSFB+snaSToGs1bxnPeKdO5fQ==",
900 "requires": { 900 "requires": {
901 "semver": "^6.3.0", 901 "semver": "^6.3.0",
902 "vscode-languageserver-protocol": "^3.15.0-next.14" 902 "vscode-languageserver-protocol": "^3.15.0"
903 } 903 }
904 }, 904 },
905 "vscode-languageserver-protocol": { 905 "vscode-languageserver-protocol": {
906 "version": "3.15.0-next.14", 906 "version": "3.15.0",
907 "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.15.0-next.14.tgz", 907 "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.15.0.tgz",
908 "integrity": "sha512-xUwwno6Q6RFd2Z2EWV9D3dQlsKPnHyiZMNWq+EC7JJdp2WH1gRlD+KPX4UGRCnJK0WI5omqHV313IESPwRY5xA==", 908 "integrity": "sha512-PZEopQzHR3Lo422HeDxCpGN0sYz+kReO+du3F/AcFT1cCPunoVsDJv7ikEolFRKEn+hEIZiAaIX4yoSZ+ip5Nw==",
909 "requires": { 909 "requires": {
910 "vscode-jsonrpc": "^5.0.0-next.5", 910 "vscode-jsonrpc": "^5.0.0",
911 "vscode-languageserver-types": "^3.15.0-next.9" 911 "vscode-languageserver-types": "3.15.0"
912 } 912 }
913 }, 913 },
914 "vscode-languageserver-types": { 914 "vscode-languageserver-types": {
915 "version": "3.15.0-next.9", 915 "version": "3.15.0",
916 "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.15.0-next.9.tgz", 916 "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.15.0.tgz",
917 "integrity": "sha512-Rl/8qJ6932nrHCdPn+9y0x08uLVQaSLRG+U4JzhyKpWU4eJbVaDRoAcz1Llj7CErJGbPr6kdBvShPy5fRfR+Uw==" 917 "integrity": "sha512-AXteNagMhBWnZ6gNN0UB4HTiD/7TajgfHl6jaM6O7qz3zDJw0H3Jf83w05phihnBRCML+K6Ockh8f8bL0OObPw=="
918 }, 918 },
919 "wrappy": { 919 "wrappy": {
920 "version": "1.0.2", 920 "version": "1.0.2",
diff --git a/editors/code/package.json b/editors/code/package.json
index e7fc314f3..d4c310734 100644
--- a/editors/code/package.json
+++ b/editors/code/package.json
@@ -1,10 +1,11 @@
1{ 1{
2 "name": "ra-lsp", 2 "name": "rust-analyzer",
3 "displayName": "ra-lsp", 3 "displayName": "rust-analyzer",
4 "description": "An alternative rust language server to the RLS", 4 "description": "An alternative rust language server to the RLS",
5 "preview": true, 5 "preview": true,
6 "private": true, 6 "private": true,
7 "version": "0.0.1", 7 "icon": "icon.png",
8 "version": "0.1.0",
8 "publisher": "matklad", 9 "publisher": "matklad",
9 "repository": { 10 "repository": {
10 "url": "https://github.com/matklad/rust-analyzer/" 11 "url": "https://github.com/matklad/rust-analyzer/"
@@ -24,7 +25,7 @@
24 "dependencies": { 25 "dependencies": {
25 "jsonc-parser": "^2.1.0", 26 "jsonc-parser": "^2.1.0",
26 "seedrandom": "^3.0.5", 27 "seedrandom": "^3.0.5",
27 "vscode-languageclient": "^6.0.0-next.9" 28 "vscode-languageclient": "^6.0.0"
28 }, 29 },
29 "devDependencies": { 30 "devDependencies": {
30 "@rollup/plugin-commonjs": "^11.0.0", 31 "@rollup/plugin-commonjs": "^11.0.0",
@@ -227,7 +228,7 @@
227 "rust-analyzer.displayInlayHints": { 228 "rust-analyzer.displayInlayHints": {
228 "type": "boolean", 229 "type": "boolean",
229 "default": true, 230 "default": true,
230 "description": "Display additional type information in the editor" 231 "description": "Display additional type and parameter information in the editor"
231 }, 232 },
232 "rust-analyzer.maxInlayHintLength": { 233 "rust-analyzer.maxInlayHintLength": {
233 "type": "number", 234 "type": "number",
diff --git a/editors/code/rollup.config.js b/editors/code/rollup.config.js
index 14fb9e085..de6a3b2b7 100644
--- a/editors/code/rollup.config.js
+++ b/editors/code/rollup.config.js
@@ -13,7 +13,7 @@ export default {
13 commonjs({ 13 commonjs({
14 namedExports: { 14 namedExports: {
15 // squelch missing import warnings 15 // squelch missing import warnings
16 'vscode-languageclient': ['CreateFile', 'RenameFile', 'ErrorCodes'] 16 'vscode-languageclient': ['CreateFile', 'RenameFile', 'ErrorCodes', 'WorkDoneProgress', 'WorkDoneProgressBegin', 'WorkDoneProgressReport', 'WorkDoneProgressEnd']
17 } 17 }
18 }) 18 })
19 ], 19 ],
diff --git a/editors/code/src/commands/index.ts b/editors/code/src/commands/index.ts
index 9a1697dcb..dc075aa82 100644
--- a/editors/code/src/commands/index.ts
+++ b/editors/code/src/commands/index.ts
@@ -39,6 +39,18 @@ function applySourceChange(ctx: Ctx): Cmd {
39 }; 39 };
40} 40}
41 41
42function selectAndApplySourceChange(ctx: Ctx): Cmd {
43 return async (changes: sourceChange.SourceChange[]) => {
44 if (changes.length === 1) {
45 await sourceChange.applySourceChange(ctx, changes[0]);
46 } else if (changes.length > 0) {
47 const selectedChange = await vscode.window.showQuickPick(changes);
48 if (!selectedChange) return;
49 await sourceChange.applySourceChange(ctx, selectedChange);
50 }
51 };
52}
53
42function reload(ctx: Ctx): Cmd { 54function reload(ctx: Ctx): Cmd {
43 return async () => { 55 return async () => {
44 vscode.window.showInformationMessage('Reloading rust-analyzer...'); 56 vscode.window.showInformationMessage('Reloading rust-analyzer...');
@@ -59,5 +71,6 @@ export {
59 runSingle, 71 runSingle,
60 showReferences, 72 showReferences,
61 applySourceChange, 73 applySourceChange,
74 selectAndApplySourceChange,
62 reload 75 reload
63}; 76};
diff --git a/editors/code/src/config.ts b/editors/code/src/config.ts
index ec2790b63..fc21c8813 100644
--- a/editors/code/src/config.ts
+++ b/editors/code/src/config.ts
@@ -42,6 +42,7 @@ export class Config {
42 42
43 private prevEnhancedTyping: null | boolean = null; 43 private prevEnhancedTyping: null | boolean = null;
44 private prevCargoFeatures: null | CargoFeatures = null; 44 private prevCargoFeatures: null | CargoFeatures = null;
45 private prevCargoWatchOptions: null | CargoWatchOptions = null;
45 46
46 constructor(ctx: vscode.ExtensionContext) { 47 constructor(ctx: vscode.ExtensionContext) {
47 vscode.workspace.onDidChangeConfiguration(_ => this.refresh(), ctx.subscriptions); 48 vscode.workspace.onDidChangeConfiguration(_ => this.refresh(), ctx.subscriptions);
@@ -174,6 +175,21 @@ export class Config {
174 } 175 }
175 this.prevCargoFeatures = { ...this.cargoFeatures }; 176 this.prevCargoFeatures = { ...this.cargoFeatures };
176 177
178 if (this.prevCargoWatchOptions !== null) {
179 const changed =
180 this.cargoWatchOptions.enable !== this.prevCargoWatchOptions.enable ||
181 this.cargoWatchOptions.command !== this.prevCargoWatchOptions.command ||
182 this.cargoWatchOptions.allTargets !== this.prevCargoWatchOptions.allTargets ||
183 this.cargoWatchOptions.arguments.length !== this.prevCargoWatchOptions.arguments.length ||
184 this.cargoWatchOptions.arguments.some(
185 (v, i) => v !== this.prevCargoWatchOptions!.arguments[i],
186 );
187 if (changed) {
188 requireReloadMessage = 'Changing cargo-watch options requires a reload';
189 }
190 }
191 this.prevCargoWatchOptions = { ...this.cargoWatchOptions };
192
177 if (requireReloadMessage !== null) { 193 if (requireReloadMessage !== null) {
178 const reloadAction = 'Reload now'; 194 const reloadAction = 'Reload now';
179 vscode.window 195 vscode.window
diff --git a/editors/code/src/inlay_hints.ts b/editors/code/src/inlay_hints.ts
index 078d18f0f..6357e44f1 100644
--- a/editors/code/src/inlay_hints.ts
+++ b/editors/code/src/inlay_hints.ts
@@ -38,6 +38,12 @@ const typeHintDecorationType = vscode.window.createTextEditorDecorationType({
38 }, 38 },
39}); 39});
40 40
41const parameterHintDecorationType = vscode.window.createTextEditorDecorationType({
42 before: {
43 color: new vscode.ThemeColor('rust_analyzer.inlayHint'),
44 }
45});
46
41class HintsUpdater { 47class HintsUpdater {
42 private pending: Map<string, vscode.CancellationTokenSource> = new Map(); 48 private pending: Map<string, vscode.CancellationTokenSource> = new Map();
43 private ctx: Ctx; 49 private ctx: Ctx;
@@ -55,7 +61,10 @@ class HintsUpdater {
55 if (this.enabled) { 61 if (this.enabled) {
56 await this.refresh(); 62 await this.refresh();
57 } else { 63 } else {
58 this.allEditors.forEach(it => this.setDecorations(it, [])); 64 this.allEditors.forEach(it => {
65 this.setTypeDecorations(it, []);
66 this.setParameterDecorations(it, []);
67 });
59 } 68 }
60 } 69 }
61 70
@@ -68,15 +77,27 @@ class HintsUpdater {
68 private async refreshEditor(editor: vscode.TextEditor): Promise<void> { 77 private async refreshEditor(editor: vscode.TextEditor): Promise<void> {
69 const newHints = await this.queryHints(editor.document.uri.toString()); 78 const newHints = await this.queryHints(editor.document.uri.toString());
70 if (newHints == null) return; 79 if (newHints == null) return;
71 const newDecorations = newHints.map(hint => ({ 80 const newTypeDecorations = newHints.filter(hint => hint.kind === 'TypeHint')
72 range: hint.range, 81 .map(hint => ({
73 renderOptions: { 82 range: hint.range,
74 after: { 83 renderOptions: {
75 contentText: `: ${hint.label}`, 84 after: {
85 contentText: `: ${hint.label}`,
86 },
76 }, 87 },
77 }, 88 }));
78 })); 89 this.setTypeDecorations(editor, newTypeDecorations);
79 this.setDecorations(editor, newDecorations); 90
91 const newParameterDecorations = newHints.filter(hint => hint.kind === 'ParameterHint')
92 .map(hint => ({
93 range: hint.range,
94 renderOptions: {
95 before: {
96 contentText: `${hint.label}: `,
97 },
98 },
99 }));
100 this.setParameterDecorations(editor, newParameterDecorations);
80 } 101 }
81 102
82 private get allEditors(): vscode.TextEditor[] { 103 private get allEditors(): vscode.TextEditor[] {
@@ -85,7 +106,7 @@ class HintsUpdater {
85 ); 106 );
86 } 107 }
87 108
88 private setDecorations( 109 private setTypeDecorations(
89 editor: vscode.TextEditor, 110 editor: vscode.TextEditor,
90 decorations: vscode.DecorationOptions[], 111 decorations: vscode.DecorationOptions[],
91 ) { 112 ) {
@@ -95,6 +116,16 @@ class HintsUpdater {
95 ); 116 );
96 } 117 }
97 118
119 private setParameterDecorations(
120 editor: vscode.TextEditor,
121 decorations: vscode.DecorationOptions[],
122 ) {
123 editor.setDecorations(
124 parameterHintDecorationType,
125 this.enabled ? decorations : [],
126 );
127 }
128
98 private async queryHints(documentUri: string): Promise<InlayHint[] | null> { 129 private async queryHints(documentUri: string): Promise<InlayHint[] | null> {
99 let client = this.ctx.client; 130 let client = this.ctx.client;
100 if (!client) return null; 131 if (!client) return null;
diff --git a/editors/code/src/main.ts b/editors/code/src/main.ts
index 430ad31b4..0494ccf63 100644
--- a/editors/code/src/main.ts
+++ b/editors/code/src/main.ts
@@ -26,6 +26,7 @@ export async function activate(context: vscode.ExtensionContext) {
26 ctx.registerCommand('runSingle', commands.runSingle); 26 ctx.registerCommand('runSingle', commands.runSingle);
27 ctx.registerCommand('showReferences', commands.showReferences); 27 ctx.registerCommand('showReferences', commands.showReferences);
28 ctx.registerCommand('applySourceChange', commands.applySourceChange); 28 ctx.registerCommand('applySourceChange', commands.applySourceChange);
29 ctx.registerCommand('selectAndApplySourceChange', commands.selectAndApplySourceChange);
29 30
30 if (ctx.config.enableEnhancedTyping) { 31 if (ctx.config.enableEnhancedTyping) {
31 ctx.overrideCommand('type', commands.onEnter); 32 ctx.overrideCommand('type', commands.onEnter);
diff --git a/editors/code/src/status_display.ts b/editors/code/src/status_display.ts
index 371a2f3bb..c75fddf9d 100644
--- a/editors/code/src/status_display.ts
+++ b/editors/code/src/status_display.ts
@@ -1,5 +1,7 @@
1import * as vscode from 'vscode'; 1import * as vscode from 'vscode';
2 2
3import { WorkDoneProgress, WorkDoneProgressBegin, WorkDoneProgressReport, WorkDoneProgressEnd } from 'vscode-languageclient';
4
3import { Ctx } from './ctx'; 5import { Ctx } from './ctx';
4 6
5const spinnerFrames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']; 7const spinnerFrames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
@@ -8,7 +10,7 @@ export function activateStatusDisplay(ctx: Ctx) {
8 const statusDisplay = new StatusDisplay(ctx.config.cargoWatchOptions.command); 10 const statusDisplay = new StatusDisplay(ctx.config.cargoWatchOptions.command);
9 ctx.pushCleanup(statusDisplay); 11 ctx.pushCleanup(statusDisplay);
10 ctx.onDidRestart(client => { 12 ctx.onDidRestart(client => {
11 client.onNotification('$/progress', params => statusDisplay.handleProgressNotification(params)); 13 client.onProgress(WorkDoneProgress.type, 'rustAnalyzer/cargoWatcher', params => statusDisplay.handleProgressNotification(params));
12 }); 14 });
13} 15}
14 16
@@ -63,20 +65,15 @@ class StatusDisplay implements vscode.Disposable {
63 this.statusBarItem.dispose(); 65 this.statusBarItem.dispose();
64 } 66 }
65 67
66 handleProgressNotification(params: ProgressParams) { 68 handleProgressNotification(params: WorkDoneProgressBegin | WorkDoneProgressReport | WorkDoneProgressEnd) {
67 const { token, value } = params; 69 switch (params.kind) {
68 if (token !== 'rustAnalyzer/cargoWatcher') {
69 return;
70 }
71
72 switch (value.kind) {
73 case 'begin': 70 case 'begin':
74 this.show(); 71 this.show();
75 break; 72 break;
76 73
77 case 'report': 74 case 'report':
78 if (value.message) { 75 if (params.message) {
79 this.packageName = value.message; 76 this.packageName = params.message;
80 } 77 }
81 break; 78 break;
82 79
@@ -90,22 +87,3 @@ class StatusDisplay implements vscode.Disposable {
90 return spinnerFrames[(this.i = ++this.i % spinnerFrames.length)]; 87 return spinnerFrames[(this.i = ++this.i % spinnerFrames.length)];
91 } 88 }
92} 89}
93
94// FIXME: Replace this once vscode-languageclient is updated to LSP 3.15
95interface ProgressParams {
96 token: string;
97 value: WorkDoneProgress;
98}
99
100enum WorkDoneProgressKind {
101 Begin = 'begin',
102 Report = 'report',
103 End = 'end',
104}
105
106interface WorkDoneProgress {
107 kind: WorkDoneProgressKind;
108 message?: string;
109 cancelable?: boolean;
110 percentage?: string;
111}