@@ -21,42 +21,36 @@ namespace ts.codefix {
21
21
return actions ;
22
22
23
23
function fix ( type : Type , fixId : string ) : CodeFixAction {
24
- const newText = typeString ( type , checker ) ;
25
- return {
26
- description : formatStringFromArgs ( getLocaleSpecificMessage ( Diagnostics . Change_0_to_1 ) , [ original , newText ] ) ,
27
- changes : [ createFileTextChanges ( sourceFile . fileName , [ createChange ( typeNode , sourceFile , newText ) ] ) ] ,
28
- fixId,
29
- } ;
24
+ const newText = checker . typeToString ( type ) ;
25
+ const description = formatStringFromArgs ( getLocaleSpecificMessage ( Diagnostics . Change_0_to_1 ) , [ original , newText ] ) ;
26
+ const changes = textChanges . ChangeTracker . with ( context , t => doChange ( t , sourceFile , typeNode , type , checker ) ) ;
27
+ return { description, changes, fixId } ;
30
28
}
31
29
} ,
32
30
fixIds : [ fixIdPlain , fixIdNullable ] ,
33
31
getAllCodeActions ( context ) {
34
32
const { fixId, program, sourceFile } = context ;
35
33
const checker = program . getTypeChecker ( ) ;
36
- return codeFixAllWithTextChanges ( context , errorCodes , ( changes , err ) => {
34
+ return codeFixAll ( context , errorCodes , ( changes , err ) => {
37
35
const info = getInfo ( err . file , err . start ! , checker ) ;
38
36
if ( ! info ) return ;
39
37
const { typeNode, type } = info ;
40
38
const fixedType = typeNode . kind === SyntaxKind . JSDocNullableType && fixId === fixIdNullable ? checker . getNullableType ( type , TypeFlags . Undefined ) : type ;
41
- changes . push ( createChange ( typeNode , sourceFile , typeString ( fixedType , checker ) ) ) ;
39
+ doChange ( changes , sourceFile , typeNode , fixedType , checker ) ;
42
40
} ) ;
43
41
}
44
42
} ) ;
45
43
44
+ function doChange ( changes : textChanges . ChangeTracker , sourceFile : SourceFile , oldTypeNode : TypeNode , newType : Type , checker : TypeChecker ) : void {
45
+ changes . replaceNode ( sourceFile , oldTypeNode , checker . typeToTypeNode ( newType , /*enclosingDeclaration*/ oldTypeNode ) ) ;
46
+ }
47
+
46
48
function getInfo ( sourceFile : SourceFile , pos : number , checker : TypeChecker ) : { readonly typeNode : TypeNode , type : Type } {
47
49
const decl = findAncestor ( getTokenAtPosition ( sourceFile , pos , /*includeJsDocComment*/ false ) , isTypeContainer ) ;
48
50
const typeNode = decl && decl . type ;
49
51
return typeNode && { typeNode, type : checker . getTypeFromTypeNode ( typeNode ) } ;
50
52
}
51
53
52
- function createChange ( declaration : TypeNode , sourceFile : SourceFile , newText : string ) : TextChange {
53
- return createTextChange ( createTextSpanFromNode ( declaration , sourceFile ) , newText ) ;
54
- }
55
-
56
- function typeString ( type : Type , checker : TypeChecker ) : string {
57
- return checker . typeToString ( type , /*enclosingDeclaration*/ undefined , TypeFormatFlags . NoTruncation ) ;
58
- }
59
-
60
54
// TODO: GH#19856 Node & { type: TypeNode }
61
55
type TypeContainer =
62
56
| AsExpression | CallSignatureDeclaration | ConstructSignatureDeclaration | FunctionDeclaration
0 commit comments