diff --git a/extensions/typescript/src/utils/api.ts b/extensions/typescript/src/utils/api.ts index 6e13c01a574..5b2e98f7372 100644 --- a/extensions/typescript/src/utils/api.ts +++ b/extensions/typescript/src/utils/api.ts @@ -7,6 +7,9 @@ import * as semver from 'semver'; import * as nls from 'vscode-nls'; const localize = nls.loadMessageBundle(); +import { memoize } from './memoize'; + + export default class API { public static readonly defaultVersion = new API('1.0.0', '1.0.0'); @@ -29,50 +32,62 @@ export default class API { private readonly version: string ) { } + @memoize public has203Features(): boolean { return semver.gte(this.version, '2.0.3'); } + @memoize public has206Features(): boolean { return semver.gte(this.version, '2.0.6'); } + @memoize public has208Features(): boolean { return semver.gte(this.version, '2.0.8'); } + @memoize public has213Features(): boolean { return semver.gte(this.version, '2.1.3'); } + @memoize public has220Features(): boolean { return semver.gte(this.version, '2.2.0'); } + @memoize public has222Features(): boolean { return semver.gte(this.version, '2.2.2'); } + @memoize public has230Features(): boolean { return semver.gte(this.version, '2.3.0'); } + @memoize public has234Features(): boolean { return semver.gte(this.version, '2.3.4'); } + @memoize public has240Features(): boolean { return semver.gte(this.version, '2.4.0'); } + @memoize public has250Features(): boolean { return semver.gte(this.version, '2.5.0'); } + @memoize public has260Features(): boolean { return semver.gte(this.version, '2.6.0'); } + @memoize public has262Features(): boolean { return semver.gte(this.version, '2.6.2'); } diff --git a/extensions/typescript/src/utils/memoize.ts b/extensions/typescript/src/utils/memoize.ts new file mode 100644 index 00000000000..beeb0035b89 --- /dev/null +++ b/extensions/typescript/src/utils/memoize.ts @@ -0,0 +1,34 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +export function memoize(_target: any, key: string, descriptor: any) { + let fnKey: string | undefined = undefined; + let fn: Function | undefined = undefined; + + if (typeof descriptor.value === 'function') { + fnKey = 'value'; + fn = descriptor.value; + } else if (typeof descriptor.get === 'function') { + fnKey = 'get'; + fn = descriptor.get; + } else { + throw new Error('not supported'); + } + + const memoizeKey = `$memoize$${key}`; + + descriptor[fnKey] = function (...args: any[]) { + if (!this.hasOwnProperty(memoizeKey)) { + Object.defineProperty(this, memoizeKey, { + configurable: false, + enumerable: false, + writable: false, + value: fn!.apply(this, args) + }); + } + + return this[memoizeKey]; + }; +} diff --git a/extensions/typescript/tsconfig.json b/extensions/typescript/tsconfig.json index 56de6915ae5..e9800fa4b00 100644 --- a/extensions/typescript/tsconfig.json +++ b/extensions/typescript/tsconfig.json @@ -12,7 +12,8 @@ "noUnusedLocals": true, "noUnusedParameters": true, "strict": true, - "alwaysStrict": true + "alwaysStrict": true, + "experimentalDecorators": true }, "include": [ "src/**/*"