diff options
author | veetaha <[email protected]> | 2020-03-23 23:00:57 +0000 |
---|---|---|
committer | veetaha <[email protected]> | 2020-03-23 23:00:57 +0000 |
commit | 65e2d8a0c805431ea8cef0e947a9dfff1c0c78f8 (patch) | |
tree | 6b62d9b372bb9aea84e129584f8c676fce7ddf49 /editors | |
parent | eff1b3fe4d17dcecf0ec9a30c35d6c88715cb8ea (diff) |
vscode: simplify and refactor config
Diffstat (limited to 'editors')
-rw-r--r-- | editors/code/src/config.ts | 106 |
1 files changed, 45 insertions, 61 deletions
diff --git a/editors/code/src/config.ts b/editors/code/src/config.ts index be5296fcf..16ac50a0a 100644 --- a/editors/code/src/config.ts +++ b/editors/code/src/config.ts | |||
@@ -1,29 +1,10 @@ | |||
1 | import * as vscode from 'vscode'; | 1 | import * as vscode from 'vscode'; |
2 | import { log } from "./util"; | 2 | import { log } from "./util"; |
3 | 3 | ||
4 | export interface InlayHintOptions { | ||
5 | typeHints: boolean; | ||
6 | parameterHints: boolean; | ||
7 | maxLength: number | null; | ||
8 | } | ||
9 | |||
10 | export interface CargoWatchOptions { | ||
11 | enable: boolean; | ||
12 | arguments: string[]; | ||
13 | command: string; | ||
14 | allTargets: boolean; | ||
15 | } | ||
16 | |||
17 | export interface CargoFeatures { | ||
18 | noDefaultFeatures: boolean; | ||
19 | allFeatures: boolean; | ||
20 | features: string[]; | ||
21 | loadOutDirsFromCheck: boolean; | ||
22 | } | ||
23 | |||
24 | export type UpdatesChannel = "stable" | "nightly"; | 4 | export type UpdatesChannel = "stable" | "nightly"; |
25 | 5 | ||
26 | export const NIGHTLY_TAG = "nightly"; | 6 | export const NIGHTLY_TAG = "nightly"; |
7 | |||
27 | export class Config { | 8 | export class Config { |
28 | readonly extensionId = "matklad.rust-analyzer"; | 9 | readonly extensionId = "matklad.rust-analyzer"; |
29 | 10 | ||
@@ -50,25 +31,24 @@ export class Config { | |||
50 | .packageJSON | 31 | .packageJSON |
51 | .releaseTag ?? undefined; | 32 | .releaseTag ?? undefined; |
52 | 33 | ||
53 | private cfg!: vscode.WorkspaceConfiguration; | 34 | readonly globalStoragePath: string; |
54 | 35 | ||
55 | constructor(private readonly ctx: vscode.ExtensionContext) { | 36 | constructor(ctx: vscode.ExtensionContext) { |
56 | vscode.workspace.onDidChangeConfiguration(this.onConfigChange, this, ctx.subscriptions); | 37 | this.globalStoragePath = ctx.globalStoragePath; |
57 | this.refreshConfig(); | 38 | vscode.workspace.onDidChangeConfiguration(this.onDidChangeConfiguration, this, ctx.subscriptions); |
39 | this.refreshLogging(); | ||
58 | } | 40 | } |
59 | 41 | ||
60 | private refreshConfig() { | 42 | private refreshLogging() { |
61 | this.cfg = vscode.workspace.getConfiguration(this.rootSection); | 43 | log.setEnabled(this.traceExtension); |
62 | const enableLogging = this.cfg.get("trace.extension") as boolean; | ||
63 | log.setEnabled(enableLogging); | ||
64 | log.debug( | 44 | log.debug( |
65 | "Extension version:", this.packageJsonVersion, | 45 | "Extension version:", this.packageJsonVersion, |
66 | "using configuration:", this.cfg | 46 | "using configuration:", this.cfg |
67 | ); | 47 | ); |
68 | } | 48 | } |
69 | 49 | ||
70 | private async onConfigChange(event: vscode.ConfigurationChangeEvent) { | 50 | private async onDidChangeConfiguration(event: vscode.ConfigurationChangeEvent) { |
71 | this.refreshConfig(); | 51 | this.refreshLogging(); |
72 | 52 | ||
73 | const requiresReloadOpt = this.requiresReloadOpts.find( | 53 | const requiresReloadOpt = this.requiresReloadOpts.find( |
74 | opt => event.affectsConfiguration(opt) | 54 | opt => event.affectsConfiguration(opt) |
@@ -86,49 +66,53 @@ export class Config { | |||
86 | } | 66 | } |
87 | } | 67 | } |
88 | 68 | ||
89 | get globalStoragePath(): string { return this.ctx.globalStoragePath; } | ||
90 | |||
91 | // We don't do runtime config validation here for simplicity. More on stackoverflow: | 69 | // We don't do runtime config validation here for simplicity. More on stackoverflow: |
92 | // https://stackoverflow.com/questions/60135780/what-is-the-best-way-to-type-check-the-configuration-for-vscode-extension | 70 | // https://stackoverflow.com/questions/60135780/what-is-the-best-way-to-type-check-the-configuration-for-vscode-extension |
93 | 71 | ||
94 | get serverPath() { return this.cfg.get("serverPath") as null | string; } | 72 | private get cfg(): vscode.WorkspaceConfiguration { |
95 | get channel() { return this.cfg.get<"stable" | "nightly">("updates.channel")!; } | 73 | return vscode.workspace.getConfiguration(this.rootSection); |
96 | get askBeforeDownload() { return this.cfg.get("updates.askBeforeDownload") as boolean; } | 74 | } |
97 | get highlightingSemanticTokens() { return this.cfg.get("highlighting.semanticTokens") as boolean; } | 75 | |
98 | get highlightingOn() { return this.cfg.get("highlightingOn") as boolean; } | 76 | get serverPath() { return this.cfg.get<null | string>("serverPath")!; } |
99 | get rainbowHighlightingOn() { return this.cfg.get("rainbowHighlightingOn") as boolean; } | 77 | get channel() { return this.cfg.get<UpdatesChannel>("updates.channel")!; } |
100 | get lruCapacity() { return this.cfg.get("lruCapacity") as null | number; } | 78 | get askBeforeDownload() { return this.cfg.get<boolean>("updates.askBeforeDownload")!; } |
101 | get inlayHints(): InlayHintOptions { | 79 | get highlightingSemanticTokens() { return this.cfg.get<boolean>("highlighting.semanticTokens")!; } |
80 | get highlightingOn() { return this.cfg.get<boolean>("highlightingOn")!; } | ||
81 | get rainbowHighlightingOn() { return this.cfg.get<boolean>("rainbowHighlightingOn")!; } | ||
82 | get lruCapacity() { return this.cfg.get<null | number>("lruCapacity")!; } | ||
83 | get excludeGlobs() { return this.cfg.get<string[]>("excludeGlobs")!; } | ||
84 | get useClientWatching() { return this.cfg.get<boolean>("useClientWatching")!; } | ||
85 | get featureFlags() { return this.cfg.get<Record<string, boolean>>("featureFlags")!; } | ||
86 | get rustfmtArgs() { return this.cfg.get<string[]>("rustfmtArgs")!; } | ||
87 | get loadOutDirsFromCheck() { return this.cfg.get<boolean>("loadOutDirsFromCheck")!; } | ||
88 | get traceExtension() { return this.cfg.get<boolean>("trace.extension")!; } | ||
89 | |||
90 | // for internal use | ||
91 | get withSysroot() { return this.cfg.get<boolean>("withSysroot", true)!; } | ||
92 | |||
93 | get inlayHints() { | ||
102 | return { | 94 | return { |
103 | typeHints: this.cfg.get("inlayHints.typeHints") as boolean, | 95 | typeHints: this.cfg.get<boolean>("inlayHints.typeHints")!, |
104 | parameterHints: this.cfg.get("inlayHints.parameterHints") as boolean, | 96 | parameterHints: this.cfg.get<boolean>("inlayHints.parameterHints")!, |
105 | maxLength: this.cfg.get("inlayHints.maxLength") as null | number, | 97 | maxLength: this.cfg.get<null | number>("inlayHints.maxLength")!, |
106 | }; | 98 | }; |
107 | } | 99 | } |
108 | get excludeGlobs() { return this.cfg.get("excludeGlobs") as string[]; } | ||
109 | get useClientWatching() { return this.cfg.get("useClientWatching") as boolean; } | ||
110 | get featureFlags() { return this.cfg.get("featureFlags") as Record<string, boolean>; } | ||
111 | get rustfmtArgs() { return this.cfg.get("rustfmtArgs") as string[]; } | ||
112 | get loadOutDirsFromCheck() { return this.cfg.get("loadOutDirsFromCheck") as boolean; } | ||
113 | 100 | ||
114 | get cargoWatchOptions(): CargoWatchOptions { | 101 | get cargoWatchOptions() { |
115 | return { | 102 | return { |
116 | enable: this.cfg.get("cargo-watch.enable") as boolean, | 103 | enable: this.cfg.get<boolean>("cargo-watch.enable")!, |
117 | arguments: this.cfg.get("cargo-watch.arguments") as string[], | 104 | arguments: this.cfg.get<string[]>("cargo-watch.arguments")!, |
118 | allTargets: this.cfg.get("cargo-watch.allTargets") as boolean, | 105 | allTargets: this.cfg.get<boolean>("cargo-watch.allTargets")!, |
119 | command: this.cfg.get("cargo-watch.command") as string, | 106 | command: this.cfg.get<string>("cargo-watch.command")!, |
120 | }; | 107 | }; |
121 | } | 108 | } |
122 | 109 | ||
123 | get cargoFeatures(): CargoFeatures { | 110 | get cargoFeatures() { |
124 | return { | 111 | return { |
125 | noDefaultFeatures: this.cfg.get("cargoFeatures.noDefaultFeatures") as boolean, | 112 | noDefaultFeatures: this.cfg.get<boolean>("cargoFeatures.noDefaultFeatures")!, |
126 | allFeatures: this.cfg.get("cargoFeatures.allFeatures") as boolean, | 113 | allFeatures: this.cfg.get<boolean>("cargoFeatures.allFeatures")!, |
127 | features: this.cfg.get("cargoFeatures.features") as string[], | 114 | features: this.cfg.get<string[]>("cargoFeatures.features")!, |
128 | loadOutDirsFromCheck: this.cfg.get("cargoFeatures.loadOutDirsFromCheck") as boolean, | 115 | loadOutDirsFromCheck: this.cfg.get<boolean>("cargoFeatures.loadOutDirsFromCheck")!, |
129 | }; | 116 | }; |
130 | } | 117 | } |
131 | |||
132 | // for internal use | ||
133 | get withSysroot() { return this.cfg.get("withSysroot", true) as boolean; } | ||
134 | } | 118 | } |