Skip to content

Commit 240f2e1

Browse files
committed
refactor: move decoration of getEditsForFileRename to its own file
1 parent c3e78c3 commit 240f2e1

File tree

2 files changed

+51
-46
lines changed

2 files changed

+51
-46
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { camelCase } from 'change-case'
2+
import _ from 'lodash'
3+
import { GetConfig } from './types'
4+
import { approveCast, findChildContainingExactPosition } from './utils'
5+
6+
export default (proxy: ts.LanguageService, languageService: ts.LanguageService, c: GetConfig) => {
7+
proxy.getEditsForFileRename = (oldFilePath, newFilePath, formatOptions, preferences) => {
8+
let edits = languageService.getEditsForFileRename(oldFilePath, newFilePath, formatOptions, preferences)
9+
if (c('renameImportNameOfFileRename')) {
10+
const predictedNameFromPath = (p: string) => camelCase(p.split(/[/\\]/g).pop()!.replace(/\..+/, ''))
11+
const oldPredictedName = predictedNameFromPath(oldFilePath)
12+
const newPredictedName = predictedNameFromPath(newFilePath)
13+
for (const edit of edits) {
14+
const possiblyAddRename = (identifier: ts.Identifier | undefined) => {
15+
if (identifier?.text !== oldPredictedName) return
16+
const sourceFile = languageService.getProgram()!.getSourceFile(edit.fileName)!
17+
const newRenameEdits = proxy.findRenameLocations(edit.fileName, identifier.pos, false, false, preferences ?? {}) ?? []
18+
if (!newRenameEdits) return
19+
// maybe cancel symbol rename on collision instead?
20+
const newInsertName = tsFull.getUniqueName(newPredictedName, sourceFile as any)
21+
const addEdits = Object.entries(_.groupBy(newRenameEdits, ({ fileName }) => fileName)).map(
22+
([fileName, changes]): ts.FileTextChanges => ({
23+
fileName,
24+
textChanges: changes.map(
25+
({ prefixText = '', suffixText = '', textSpan }): ts.TextChange => ({
26+
newText: prefixText + newInsertName + suffixText,
27+
span: textSpan,
28+
}),
29+
),
30+
}),
31+
)
32+
edits = [...edits, ...addEdits]
33+
}
34+
for (const textChange of edit.textChanges) {
35+
const node = findChildContainingExactPosition(languageService.getProgram()!.getSourceFile(edit.fileName)!, textChange.span.start)
36+
if (!node) continue
37+
if (node && ts.isStringLiteral(node) && ts.isImportDeclaration(node.parent) && node.parent.importClause) {
38+
const { importClause } = node.parent
39+
possiblyAddRename(importClause?.name)
40+
if (approveCast(importClause.namedBindings, ts.isNamespaceImport)) {
41+
possiblyAddRename(importClause.namedBindings.name)
42+
}
43+
}
44+
}
45+
}
46+
}
47+
return edits
48+
}
49+
}

typescript/src/decorateProxy.ts

Lines changed: 2 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
import lodashGet from 'lodash.get'
2-
import { camelCase } from 'change-case'
3-
import _ from 'lodash'
42
import { getCompletionsAtPosition, PrevCompletionMap, PrevCompletionsAdditionalData } from './completionsAtPosition'
53
import { RequestOptionsTypes, TriggerCharacterCommand } from './ipcTypes'
64
import { getNavTreeItems } from './getPatchedNavTree'
@@ -17,9 +15,9 @@ import decorateWorkspaceSymbolSearch from './workspaceSymbolSearch'
1715
import decorateFormatFeatures from './decorateFormatFeatures'
1816
import libDomPatching from './libDomPatching'
1917
import decorateSignatureHelp from './decorateSignatureHelp'
20-
import { approveCast, findChildContainingExactPosition } from './utils'
2118
import decorateFindRenameLocations from './decorateFindRenameLocations'
2219
import decorateQuickInfoAtPosition from './decorateQuickInfoAtPosition'
20+
import decorateEditsForFileRename from './decorateEditsForFileRename'
2321

2422
/** @internal */
2523
export const thisPluginMarker = '__essentialPluginsMarker__'
@@ -47,49 +45,6 @@ export const decorateLanguageService = (
4745
let prevCompletionsMap: PrevCompletionMap
4846
let prevCompletionsAdditionalData: PrevCompletionsAdditionalData
4947

50-
proxy.getEditsForFileRename = (oldFilePath, newFilePath, formatOptions, preferences) => {
51-
let edits = languageService.getEditsForFileRename(oldFilePath, newFilePath, formatOptions, preferences)
52-
if (c('renameImportNameOfFileRename')) {
53-
const predictedNameFromPath = (p: string) => camelCase(p.split(/[/\\]/g).pop()!.replace(/\..+/, ''))
54-
const oldPredictedName = predictedNameFromPath(oldFilePath)
55-
const newPredictedName = predictedNameFromPath(newFilePath)
56-
for (const edit of edits) {
57-
const possiblyAddRename = (identifier: ts.Identifier | undefined) => {
58-
if (identifier?.text !== oldPredictedName) return
59-
const sourceFile = languageService.getProgram()!.getSourceFile(edit.fileName)!
60-
const newRenameEdits = proxy.findRenameLocations(edit.fileName, identifier.pos, false, false, preferences ?? {}) ?? []
61-
if (!newRenameEdits) return
62-
// maybe cancel symbol rename on collision instead?
63-
const newInsertName = tsFull.getUniqueName(newPredictedName, sourceFile as any)
64-
const addEdits = Object.entries(_.groupBy(newRenameEdits, ({ fileName }) => fileName)).map(
65-
([fileName, changes]): ts.FileTextChanges => ({
66-
fileName,
67-
textChanges: changes.map(
68-
({ prefixText = '', suffixText = '', textSpan }): ts.TextChange => ({
69-
newText: prefixText + newInsertName + suffixText,
70-
span: textSpan,
71-
}),
72-
),
73-
}),
74-
)
75-
edits = [...edits, ...addEdits]
76-
}
77-
for (const textChange of edit.textChanges) {
78-
const node = findChildContainingExactPosition(languageService.getProgram()!.getSourceFile(edit.fileName)!, textChange.span.start)
79-
if (!node) continue
80-
if (node && ts.isStringLiteral(node) && ts.isImportDeclaration(node.parent) && node.parent.importClause) {
81-
const { importClause } = node.parent
82-
possiblyAddRename(importClause?.name)
83-
if (approveCast(importClause.namedBindings, ts.isNamespaceImport)) {
84-
possiblyAddRename(importClause.namedBindings.name)
85-
}
86-
}
87-
}
88-
}
89-
}
90-
return edits
91-
}
92-
9348
proxy.getCompletionsAtPosition = (fileName, position, options, formatOptions) => {
9449
if (options?.triggerCharacter && typeof options.triggerCharacter !== 'string') {
9550
return languageService.getCompletionsAtPosition(fileName, position, options)
@@ -134,6 +89,7 @@ export const decorateLanguageService = (
13489

13590
proxy.getCompletionEntryDetails = (...inputArgs) => completionEntryDetails(inputArgs, languageService, prevCompletionsMap, c, prevCompletionsAdditionalData)
13691

92+
decorateEditsForFileRename(proxy, languageService, c)
13793
decorateCodeActions(proxy, languageService, languageServiceHost, c)
13894
decorateCodeFixes(proxy, languageService, languageServiceHost, c)
13995
decorateSemanticDiagnostics(proxy, languageService, languageServiceHost, c)

0 commit comments

Comments
 (0)