Skip to content

Commit d23f029

Browse files
committed
fix: adopt import all codefix patching for ts5.0
1 parent 1914d7f commit d23f029

File tree

1 file changed

+33
-23
lines changed

1 file changed

+33
-23
lines changed

typescript/src/codeFixes.ts

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import _ from 'lodash'
22
import addMissingProperties from './codeFixes/addMissingProperties'
33
import { changeSortingOfAutoImport, getIgnoreAutoImportSetting, isAutoImportEntryShouldBeIgnored } from './adjustAutoImports'
44
import { GetConfig } from './types'
5-
import { findChildContainingPosition, getIndentFromPos } from './utils'
5+
import { findChildContainingPosition, getIndentFromPos, patchMethod } from './utils'
66

77
// codeFixes that I managed to put in files
88
const externalCodeFixes = [addMissingProperties]
@@ -166,31 +166,41 @@ export default (proxy: ts.LanguageService, languageService: ts.LanguageService,
166166
const ignoreAutoImportsSetting = getIgnoreAutoImportSetting(c)
167167
for (const diagnostic of semanticDiagnostics) {
168168
if (!errorCodes.includes(diagnostic.code)) continue
169-
const oldFirst = tsFull.first
170-
const oldForEachExternalModuleToImportFrom = tsFull.forEachExternalModuleToImportFrom
169+
const toUnpatch: (() => any)[] = []
171170
try {
172-
tsFull.first = ((fixes: FixInfo[]) => {
173-
const sortFn = changeSortingOfAutoImport(c, fixes[0]!.symbolName)
174-
fixes = _.sortBy(
175-
fixes.filter(({ fix, symbolName }) => {
176-
if (fix.kind === (ImportFixKind.PromoteTypeOnly as number)) return false
177-
const shouldBeIgnored =
178-
c('autoImport.alwaysIgnoreInImportAll').includes(fix.moduleSpecifier) ||
179-
isAutoImportEntryShouldBeIgnored(ignoreAutoImportsSetting, fix.moduleSpecifier, symbolName)
180-
return !shouldBeIgnored
181-
}),
182-
({ fix }) => sortFn(fix.moduleSpecifier),
183-
)
184-
return fixes[0]
185-
}) as any
186-
// patching is fun
187-
tsFull.forEachExternalModuleToImportFrom = (program, host, preferences, _useAutoImportProvider, cb) => {
188-
return oldForEachExternalModuleToImportFrom(program, host, preferences, true, cb)
189-
}
171+
toUnpatch.push(
172+
patchMethod(
173+
tsFull,
174+
'first',
175+
() =>
176+
((fixes: FixInfo[]) => {
177+
const sortFn = changeSortingOfAutoImport(c, fixes[0]!.symbolName)
178+
fixes = _.sortBy(
179+
fixes.filter(({ fix, symbolName }) => {
180+
if (fix.kind === (ImportFixKind.PromoteTypeOnly as number)) return false
181+
const shouldBeIgnored =
182+
c('autoImport.alwaysIgnoreInImportAll').includes(fix.moduleSpecifier) ||
183+
isAutoImportEntryShouldBeIgnored(ignoreAutoImportsSetting, fix.moduleSpecifier, symbolName)
184+
return !shouldBeIgnored
185+
}),
186+
({ fix }) => sortFn(fix.moduleSpecifier),
187+
)
188+
return fixes[0]
189+
}) as any,
190+
),
191+
patchMethod(
192+
tsFull,
193+
'forEachExternalModuleToImportFrom',
194+
oldForEachExternalModuleToImportFrom => (program, host, preferences, _useAutoImportProvider, cb) => {
195+
return oldForEachExternalModuleToImportFrom(program, host, preferences, true, cb)
196+
},
197+
),
198+
)
190199
importAdder.addImportFromDiagnostic({ ...diagnostic, file: sourceFile as any } as any, context)
191200
} finally {
192-
tsFull.first = oldFirst
193-
tsFull.forEachExternalModuleToImportFrom = oldForEachExternalModuleToImportFrom
201+
for (const unpatch of toUnpatch) {
202+
unpatch()
203+
}
194204
}
195205
}
196206
return tsFull.codefix.createCombinedCodeActions(tsFull.textChanges.ChangeTracker.with(context, importAdder.writeFixes))

0 commit comments

Comments
 (0)