@@ -21,42 +21,36 @@ namespace ts.codefix {
2121 return actions ;
2222
2323 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 } ;
3028 }
3129 } ,
3230 fixIds : [ fixIdPlain , fixIdNullable ] ,
3331 getAllCodeActions ( context ) {
3432 const { fixId, program, sourceFile } = context ;
3533 const checker = program . getTypeChecker ( ) ;
36- return codeFixAllWithTextChanges ( context , errorCodes , ( changes , err ) => {
34+ return codeFixAll ( context , errorCodes , ( changes , err ) => {
3735 const info = getInfo ( err . file , err . start ! , checker ) ;
3836 if ( ! info ) return ;
3937 const { typeNode, type } = info ;
4038 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 ) ;
4240 } ) ;
4341 }
4442 } ) ;
4543
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+
4648 function getInfo ( sourceFile : SourceFile , pos : number , checker : TypeChecker ) : { readonly typeNode : TypeNode , type : Type } {
4749 const decl = findAncestor ( getTokenAtPosition ( sourceFile , pos , /*includeJsDocComment*/ false ) , isTypeContainer ) ;
4850 const typeNode = decl && decl . type ;
4951 return typeNode && { typeNode, type : checker . getTypeFromTypeNode ( typeNode ) } ;
5052 }
5153
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-
6054 // TODO: GH#19856 Node & { type: TypeNode }
6155 type TypeContainer =
6256 | AsExpression | CallSignatureDeclaration | ConstructSignatureDeclaration | FunctionDeclaration
0 commit comments