Skip to content

Commit a66b0ae

Browse files
committed
Split CodeFixes in Separate Files
1 parent ecc029f commit a66b0ae

10 files changed

Lines changed: 275 additions & 256 deletions

Jakefile.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ var servicesSources = [
149149
"signatureHelp.ts",
150150
"symbolDisplay.ts",
151151
"transpile.ts",
152+
// Formatting
152153
"formatting/formatting.ts",
153154
"formatting/formattingContext.ts",
154155
"formatting/formattingRequestKind.ts",
@@ -164,7 +165,15 @@ var servicesSources = [
164165
"formatting/rulesMap.ts",
165166
"formatting/rulesProvider.ts",
166167
"formatting/smartIndenter.ts",
167-
"formatting/tokenRange.ts"
168+
"formatting/tokenRange.ts",
169+
// CodeFixes
170+
"codeFixes/codeFixProvider.ts",
171+
"codeFixes/fixes.ts",
172+
"codeFixes/fixExtendsInterfaceBecomesImplements.ts",
173+
"codeFixes/fixClassIncorrectlyImplementsInterface.ts",
174+
"codeFixes/fixClassDoesntImplementInheritedAbstractMember.ts",
175+
"codeFixes/fixClassSuperMustPrecedeThisAccess.ts",
176+
"codeFixes/fixConstructorForDerivedNeedSuperCall.ts"
168177
].map(function (f) {
169178
return path.join(servicesDirectory, f);
170179
}));
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/* @internal */
2+
namespace ts.codefix {
3+
registerCodeFix({
4+
errorCodes: [Diagnostics.Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2.code],
5+
getCodeActions: (context: CodeFixContext) => {
6+
const sourceFile = context.sourceFile;
7+
const start = context.span.start;
8+
const token = getTokenAtPosition(sourceFile, start);
9+
const checker = context.program.getTypeChecker();
10+
11+
if (token.kind === SyntaxKind.Identifier && isClassLike(token.parent)) {
12+
const classDeclaration = <ClassDeclaration>token.parent;
13+
const startPos = classDeclaration.members.pos;
14+
// TODO: (arozga) actually get abstract members
15+
const abstractClassMembers = ts.map(getNamedAbstractClassMembers(classDeclaration), member => member.name.getText());
16+
const trackingAddedMembers: string[] = [];
17+
const extendsClause = ts.getClassExtendsHeritageClauseElement(classDeclaration);
18+
let textChanges = getCodeFixChanges(extendsClause, abstractClassMembers, startPos, checker, /*reference*/ false, trackingAddedMembers, context.newLineCharacter);
19+
20+
if (textChanges.length > 0) {
21+
return [{
22+
description: getLocaleSpecificMessage(Diagnostics.Implement_inherited_abstract_class),
23+
changes: [{
24+
fileName: sourceFile.fileName,
25+
textChanges: textChanges
26+
}]
27+
}];
28+
}
29+
}
30+
31+
return undefined;
32+
}
33+
});
34+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/* @internal */
2+
namespace ts.codefix {
3+
registerCodeFix({
4+
errorCodes: [Diagnostics.Class_0_incorrectly_implements_interface_1.code],
5+
getCodeActions: (context: CodeFixContext) => {
6+
const sourceFile = context.sourceFile;
7+
const start = context.span.start;
8+
const token = getTokenAtPosition(sourceFile, start);
9+
const checker = context.program.getTypeChecker();
10+
11+
if (token.kind === SyntaxKind.Identifier && isClassLike(token.parent)) {
12+
const classDeclaration = <ClassDeclaration>token.parent;
13+
const startPos: number = classDeclaration.members.pos;
14+
const classMembers = ts.map(getNamedClassMembers(classDeclaration), member => member.name.getText());
15+
const trackingAddedMembers: string[] = [];
16+
const interfaceClauses = ts.getClassImplementsHeritageClauseElements(classDeclaration);
17+
18+
let textChanges: TextChange[] = undefined;
19+
20+
for (let i = 0; interfaceClauses && i < interfaceClauses.length; i++) {
21+
let newChanges = getCodeFixChanges(interfaceClauses[i], classMembers, startPos, checker, /*reference*/ false, trackingAddedMembers, context.newLineCharacter);
22+
textChanges = textChanges ? textChanges.concat(newChanges) : newChanges;
23+
}
24+
25+
if (textChanges && textChanges.length > 0) {
26+
return [{
27+
description: getLocaleSpecificMessage(Diagnostics.Implement_interface_on_class),
28+
changes: [{
29+
fileName: sourceFile.fileName,
30+
textChanges: textChanges
31+
}]
32+
}];
33+
}
34+
}
35+
36+
return undefined;
37+
}
38+
});
39+
}

src/services/codefixes/superFixes.ts renamed to src/services/codefixes/fixClassSuperMustPrecedeThisAccess.ts

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,5 @@
11
/* @internal */
22
namespace ts.codefix {
3-
function getOpenBraceEnd(constructor: ConstructorDeclaration, sourceFile: SourceFile) {
4-
// First token is the open curly, this is where we want to put the 'super' call.
5-
return constructor.body.getFirstToken(sourceFile).getEnd();
6-
}
7-
8-
registerCodeFix({
9-
errorCodes: [Diagnostics.Constructors_for_derived_classes_must_contain_a_super_call.code],
10-
getCodeActions: (context: CodeFixContext) => {
11-
const sourceFile = context.sourceFile;
12-
const token = getTokenAtPosition(sourceFile, context.span.start);
13-
14-
if (token.kind !== SyntaxKind.ConstructorKeyword) {
15-
return undefined;
16-
}
17-
18-
const newPosition = getOpenBraceEnd(<ConstructorDeclaration>token.parent, sourceFile);
19-
return [{
20-
description: getLocaleSpecificMessage(Diagnostics.Add_missing_super_call),
21-
changes: [{ fileName: sourceFile.fileName, textChanges: [{ newText: "super();", span: { start: newPosition, length: 0 } }] }]
22-
}];
23-
}
24-
});
25-
263
registerCodeFix({
274
errorCodes: [Diagnostics.super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class.code],
285
getCodeActions: (context: CodeFixContext) => {
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/* @internal */
2+
namespace ts.codefix {
3+
registerCodeFix({
4+
errorCodes: [Diagnostics.Constructors_for_derived_classes_must_contain_a_super_call.code],
5+
getCodeActions: (context: CodeFixContext) => {
6+
const sourceFile = context.sourceFile;
7+
const token = getTokenAtPosition(sourceFile, context.span.start);
8+
9+
if (token.kind !== SyntaxKind.ConstructorKeyword) {
10+
return undefined;
11+
}
12+
13+
const newPosition = getOpenBraceEnd(<ConstructorDeclaration>token.parent, sourceFile);
14+
return [{
15+
description: getLocaleSpecificMessage(Diagnostics.Add_missing_super_call),
16+
changes: [{ fileName: sourceFile.fileName, textChanges: [{ newText: "super();", span: { start: newPosition, length: 0 } }] }]
17+
}];
18+
}
19+
});
20+
}

src/services/codefixes/changeExtendsToImplementsFix.ts renamed to src/services/codefixes/fixExtendsInterfaceBecomesImplements.ts

File renamed without changes.

src/services/codefixes/fixes.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1-
///<reference path='superFixes.ts' />
2-
///<reference path='interfaceFixes.ts' />
3-
///<reference path='changeExtendsToImplementsFix.ts' />
1+
/// <reference path="fixClassIncorrectlyImplementsInterface.ts" />
2+
/// <reference path="fixClassDoesntImplementInheritedAbstractMember.ts" />
3+
/// <reference path="fixClassSuperMustPrecedeThisAccess.ts" />
4+
/// <reference path="fixConstructorForDerivedNeedSuperCall.ts" />
5+
/// <reference path="fixExtendsInterfaceBecomesImplements.ts" />

src/services/codefixes/interfaceFixes.ts

Lines changed: 0 additions & 228 deletions
This file was deleted.

0 commit comments

Comments
 (0)