Skip to content

Commit 91571f0

Browse files
committed
Add support for handeling .js file correctelly in fixAddMissingMember code fix
1 parent 65da012 commit 91571f0

File tree

2 files changed

+57
-30
lines changed

2 files changed

+57
-30
lines changed

src/compiler/diagnosticMessages.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3351,6 +3351,11 @@
33513351
"category": "Message",
33523352
"code": 90017
33533353
},
3354+
"Initialize property '{0}' in the constructor.": {
3355+
"category": "Message",
3356+
"code": 90018
3357+
},
3358+
33543359
"Octal literal types must use ES2015 syntax. Use the syntax '{0}'.": {
33553360
"category": "Error",
33563361
"code": 8017

src/services/codefixes/fixAddMissingMember.ts

Lines changed: 52 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -23,45 +23,67 @@ namespace ts.codefix {
2323
return undefined;
2424
}
2525

26-
if (!(token.parent && token.parent.kind === SyntaxKind.PropertyAccessExpression)) {
26+
if (!isPropertyAccessExpression(token.parent) || token.parent.expression.kind !== SyntaxKind.ThisKeyword) {
2727
return undefined;
2828
}
2929

30-
if ((token.parent as PropertyAccessExpression).expression.kind !== SyntaxKind.ThisKeyword) {
31-
return undefined;
32-
}
30+
return isInJavaScriptFile(sourceFile) ? getActionsForAddMissingMemberInJavaScriptFile() : getActionsForAddMissingMemberInTypeScriptFile();
3331

34-
let typeString = "any";
3532

36-
if (token.parent.parent.kind === SyntaxKind.BinaryExpression) {
37-
const binaryExpression = token.parent.parent as BinaryExpression;
33+
function getActionsForAddMissingMemberInTypeScriptFile(): CodeAction[] | undefined {
34+
let typeString = "any";
3835

39-
const checker = context.program.getTypeChecker();
40-
const widenedType = checker.getWidenedType(checker.getBaseTypeOfLiteralType(checker.getTypeAtLocation(binaryExpression.right)));
41-
typeString = checker.typeToString(widenedType);
42-
}
36+
if (token.parent.parent.kind === SyntaxKind.BinaryExpression) {
37+
const binaryExpression = token.parent.parent as BinaryExpression;
4338

44-
const startPos = classDeclaration.members.pos;
39+
const checker = context.program.getTypeChecker();
40+
const widenedType = checker.getWidenedType(checker.getBaseTypeOfLiteralType(checker.getTypeAtLocation(binaryExpression.right)));
41+
typeString = checker.typeToString(widenedType);
42+
}
4543

46-
return [{
47-
description: formatStringFromArgs(getLocaleSpecificMessage(Diagnostics.Add_declaration_for_missing_property_0), [token.getText()]),
48-
changes: [{
49-
fileName: sourceFile.fileName,
50-
textChanges: [{
51-
span: { start: startPos, length: 0 },
52-
newText: `${token.getFullText(sourceFile)}: ${typeString};`
44+
const startPos = classDeclaration.members.pos;
45+
46+
return [{
47+
description: formatStringFromArgs(getLocaleSpecificMessage(Diagnostics.Add_declaration_for_missing_property_0), [token.getText()]),
48+
changes: [{
49+
fileName: sourceFile.fileName,
50+
textChanges: [{
51+
span: { start: startPos, length: 0 },
52+
newText: `${token.getFullText(sourceFile)}: ${typeString};`
53+
}]
54+
}]
55+
},
56+
{
57+
description: formatStringFromArgs(getLocaleSpecificMessage(Diagnostics.Add_index_signature_for_missing_property_0), [token.getText()]),
58+
changes: [{
59+
fileName: sourceFile.fileName,
60+
textChanges: [{
61+
span: { start: startPos, length: 0 },
62+
newText: `[name: string]: ${typeString};`
63+
}]
5364
}]
54-
}]
55-
},
56-
{
57-
description: formatStringFromArgs(getLocaleSpecificMessage(Diagnostics.Add_index_signature_for_missing_property_0), [token.getText()]),
58-
changes: [{
59-
fileName: sourceFile.fileName,
60-
textChanges: [{
61-
span: { start: startPos, length: 0 },
62-
newText: `[name: string]: ${typeString};`
65+
}];
66+
}
67+
68+
function getActionsForAddMissingMemberInJavaScriptFile(): CodeAction[] | undefined {
69+
const classConstructor = getFirstConstructorWithBody(classDeclaration);
70+
if (!classConstructor) {
71+
return undefined;
72+
}
73+
74+
const memberName = token.getText();
75+
const startPos = classConstructor.body.getEnd() - 1;
76+
77+
return [{
78+
description: formatStringFromArgs(getLocaleSpecificMessage(Diagnostics.Initialize_property_0_in_the_constructor), [memberName]),
79+
changes: [{
80+
fileName: sourceFile.fileName,
81+
textChanges: [{
82+
span: { start: startPos, length: 0 },
83+
newText: `this.${memberName} = undefined;`
84+
}]
6385
}]
64-
}]
65-
}];
86+
}];
87+
}
6688
}
6789
}

0 commit comments

Comments
 (0)