From 80b2d4110bc1dd18d06e6fffb7f343af34a132ca Mon Sep 17 00:00:00 2001 From: AdrianWilczynski Date: Sat, 8 Feb 2020 22:06:30 +0100 Subject: [PATCH] Fix key duplication/handle camelcase properties --- .../package/package-lock.json | 2 +- src/VisualStudioCode/package/src/extension.ts | 35 ++++++++++------ .../package/src/omnisharpSettings.ts | 6 +++ .../package/src/test/suite/extension.test.ts | 40 +++++++++++++++++-- 4 files changed, 66 insertions(+), 17 deletions(-) diff --git a/src/VisualStudioCode/package/package-lock.json b/src/VisualStudioCode/package/package-lock.json index 60a010b49c..c02f67414e 100644 --- a/src/VisualStudioCode/package/package-lock.json +++ b/src/VisualStudioCode/package/package-lock.json @@ -1,6 +1,6 @@ { "name": "roslynator", - "version": "2.2.0", + "version": "2.3.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/src/VisualStudioCode/package/src/extension.ts b/src/VisualStudioCode/package/src/extension.ts index bff02a9830..44b3b0db4b 100644 --- a/src/VisualStudioCode/package/src/extension.ts +++ b/src/VisualStudioCode/package/src/extension.ts @@ -3,7 +3,7 @@ import * as os from 'os'; import * as path from 'path'; import * as fs from 'fs'; import * as json5 from 'json5'; -import { OmnisharpSettings } from './omnisharpSettings'; +import { OmnisharpSettingsKey } from './omnisharpSettings'; import { Context } from './context'; export function activate(context: vscode.ExtensionContext) { @@ -29,7 +29,7 @@ export function ensureConfigurationUpdated(context: Context) { const omnisharpJsonPath = path.join(omnisharpDirectoryPath, 'omnisharp.json'); - let omnisharpSettings: OmnisharpSettings; + let omnisharpSettings: any; let settingsUpdated = false; if (fs.existsSync(omnisharpJsonPath)) { @@ -39,17 +39,23 @@ export function ensureConfigurationUpdated(context: Context) { omnisharpSettings = {}; } - if (!omnisharpSettings.RoslynExtensionsOptions || typeof omnisharpSettings.RoslynExtensionsOptions !== 'object') { - omnisharpSettings.RoslynExtensionsOptions = {}; + const roslynExtensionsOptionsKey = findKey(omnisharpSettings, OmnisharpSettingsKey.RoslynExtensionsOptions); + + if (!omnisharpSettings[roslynExtensionsOptionsKey] || typeof omnisharpSettings[roslynExtensionsOptionsKey] !== 'object') { + omnisharpSettings[roslynExtensionsOptionsKey] = {}; } - if (omnisharpSettings.RoslynExtensionsOptions.EnableAnalyzersSupport !== true) { - omnisharpSettings.RoslynExtensionsOptions.EnableAnalyzersSupport = true; + const enableAnalyzersSupportKey = findKey(omnisharpSettings[roslynExtensionsOptionsKey], OmnisharpSettingsKey.EnableAnalyzersSupport); + + if (omnisharpSettings[roslynExtensionsOptionsKey][enableAnalyzersSupportKey] !== true) { + omnisharpSettings[roslynExtensionsOptionsKey][enableAnalyzersSupportKey] = true; settingsUpdated = true; } - if (!Array.isArray(omnisharpSettings.RoslynExtensionsOptions.LocationPaths)) { - omnisharpSettings.RoslynExtensionsOptions.LocationPaths = []; + const locationPathsKey = findKey(omnisharpSettings[roslynExtensionsOptionsKey], OmnisharpSettingsKey.LocationPaths); + + if (!Array.isArray(omnisharpSettings[roslynExtensionsOptionsKey][locationPathsKey])) { + omnisharpSettings[roslynExtensionsOptionsKey][locationPathsKey] = []; } const roslynPath = path.join(context.extensionDirectoryPath, 'roslyn'); @@ -61,13 +67,14 @@ export function ensureConfigurationUpdated(context: Context) { ].map(p => p.replace(/\\/g, '/')); const containsPaths = locationPaths.every( - p => omnisharpSettings.RoslynExtensionsOptions!.LocationPaths!.includes(p)); + p => (omnisharpSettings[roslynExtensionsOptionsKey][locationPathsKey] as any[]).includes(p)); if (!containsPaths) { - const unrelatedPaths = omnisharpSettings.RoslynExtensionsOptions.LocationPaths - .filter(p => !p.includes('josefpihrt-vscode.roslynator') && !locationPaths.includes(p)); + const unrelatedPaths: string[] = (omnisharpSettings[roslynExtensionsOptionsKey][locationPathsKey] as any[]) + .filter(p => typeof p === 'string' + && !p.includes('josefpihrt-vscode.roslynator') && !locationPaths.includes(p)); - omnisharpSettings.RoslynExtensionsOptions.LocationPaths = [ + omnisharpSettings[roslynExtensionsOptionsKey][locationPathsKey] = [ ...unrelatedPaths, ...locationPaths ]; @@ -80,4 +87,8 @@ export function ensureConfigurationUpdated(context: Context) { vscode.window.showInformationMessage('omnisharp.json has been updated with Roslynator configuration.'); } +} + +function findKey(settings: any, key: OmnisharpSettingsKey) { + return Object.keys(settings).find(k => k.toLowerCase() === key.toLowerCase()) ?? key; } \ No newline at end of file diff --git a/src/VisualStudioCode/package/src/omnisharpSettings.ts b/src/VisualStudioCode/package/src/omnisharpSettings.ts index a91824b755..8712a9eeb4 100644 --- a/src/VisualStudioCode/package/src/omnisharpSettings.ts +++ b/src/VisualStudioCode/package/src/omnisharpSettings.ts @@ -3,4 +3,10 @@ export interface OmnisharpSettings { EnableAnalyzersSupport?: boolean; LocationPaths?: string[]; }; +} + +export enum OmnisharpSettingsKey { + RoslynExtensionsOptions = 'RoslynExtensionsOptions', + EnableAnalyzersSupport = 'EnableAnalyzersSupport', + LocationPaths = 'LocationPaths' } \ No newline at end of file diff --git a/src/VisualStudioCode/package/src/test/suite/extension.test.ts b/src/VisualStudioCode/package/src/test/suite/extension.test.ts index 1a90b4a7e7..ba805cef33 100644 --- a/src/VisualStudioCode/package/src/test/suite/extension.test.ts +++ b/src/VisualStudioCode/package/src/test/suite/extension.test.ts @@ -43,10 +43,10 @@ suite('Auto update omnisharp.json', () => { RoslynExtensionsOptions: { EnableAnalyzersSupport: true, LocationPaths: [ - "/temp/home/.vscode/extensions/josefpihrt-vscode.roslynator-1.0.1/roslyn/common", - "/temp/home/.vscode/extensions/josefpihrt-vscode.roslynator-1.0.1/roslyn/analyzers", - "/temp/home/.vscode/extensions/josefpihrt-vscode.roslynator-1.0.1/roslyn/refactorings", - "/temp/home/.vscode/extensions/josefpihrt-vscode.roslynator-1.0.1/roslyn/fixes" + '/temp/home/.vscode/extensions/josefpihrt-vscode.roslynator-1.0.1/roslyn/common', + '/temp/home/.vscode/extensions/josefpihrt-vscode.roslynator-1.0.1/roslyn/analyzers', + '/temp/home/.vscode/extensions/josefpihrt-vscode.roslynator-1.0.1/roslyn/refactorings', + '/temp/home/.vscode/extensions/josefpihrt-vscode.roslynator-1.0.1/roslyn/fixes' ] } }; @@ -66,4 +66,36 @@ suite('Auto update omnisharp.json', () => { assert.ok(omnisharpSettings.RoslynExtensionsOptions?.LocationPaths?.every( p => !p.includes('josefpihrt-vscode.roslynator-1.0.1'))); }); + + test('Handle camel cased properties', () => { + const oldOmnisharpSettings = { + RoslynExtensionsOptions: { + enableAnalyzersSupport: true, + locationPaths: [ + '/path/to/custom/analyzers/' + ] + } + }; + + fs.mkdirSync(omnisharpPath); + fs.writeJSONSync(omnisharpJsonPath, oldOmnisharpSettings); + + roslynator.ensureConfigurationUpdated({ + extensionDirectoryPath: path.join(extensionsPath, 'josefpihrt-vscode.roslynator-1.0.1'), + homeDirectoryPath: homePath + }); + + const omnisharpSettings = fs.readJSONSync(omnisharpJsonPath); + + assert.strictEqual(omnisharpSettings.RoslynExtensionsOptions.LocationPaths, undefined); + assert.strictEqual(omnisharpSettings.RoslynExtensionsOptions.EnableAnalyzersSupport, undefined); + + assert.ok(omnisharpSettings.RoslynExtensionsOptions.enableAnalyzersSupport); + + assert.ok((omnisharpSettings.RoslynExtensionsOptions.locationPaths as string[]) + .includes('/path/to/custom/analyzers/')); + + assert.ok((omnisharpSettings.RoslynExtensionsOptions.locationPaths as string[]) + .some(p => p.includes('josefpihrt-vscode.roslynator-1.0.1'))); + }); }); \ No newline at end of file