Skip to content

Commit 898015c

Browse files
Fix configuration lookups and prefer saving as js/ts (#4054)
1 parent 865c8d0 commit 898015c

3 files changed

Lines changed: 53 additions & 29 deletions

File tree

_extension/src/commands.ts

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ import type {
77
} from "vscode-languageclient";
88

99
import type * as tr from "./telemetryReporting";
10-
import { restartExtHostOnChangeIfNeeded } from "./util";
10+
import {
11+
getExplicitConfigTarget,
12+
restartExtHostOnChangeIfNeeded,
13+
} from "./util";
1114

1215
export function registerEnablementCommands(context: vscode.ExtensionContext, telemetryReporter: tr.TelemetryReporter): void {
1316
context.subscriptions.push(vscode.commands.registerCommand("typescript.native-preview.enable", () => {
@@ -28,34 +31,34 @@ export function registerEnablementCommands(context: vscode.ExtensionContext, tel
2831
* Handles both `js/ts.experimental.useTsgo` and `typescript.experimental.useTsgo`.
2932
*/
3033
export async function updateUseTsgoSetting(enable: boolean): Promise<void> {
31-
const tsConfig = vscode.workspace.getConfiguration("typescript");
3234
const jsTsConfig = vscode.workspace.getConfiguration("js/ts");
35+
const tsConfig = vscode.workspace.getConfiguration("typescript");
3336

34-
const tsTarget = getExplicitConfigTarget(tsConfig, "experimental.useTsgo");
3537
const jsTsTarget = getExplicitConfigTarget(jsTsConfig, "experimental.useTsgo");
38+
const tsTarget = getExplicitConfigTarget(tsConfig, "experimental.useTsgo");
3639

37-
const updates: Thenable<void>[] = [];
38-
if (jsTsTarget !== undefined) {
39-
updates.push(jsTsConfig.update("experimental.useTsgo", enable, jsTsTarget));
40-
}
41-
if (tsTarget !== undefined || jsTsTarget === undefined) {
42-
updates.push(tsConfig.update("experimental.useTsgo", enable, tsTarget ?? vscode.ConfigurationTarget.Global));
43-
}
44-
await Promise.all(updates);
40+
// If any are defined, we'll use the most-specific target,
41+
// but we'll only set it through `js/ts`.
42+
if (jsTsTarget !== undefined || tsTarget !== undefined) {
43+
const updates = [];
4544

46-
await restartExtHostOnChangeIfNeeded();
47-
}
45+
const mostSpecificTarget = Math.max(
46+
jsTsTarget ?? vscode.ConfigurationTarget.Global,
47+
tsTarget ?? vscode.ConfigurationTarget.Global,
48+
);
49+
updates.push(jsTsConfig.update("experimental.useTsgo", enable, mostSpecificTarget));
50+
51+
// If `typescript` had the most-specific target
52+
// (or shared the most-specific target), then
53+
// we'll erase that since we've just set `js/ts` above.
54+
if (tsTarget === mostSpecificTarget) {
55+
updates.push(tsConfig.update("experimental.useTsgo", undefined, mostSpecificTarget));
56+
}
57+
58+
await Promise.all(updates);
59+
}
4860

49-
function getExplicitConfigTarget(
50-
config: vscode.WorkspaceConfiguration,
51-
key: string,
52-
): vscode.ConfigurationTarget | undefined {
53-
const inspection = config.inspect(key);
54-
if (!inspection) return undefined;
55-
if (inspection.workspaceFolderValue !== undefined) return vscode.ConfigurationTarget.WorkspaceFolder;
56-
if (inspection.workspaceValue !== undefined) return vscode.ConfigurationTarget.Workspace;
57-
if (inspection.globalValue !== undefined) return vscode.ConfigurationTarget.Global;
58-
return undefined;
61+
return restartExtHostOnChangeIfNeeded();
5962
}
6063

6164
export const codeLensShowLocationsCommandName = "typescript.native-preview.codeLens.showLocations";

_extension/src/extension.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,11 @@ export async function activate(context: vscode.ExtensionContext): Promise<Extens
9595
"The built-in TypeScript extension is disabled. Sync launch.json with launch.template.json to reenable.",
9696
"OK",
9797
);
98+
return;
9899
}
99100
}
100101
else if (useTsgo === false) {
101-
const settingName = getUseTsgoFalseSetting() ?? "typescript.experimental.useTsgo";
102+
const settingName = getUseTsgoFalseSetting() ?? "js/ts.experimental.useTsgo";
102103
vscode.window.showWarningMessage(
103104
`TypeScript Native Preview is running in development mode with "${settingName}" set to false.`,
104105
"Enable Setting",
@@ -108,6 +109,7 @@ export async function activate(context: vscode.ExtensionContext): Promise<Extens
108109
vscode.commands.executeCommand("typescript.native-preview.enable");
109110
}
110111
});
112+
return;
111113
}
112114
}
113115
else if (useTsgo === false) {

_extension/src/util.ts

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -149,15 +149,34 @@ export async function restartExtHostOnChangeIfNeeded(): Promise<void> {
149149
*
150150
* Each setting key is resolved using standard VS Code precedence (workspace
151151
* folder > workspace > global, with language-specific overrides taking
152-
* priority within each scope). Returns `true` if either resolved value is
153-
* `true`, `false` if either is `false` (and neither is `true`), or
154-
* `undefined` if neither setting has been explicitly configured.
152+
* priority within each scope). When both keys are explicitly configured, the
153+
* value set at the most specific scope wins, and `js/ts` wins over
154+
* `typescript` at the same scope. Returns `undefined` if neither setting has
155+
* been explicitly configured.
155156
*/
156157
export function getUseTsgo(): boolean | undefined {
157158
const tsValue = getExplicitUseTsgo("typescript");
158159
const jsTsValue = getExplicitUseTsgo("js/ts");
159-
if (tsValue === true || jsTsValue === true) return true;
160-
if (tsValue === false || jsTsValue === false) return false;
160+
161+
if (tsValue !== undefined || jsTsValue !== undefined) {
162+
const jsTsTarget = getExplicitConfigTarget(vscode.workspace.getConfiguration("js/ts"), "experimental.useTsgo");
163+
const tsTarget = getExplicitConfigTarget(vscode.workspace.getConfiguration("typescript"), "experimental.useTsgo");
164+
const mostSpecific = Math.max(jsTsTarget ?? vscode.ConfigurationTarget.Global, tsTarget ?? vscode.ConfigurationTarget.Global);
165+
return jsTsTarget === mostSpecific ? jsTsValue : tsValue;
166+
}
167+
168+
return undefined;
169+
}
170+
171+
export function getExplicitConfigTarget(
172+
config: vscode.WorkspaceConfiguration,
173+
key: string,
174+
): vscode.ConfigurationTarget | undefined {
175+
const inspection = config.inspect(key);
176+
if (!inspection) return undefined;
177+
if (inspection.workspaceFolderValue !== undefined) return vscode.ConfigurationTarget.WorkspaceFolder;
178+
if (inspection.workspaceValue !== undefined) return vscode.ConfigurationTarget.Workspace;
179+
if (inspection.globalValue !== undefined) return vscode.ConfigurationTarget.Global;
161180
return undefined;
162181
}
163182

0 commit comments

Comments
 (0)