Skip to content

Commit

Permalink
Merge pull request #187 from zardoy/develop
Browse files Browse the repository at this point in the history
  • Loading branch information
zardoy authored Nov 28, 2023
2 parents 52cb94f + d18c985 commit 8338336
Show file tree
Hide file tree
Showing 10 changed files with 96 additions and 7 deletions.
4 changes: 4 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,10 @@
{
"command": "printPerformanceMemoryInfo",
"title": "Print Performance & Memory Info"
},
{
"command": "migrateRequireToImports",
"title": "Migrate Require to Imports"
}
],
"keybindings": [
Expand Down
6 changes: 6 additions & 0 deletions src/configurationType.ts
Original file line number Diff line number Diff line change
Expand Up @@ -582,6 +582,12 @@ export type Configuration = {
* @default false
*/
'experiments.enableInsertNameOfSuggestionFix': boolean
/**
* Speed up JSX linked editing by not using actual tsserver command when possible, which in theory may introduce some inconsistencies.
* Note that currently it doesn't really help if you have `"typescript.tsserver.useSyntaxServer": "auto"` in the settings.
* @default true
*/
'experiments.speedLinkedEditing': boolean
/**
* Map *symbol - array of modules* to change sorting of imports - first available takes precedence in auto import code fixes (+ import all action)
*
Expand Down
12 changes: 11 additions & 1 deletion src/specialCommands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { compact } from '@zardoy/utils'
import { offsetPosition } from '@zardoy/vscode-utils/build/position'
import { RequestInputTypes, RequestOutputTypes } from '../typescript/src/ipcTypes'
import { sendCommand } from './sendCommand'
import { tsRangeToVscode, tsRangeToVscodeSelection } from './util'
import { tsRangeToVscode, tsRangeToVscodeSelection, tsTextChangesToVscodeTextEdits } from './util'
import { onCompletionAcceptedOverride } from './onCompletionAccepted'

export default () => {
Expand Down Expand Up @@ -309,6 +309,16 @@ export default () => {
console.show(true)
})

registerExtensionCommand('migrateRequireToImports', async () => {
const data = await sendCommand('getMigrateToImportsEdits', {})
if (!data) return
const { document } = vscode.window.activeTextEditor!
const edits = tsTextChangesToVscodeTextEdits(document, data)
const edit = new vscode.WorkspaceEdit()
edit.set(document.uri, edits)
await vscode.workspace.applyEdit(edit)
})

// registerExtensionCommand('insertImportFlatten', () => {
// // got -> default, got
// type A = ts.Type
Expand Down
18 changes: 15 additions & 3 deletions src/vueVolarSupport.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,11 +72,23 @@ export default () => {
const isConfigValueChanged = (settingId: string) => {
if (process.env.PLATFORM !== 'web') {
const config = vscode.workspace.getConfiguration('')
const userValue = config.get<string>(settingId)
if (userValue === config.inspect(settingId)!.defaultValue) return false
let userValue = config.get<string>(settingId)
if (!userValue || userValue === config.inspect(settingId)!.defaultValue) return false
// means that value was set by us programmatically, let's update it
// eslint-disable-next-line @typescript-eslint/no-require-imports
if (userValue?.startsWith(require('path').join(extensionCtx.extensionPath, '../..'))) return false
let extensionsBasePath = require('path').join(extensionCtx.extensionPath, '../..') as string
const normalizePathWin = (path: string) => {
// normalize casing of drive
if (/^[a-z]:/.test(path)) {
path = path[0]!.toUpperCase() + path.slice(1)
}

return path.replace(/\\/g, '/')
}

userValue = normalizePathWin(userValue)
extensionsBasePath = normalizePathWin(extensionsBasePath)
if (userValue.startsWith(extensionsBasePath)) return false
return true
}

Expand Down
2 changes: 1 addition & 1 deletion typescript/src/completions/filterJsxComponents.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ export default (entries: ts.CompletionEntry[], node: ts.Node, position: number,
let shouldBeCached = firstDeclarationFileName.includes('node_modules')
if (!shouldBeCached && firstDeclaration.getSourceFile().fileName === fileName) {
// startMark()
const definitionAtPosition = languageService.getDefinitionAtPosition(fileName, firstDeclaration.pos + 1)?.[0]
const definitionAtPosition = languageService.getDefinitionAtPosition(fileName, firstDeclaration.pos + firstDeclaration.getLeadingTriviaWidth())?.[0]
// addMark('getDefinitionAtPosition')
if (!definitionAtPosition) return
shouldBeCached = definitionAtPosition.fileName.includes('node_modules')
Expand Down
11 changes: 9 additions & 2 deletions typescript/src/decorateEditsForFileRename.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,21 @@ export default (proxy: ts.LanguageService, languageService: ts.LanguageService,
proxy.getEditsForFileRename = (oldFilePath, newFilePath, formatOptions, preferences) => {
let edits = languageService.getEditsForFileRename(oldFilePath, newFilePath, formatOptions, preferences)
if (c('renameImportNameOfFileRename')) {
const predictedNameFromPath = (p: string) => camelCase(p.split(/[/\\]/g).pop()!.replace(/\..+/, ''))
const predictedNameFromPath = (p: string) => {
const input = p.split(/[/\\]/g).pop()!.replace(/\..+/, '')
const transformed = camelCase(input)
// eslint-disable-next-line @typescript-eslint/prefer-optional-chain
const isFirstUppercase = input && input.startsWith(input[0]!.toUpperCase())
return isFirstUppercase ? transformed[0]!.toUpperCase() + transformed.slice(1) : transformed
}
const oldPredictedName = predictedNameFromPath(oldFilePath)
const newPredictedName = predictedNameFromPath(newFilePath)
for (const edit of edits) {
const possiblyAddRename = (identifier: ts.Identifier | undefined) => {
if (identifier?.text !== oldPredictedName) return
const sourceFile = languageService.getProgram()!.getSourceFile(edit.fileName)!
const newRenameEdits = proxy.findRenameLocations(edit.fileName, identifier.pos, false, false, preferences ?? {}) ?? []
const newRenameEdits =
proxy.findRenameLocations(edit.fileName, identifier.pos + identifier.getLeadingTriviaWidth(), false, false, preferences ?? {}) ?? []
if (!newRenameEdits) return
// maybe cancel symbol rename on collision instead?
const newInsertName = tsFull.getUniqueName(newPredictedName, sourceFile as any)
Expand Down
37 changes: 37 additions & 0 deletions typescript/src/decorateLinkedEditing.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { GetConfig } from './types'

export default (proxy: ts.LanguageService, languageService: ts.LanguageService, languageServiceHost: ts.LanguageServiceHost, c: GetConfig) => {
// patch JSX tag linked editing to improve performance (needed for great user experience)

let lastLinkedEditingRangeRequest:
| {
pos: number
fileName: string
result: ts.LinkedEditingInfo
}
| undefined
proxy.getLinkedEditingRangeAtPosition = (fileName, position) => {
if (
c('experiments.speedLinkedEditing') &&
lastLinkedEditingRangeRequest &&
lastLinkedEditingRangeRequest.pos === position - 1 &&
lastLinkedEditingRangeRequest.fileName === fileName
) {
lastLinkedEditingRangeRequest.pos = position
lastLinkedEditingRangeRequest.result.ranges[0]!.length++
lastLinkedEditingRangeRequest.result.ranges[1]!.start++
lastLinkedEditingRangeRequest.result.ranges[1]!.length++
return lastLinkedEditingRangeRequest.result
}
lastLinkedEditingRangeRequest = undefined

const prior = languageService.getLinkedEditingRangeAtPosition(fileName, position)
if (!prior) return
lastLinkedEditingRangeRequest = {
pos: position,
fileName,
result: globalThis.structuredClone(prior),
}
return prior
}
}
2 changes: 2 additions & 0 deletions typescript/src/decorateProxy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import decorateSignatureHelp from './decorateSignatureHelp'
import decorateFindRenameLocations from './decorateFindRenameLocations'
import decorateQuickInfoAtPosition from './decorateQuickInfoAtPosition'
import decorateEditsForFileRename from './decorateEditsForFileRename'
import decorateLinkedEditing from './decorateLinkedEditing'

/** @internal */
export const thisPluginMarker = '__essentialPluginsMarker__'
Expand Down Expand Up @@ -102,6 +103,7 @@ export const decorateLanguageService = (
decorateSignatureHelp(proxy, languageService, languageServiceHost, c)
decorateFindRenameLocations(proxy, languageService, c)
decorateQuickInfoAtPosition(proxy, languageService, languageServiceHost, c)
decorateLinkedEditing(proxy, languageService, languageServiceHost, c)

libDomPatching(languageServiceHost, c)

Expand Down
2 changes: 2 additions & 0 deletions typescript/src/ipcTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ export const triggerCharacterCommands = [
'getLastResolvedCompletion',
'getArgumentReferencesFromCurrentParameter',
'performanceInfo',
'getMigrateToImportsEdits',
] as const

export type TriggerCharacterCommand = (typeof triggerCharacterCommands)[number]
Expand Down Expand Up @@ -115,6 +116,7 @@ export type RequestOutputTypes = {
}
getArgumentReferencesFromCurrentParameter: Array<{ line: number; character: number; filename: string }>
'emmet-completions': EmmetResult
getMigrateToImportsEdits: ts.TextChange[]
}

// export type EmmetResult = {
Expand Down
9 changes: 9 additions & 0 deletions typescript/src/specialCommands/handle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,15 @@ export default (
memoryUsedMb: toMb(process.memoryUsage().heapUsed),
}
}
if (specialCommand === 'getMigrateToImportsEdits') {
const combinedCodeFix = languageService.getCombinedCodeFix(
{ type: 'file', fileName: sourceFile.fileName },
'requireInTs',
ts.getDefaultFormatCodeSettings(),
preferences,
)
return combinedCodeFix.changes[0]?.textChanges
}

return null
}
Expand Down

0 comments on commit 8338336

Please sign in to comment.