diff --git a/extensions/typescript-language-features/src/extension.browser.ts b/extensions/typescript-language-features/src/extension.browser.ts index d7ab11db6cd7c..caef08752b59a 100644 --- a/extensions/typescript-language-features/src/extension.browser.ts +++ b/extensions/typescript-language-features/src/extension.browser.ts @@ -21,20 +21,70 @@ import { PluginManager } from './utils/plugins'; class StaticVersionProvider implements ITypeScriptVersionProvider { + private configuration?: TypeScriptServiceConfiguration; + constructor( - private readonly _version: TypeScriptVersion + private readonly _browserVersion: TypeScriptVersion ) { } - updateConfiguration(_configuration: TypeScriptServiceConfiguration): void { - // noop + updateConfiguration(configuration: TypeScriptServiceConfiguration): void { + this.configuration = configuration; + } + + public get defaultVersion(): TypeScriptVersion { + return this.globalVersion || this.bundledVersion; + } + + get bundledVersion() { return this._browserVersion; } + + public get globalVersion(): TypeScriptVersion | undefined { + if (this.configuration?.globalTsdk) { + const globals = this.loadVersionsFromSetting(TypeScriptVersionSource.UserSetting, this.configuration.globalTsdk); + if (globals && globals.length) { + return globals[0]; + } + } + return undefined; } - get defaultVersion() { return this._version; } - get bundledVersion() { return this._version; } + public get localVersion(): TypeScriptVersion | undefined { + const tsdkVersions = this.localTsdkVersions; + if (tsdkVersions && tsdkVersions.length) { + return tsdkVersions[0]; + } + return undefined; + } + + public get localVersions(): TypeScriptVersion[] { + const allVersions = this.localTsdkVersions; + const paths = new Set(); + return allVersions.filter(x => { + if (paths.has(x.path)) { + return false; + } + paths.add(x.path); + return true; + }); + } - readonly globalVersion = undefined; - readonly localVersion = undefined; - readonly localVersions = []; + private get localTsdkVersions(): TypeScriptVersion[] { + const localTsdk = this.configuration?.localTsdk; + return localTsdk ? this.loadVersionsFromSetting(TypeScriptVersionSource.WorkspaceSetting, localTsdk) : []; + } + + private loadVersionsFromSetting(source: TypeScriptVersionSource, tsdkPathSetting: string): TypeScriptVersion[] { + if (tsdkPathSetting.startsWith('https://')) { + const serverPath = vscode.Uri.joinPath(vscode.Uri.parse(tsdkPathSetting), 'tsserver.js'); + return [ + new TypeScriptVersion(source, + serverPath.toString(), + /*DiskTypeScriptVersionProvider.getApiVersion(serverPath)*/ API.fromVersionString('4.4.1'), // TODO: Pull version form URL if possible + tsdkPathSetting) + ]; + } + + return []; + } } export function activate( diff --git a/extensions/typescript-language-features/src/utils/configuration.browser.ts b/extensions/typescript-language-features/src/utils/configuration.browser.ts index 0cd787271952f..d5f434dd829ef 100644 --- a/extensions/typescript-language-features/src/utils/configuration.browser.ts +++ b/extensions/typescript-language-features/src/utils/configuration.browser.ts @@ -2,18 +2,6 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ - -import * as vscode from 'vscode'; import { BaseServiceConfigurationProvider } from './configuration'; -export class BrowserServiceConfigurationProvider extends BaseServiceConfigurationProvider { - - // On browsers, we only support using the built-in TS version - protected extractGlobalTsdk(_configuration: vscode.WorkspaceConfiguration): string | null { - return null; - } - - protected extractLocalTsdk(_configuration: vscode.WorkspaceConfiguration): string | null { - return null; - } -} +export class BrowserServiceConfigurationProvider extends BaseServiceConfigurationProvider { } diff --git a/extensions/typescript-language-features/src/utils/configuration.electron.ts b/extensions/typescript-language-features/src/utils/configuration.electron.ts index 3fdf87993ad5d..2075ca77ba2d1 100644 --- a/extensions/typescript-language-features/src/utils/configuration.electron.ts +++ b/extensions/typescript-language-features/src/utils/configuration.electron.ts @@ -20,19 +20,13 @@ export class ElectronServiceConfigurationProvider extends BaseServiceConfigurati return inspectValue; } - protected extractGlobalTsdk(configuration: vscode.WorkspaceConfiguration): string | null { - const inspect = configuration.inspect('typescript.tsdk'); - if (inspect && typeof inspect.globalValue === 'string') { - return this.fixPathPrefixes(inspect.globalValue); - } - return null; + protected override extractGlobalTsdk(configuration: vscode.WorkspaceConfiguration): string | null { + const result = super.extractGlobalTsdk(configuration); + return result && this.fixPathPrefixes(result); } - protected extractLocalTsdk(configuration: vscode.WorkspaceConfiguration): string | null { - const inspect = configuration.inspect('typescript.tsdk'); - if (inspect && typeof inspect.workspaceValue === 'string') { - return this.fixPathPrefixes(inspect.workspaceValue); - } - return null; + protected override extractLocalTsdk(configuration: vscode.WorkspaceConfiguration): string | null { + const result = super.extractLocalTsdk(configuration); + return result && this.fixPathPrefixes(result); } } diff --git a/extensions/typescript-language-features/src/utils/configuration.ts b/extensions/typescript-language-features/src/utils/configuration.ts index 1249cd5b6ba4d..a1b0ed2a06f03 100644 --- a/extensions/typescript-language-features/src/utils/configuration.ts +++ b/extensions/typescript-language-features/src/utils/configuration.ts @@ -136,8 +136,21 @@ export abstract class BaseServiceConfigurationProvider implements ServiceConfigu }; } - protected abstract extractGlobalTsdk(configuration: vscode.WorkspaceConfiguration): string | null; - protected abstract extractLocalTsdk(configuration: vscode.WorkspaceConfiguration): string | null; + protected extractGlobalTsdk(configuration: vscode.WorkspaceConfiguration): string | null { + const inspect = configuration.inspect('typescript.tsdk'); + if (inspect && typeof inspect.globalValue === 'string') { + return inspect.globalValue; + } + return null; + } + + protected extractLocalTsdk(configuration: vscode.WorkspaceConfiguration): string | null { + const inspect = configuration.inspect('typescript.tsdk'); + if (inspect && typeof inspect.workspaceValue === 'string') { + return inspect.workspaceValue; + } + return null; + } protected readTsServerLogLevel(configuration: vscode.WorkspaceConfiguration): TsServerLogLevel { const setting = configuration.get('typescript.tsserver.log', 'off');