Skip to content

Commit 8a11e71

Browse files
committed
feat: add Declare missing attributes snippet codefix
1 parent 25521ac commit 8a11e71

File tree

4 files changed

+49
-3
lines changed

4 files changed

+49
-3
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"name": "ts-essential-plugins",
33
"displayName": "TypeScript Essential Plugins",
4+
"description": "50+ features: TS extension for professionals",
45
"version": "0.0.0-dev",
56
"license": "MIT",
67
"web": true,
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { ExtendedCodeAction } from '../getCodeActions'
2+
3+
const errorCodes = [
4+
// ts.Diagnostics.Property_0_does_not_exist_on_type_1.code,
5+
// ts.Diagnostics.Property_0_does_not_exist_on_type_1_Did_you_mean_2.code,
6+
// ts.Diagnostics.Property_0_is_missing_in_type_1_but_required_in_type_2.code,
7+
// ts.Diagnostics.Type_0_is_missing_the_following_properties_from_type_1_Colon_2.code,
8+
// ts.Diagnostics.Type_0_is_missing_the_following_properties_from_type_1_Colon_2_and_3_more.code,
9+
// // ts.Diagnostics.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1.code,
10+
// // ts.Diagnostics.Cannot_find_name_0.code,
11+
2339, 2551, 2741, 2739, 2740 /* 2345, 2304, */,
12+
]
13+
14+
export default {
15+
codes: errorCodes,
16+
kind: 'quickfix',
17+
title: 'Declare missing attributes',
18+
tryToApply({ sourceFile, node, c, languageService, position, formatOptions, range }) {
19+
// todo maybe cache from prev request?
20+
if (!node) return
21+
const codeFixes = languageService.getCodeFixesAtPosition(
22+
sourceFile.fileName,
23+
node.getStart(),
24+
range?.end ?? node.getStart(),
25+
errorCodes,
26+
formatOptions ?? {},
27+
{},
28+
)
29+
const fix = codeFixes.find(codeFix => codeFix.fixName === 'fixMissingAttributes')
30+
if (fix && fix.changes[0]?.textChanges.length === 1) {
31+
const changes = fix.changes[0]!.textChanges
32+
let i = 1
33+
return {
34+
snippetEdits: [
35+
{
36+
newText: changes[0]!.newText.replaceAll('$', '\\$').replaceAll('={undefined}', () => `={$${i++}}`),
37+
span: fix.changes[0]!.textChanges[0]!.span,
38+
},
39+
],
40+
}
41+
}
42+
return
43+
},
44+
} as ExtendedCodeAction

typescript/src/codeActions/getCodeActions.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { renameParameterToNameFromType, renameAllParametersToNameFromType } from
1111
import addDestructure_1 from './custom/addDestructure/addDestructure'
1212
import fromDestructure_1 from './custom/fromDestructure/fromDestructure'
1313
import fixClosingTagName from './custom/fixClosingTagName'
14+
import declareMissingAttributes from './extended/declareMissingAttributes'
1415

1516
const codeActions: CodeAction[] = [
1617
addDestructure_1,
@@ -22,7 +23,7 @@ const codeActions: CodeAction[] = [
2223
renameAllParametersToNameFromType,
2324
fixClosingTagName,
2425
]
25-
const extendedCodeActions: ExtendedCodeAction[] = [declareMissingProperties]
26+
const extendedCodeActions: ExtendedCodeAction[] = [declareMissingProperties, declareMissingAttributes]
2627

2728
type SimplifiedRefactorInfo =
2829
| {

typescript/src/codeFixes.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,14 +103,14 @@ export default (proxy: ts.LanguageService, languageService: ts.LanguageService,
103103
// #endregion
104104

105105
const semanticDiagnostics = languageService.getSemanticDiagnostics(fileName)
106-
const syntacicDiagnostics = languageService.getSyntacticDiagnostics(fileName)
106+
const syntacticDiagnostics = languageService.getSyntacticDiagnostics(fileName)
107107

108108
// https://github.com/Microsoft/TypeScript/blob/v4.5.5/src/compiler/diagnosticMessages.json#L458
109109
const findDiagnosticByCode = (codes: number[]) => {
110110
const errorCode = codes.find(code => errorCodes.includes(code))
111111
if (!errorCode) return
112112
const diagnosticPredicate = ({ code, start: localStart }) => code === errorCode && localStart === start
113-
return syntacicDiagnostics.find(diagnosticPredicate) || semanticDiagnostics.find(diagnosticPredicate)
113+
return syntacticDiagnostics.find(diagnosticPredicate) || semanticDiagnostics.find(diagnosticPredicate)
114114
}
115115

116116
const wrapBlockDiagnostics = findDiagnosticByCode([1156, 1157])

0 commit comments

Comments
 (0)