Skip to content

Commit f0978f6

Browse files
authored
Merge pull request #102 from zardoy/language-settings
2 parents 22f43df + 37e80f9 commit f0978f6

File tree

7 files changed

+75
-18
lines changed

7 files changed

+75
-18
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@
142142
"@zardoy/utils": "^0.0.9",
143143
"@zardoy/vscode-utils": "^0.0.47",
144144
"chai": "^4.3.6",
145+
"change-case": "^4.1.2",
145146
"chokidar": "^3.5.3",
146147
"chokidar-cli": "^3.0.0",
147148
"delay": "^5.0.0",

pnpm-lock.yaml

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/extension.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { defaultJsSupersetLangs } from '@zardoy/vscode-utils/build/langs'
44
import { extensionCtx, getExtensionSetting, getExtensionSettingId } from 'vscode-framework'
55
import { pickObj } from '@zardoy/utils'
66
import { watchExtensionSettings } from '@zardoy/vscode-utils/build/settings'
7-
import { Configuration } from './configurationType'
87
import webImports from './webImports'
98
import { sendCommand } from './sendCommand'
109
import { registerEmmet } from './emmet'
@@ -15,6 +14,7 @@ import onCompletionAccepted from './onCompletionAccepted'
1514
import specialCommands from './specialCommands'
1615
import vueVolarSupport from './vueVolarSupport'
1716
import moreCompletions from './moreCompletions'
17+
import { mergeSettingsFromScopes } from './mergeSettings'
1818

1919
let isActivated = false
2020
// let erroredStatusBarItem: vscode.StatusBarItem | undefined
@@ -27,7 +27,9 @@ export const activateTsPlugin = (tsApi: { configurePlugin; onCompletionAccepted
2727
const syncConfig = () => {
2828
if (!tsApi) return
2929
console.log('sending configure request for typescript-essential-plugins')
30-
const config: any = vscode.workspace.getConfiguration().get(process.env.IDS_PREFIX!)
30+
const config: any = { ...vscode.workspace.getConfiguration().get(process.env.IDS_PREFIX!) }
31+
// todo implement language-specific settings
32+
mergeSettingsFromScopes(config, 'typescript', extensionCtx.extension.packageJSON)
3133

3234
tsApi.configurePlugin('typescript-essential-plugins', config)
3335

src/mergeSettings.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import * as vscode from 'vscode'
2+
import lodash from 'lodash'
3+
import { getExtensionContributionsPrefix } from 'vscode-framework'
4+
import { Configuration } from './configurationType'
5+
6+
const settingsToIgnore = [] as Array<keyof Configuration>
7+
8+
export const mergeSettingsFromScopes = (
9+
settings: Record<string, any>,
10+
language: string,
11+
packageJson: { contributes: { configuration: { properties: Record<string, any> } } },
12+
) => {
13+
const {
14+
contributes: {
15+
configuration: { properties },
16+
},
17+
} = packageJson
18+
for (const [fullKey, item] of Object.entries(properties)) {
19+
const key = fullKey.slice(getExtensionContributionsPrefix().length)
20+
const isObject = item.type === 'object'
21+
if ((!isObject && item.type !== 'array') || settingsToIgnore.includes(key as keyof Configuration)) {
22+
continue
23+
}
24+
25+
const value = getConfigValueFromAllScopes(key as keyof Configuration, language, isObject ? 'object' : 'array')
26+
lodash.set(settings, key, value)
27+
}
28+
}
29+
30+
const getConfigValueFromAllScopes = <T extends keyof Configuration>(configKey: T, language: string, type: 'array' | 'object'): Configuration[T] => {
31+
const values = { ...vscode.workspace.getConfiguration(process.env.IDS_PREFIX, { languageId: language }).inspect<any[]>(configKey)! }
32+
const userValueKeys = Object.keys(values).filter(key => key.endsWith('Value') && !key.startsWith('default'))
33+
for (const key of userValueKeys) {
34+
if (values[key] !== undefined) {
35+
continue
36+
}
37+
38+
values[key] = type === 'array' ? [] : {}
39+
}
40+
41+
return type === 'array' ? userValueKeys.flatMap(key => values[key]) : Object.assign({}, ...userValueKeys.map(key => values[key]))
42+
}

typescript/src/codeFixes.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,8 @@ export default (proxy: ts.LanguageService, languageService: ts.LanguageService,
222222
formatOptions,
223223
diagnostic.start!,
224224
firstFix.symbolName,
225+
undefined,
226+
true,
225227
)
226228
if (namespaceImportAction) {
227229
fixes = []

typescript/src/namespaceAutoImports.ts

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { parseIgnoreSpec, findIndexOfAutoImportSpec } from './adjustAutoImports'
22
import { GetConfig } from './types'
33
import { getChangesTracker } from './utils'
4+
import { camelCase } from 'change-case'
45

56
export default (
67
c: GetConfig,
@@ -11,6 +12,7 @@ export default (
1112
position: number,
1213
symbolName: string,
1314
entryDetailsPrior?: ts.CompletionEntryDetails,
15+
skipCreatingImport = false,
1416
) => {
1517
const changeToNamespaceImport = Object.entries(c('autoImport.changeToNamespaceImport')).map(([key, value]) => {
1618
return [parseIgnoreSpec(key), value] as const
@@ -36,7 +38,7 @@ export default (
3638
}
3739

3840
const { module } = changeToNamespaceImport[indexOfAutoImportSpec]![0]
39-
const { namespace = module, addImport = true, useDefaultImport } = changeToNamespaceImport[indexOfAutoImportSpec]![1]
41+
const { namespace = camelCase(module), addImport = true, useDefaultImport } = changeToNamespaceImport[indexOfAutoImportSpec]![1]
4042
const textChanges = [
4143
{
4244
newText: `${namespace}.`,
@@ -47,19 +49,22 @@ export default (
4749
},
4850
] as ts.TextChange[]
4951
if (!addImport) return { textChanges, description: `Change to '${namespace}.${symbolName}'` }
50-
const { factory } = ts
51-
const namespaceIdentifier = factory.createIdentifier(namespace)
52-
const importDeclaration = factory.createImportDeclaration(
53-
/*modifiers*/ undefined,
54-
useDefaultImport
55-
? factory.createImportClause(false, namespaceIdentifier, undefined)
56-
: factory.createImportClause(false, undefined, factory.createNamespaceImport(namespaceIdentifier)),
57-
factory.createStringLiteral(importPath, preferences.quotePreference === 'single'),
58-
)
59-
const changeTracker = getChangesTracker(formatOptions)
60-
// todo respect sorting?
61-
changeTracker.insertNodeAtTopOfFile(sourceFile as any, importDeclaration as any, true)
62-
const changes = changeTracker.getChanges()
63-
const { textChanges: importTextChanges } = changes[0]!
64-
return { textChanges: [...importTextChanges, ...textChanges], description: `+ ${importTextChanges[0]!.newText}`, namespace, useDefaultImport }
52+
if (!skipCreatingImport) {
53+
const { factory } = ts
54+
const namespaceIdentifier = factory.createIdentifier(namespace)
55+
const importDeclaration = factory.createImportDeclaration(
56+
/*modifiers*/ undefined,
57+
useDefaultImport
58+
? factory.createImportClause(false, namespaceIdentifier, undefined)
59+
: factory.createImportClause(false, undefined, factory.createNamespaceImport(namespaceIdentifier)),
60+
factory.createStringLiteral(importPath, preferences.quotePreference === 'single'),
61+
)
62+
const changeTracker = getChangesTracker(formatOptions)
63+
// todo respect sorting?
64+
changeTracker.insertNodeAtTopOfFile(sourceFile as any, importDeclaration as any, true)
65+
const changes = changeTracker.getChanges()
66+
const { textChanges: importTextChanges } = changes[0]!
67+
textChanges.unshift(...importTextChanges)
68+
}
69+
return { textChanges, description: `Add namespace import from '${importPath}'`, namespace, useDefaultImport }
6570
}

typescript/src/volarConfig.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ const plugin = (context => {
2121
// todo support vue-specific settings
2222
const originalLsMethods = { ...typescript.languageService }
2323

24+
configurationHost.getConfiguration<any>('[vue]').then(_configuration => {
25+
console.log('_configuration', _configuration)
26+
})
2427
configurationHost.getConfiguration<any>('tsEssentialPlugins').then(_configuration => {
2528
// if (typescript.languageService[thisPluginMarker]) return
2629
const config = patchConfig(_configuration)

0 commit comments

Comments
 (0)