@@ -847,9 +847,10 @@ namespace ts.textChanges {
847
847
848
848
/** Note: output node may be mutated input node. */
849
849
export function getNonformattedText ( node : Node , sourceFile : SourceFile | undefined , newLineCharacter : string ) : { text : string , node : Node } {
850
- const writer = new Writer ( newLineCharacter ) ;
850
+ const omitTrailingSemicolon = ! ! sourceFile && ! probablyUsesSemicolons ( sourceFile ) ;
851
+ const writer = createWriter ( newLineCharacter , omitTrailingSemicolon ) ;
851
852
const newLine = newLineCharacter === "\n" ? NewLineKind . LineFeed : NewLineKind . CarriageReturnLineFeed ;
852
- createPrinter ( { newLine, neverAsciiEscape : true } , writer ) . writeNode ( EmitHint . Unspecified , node , sourceFile , writer ) ;
853
+ createPrinter ( { newLine, neverAsciiEscape : true , omitTrailingSemicolon } , writer ) . writeNode ( EmitHint . Unspecified , node , sourceFile , writer ) ;
853
854
return { text : writer . getText ( ) , node : assignPositionsToNode ( node ) } ;
854
855
}
855
856
}
@@ -887,143 +888,168 @@ namespace ts.textChanges {
887
888
return nodeArray ;
888
889
}
889
890
890
- class Writer implements EmitTextWriter , PrintHandlers {
891
- private lastNonTriviaPosition = 0 ;
892
- private readonly writer : EmitTextWriter ;
893
-
894
- public readonly onEmitNode : PrintHandlers [ "onEmitNode" ] ;
895
- public readonly onBeforeEmitNodeArray : PrintHandlers [ "onBeforeEmitNodeArray" ] ;
896
- public readonly onAfterEmitNodeArray : PrintHandlers [ "onAfterEmitNodeArray" ] ;
897
- public readonly onBeforeEmitToken : PrintHandlers [ "onBeforeEmitToken" ] ;
898
- public readonly onAfterEmitToken : PrintHandlers [ "onAfterEmitToken" ] ;
899
-
900
- constructor ( newLine : string ) {
901
- this . writer = createTextWriter ( newLine ) ;
902
- this . onEmitNode = ( hint , node , printCallback ) => {
903
- if ( node ) {
904
- setPos ( node , this . lastNonTriviaPosition ) ;
905
- }
906
- printCallback ( hint , node ) ;
907
- if ( node ) {
908
- setEnd ( node , this . lastNonTriviaPosition ) ;
909
- }
910
- } ;
911
- this . onBeforeEmitNodeArray = nodes => {
912
- if ( nodes ) {
913
- setPos ( nodes , this . lastNonTriviaPosition ) ;
914
- }
915
- } ;
916
- this . onAfterEmitNodeArray = nodes => {
917
- if ( nodes ) {
918
- setEnd ( nodes , this . lastNonTriviaPosition ) ;
919
- }
920
- } ;
921
- this . onBeforeEmitToken = node => {
922
- if ( node ) {
923
- setPos ( node , this . lastNonTriviaPosition ) ;
924
- }
925
- } ;
926
- this . onAfterEmitToken = node => {
927
- if ( node ) {
928
- setEnd ( node , this . lastNonTriviaPosition ) ;
929
- }
930
- } ;
931
- }
891
+ interface TextChangesWriter extends EmitTextWriter , PrintHandlers { }
892
+
893
+ function createWriter ( newLine : string , omitTrailingSemicolon ?: boolean ) : TextChangesWriter {
894
+ let lastNonTriviaPosition = 0 ;
895
+
932
896
933
- private setLastNonTriviaPosition ( s : string , force : boolean ) {
897
+ const writer = omitTrailingSemicolon ? getTrailingSemicolonOmittingWriter ( createTextWriter ( newLine ) ) : createTextWriter ( newLine ) ;
898
+ const onEmitNode : PrintHandlers [ "onEmitNode" ] = ( hint , node , printCallback ) => {
899
+ if ( node ) {
900
+ setPos ( node , lastNonTriviaPosition ) ;
901
+ }
902
+ printCallback ( hint , node ) ;
903
+ if ( node ) {
904
+ setEnd ( node , lastNonTriviaPosition ) ;
905
+ }
906
+ } ;
907
+ const onBeforeEmitNodeArray : PrintHandlers [ "onBeforeEmitNodeArray" ] = nodes => {
908
+ if ( nodes ) {
909
+ setPos ( nodes , lastNonTriviaPosition ) ;
910
+ }
911
+ } ;
912
+ const onAfterEmitNodeArray : PrintHandlers [ "onAfterEmitNodeArray" ] = nodes => {
913
+ if ( nodes ) {
914
+ setEnd ( nodes , lastNonTriviaPosition ) ;
915
+ }
916
+ } ;
917
+ const onBeforeEmitToken : PrintHandlers [ "onBeforeEmitToken" ] = node => {
918
+ if ( node ) {
919
+ setPos ( node , lastNonTriviaPosition ) ;
920
+ }
921
+ } ;
922
+ const onAfterEmitToken : PrintHandlers [ "onAfterEmitToken" ] = node => {
923
+ if ( node ) {
924
+ setEnd ( node , lastNonTriviaPosition ) ;
925
+ }
926
+ } ;
927
+
928
+ function setLastNonTriviaPosition ( s : string , force : boolean ) {
934
929
if ( force || ! isTrivia ( s ) ) {
935
- this . lastNonTriviaPosition = this . writer . getTextPos ( ) ;
930
+ lastNonTriviaPosition = writer . getTextPos ( ) ;
936
931
let i = 0 ;
937
932
while ( isWhiteSpaceLike ( s . charCodeAt ( s . length - i - 1 ) ) ) {
938
933
i ++ ;
939
934
}
940
935
// trim trailing whitespaces
941
- this . lastNonTriviaPosition -= i ;
936
+ lastNonTriviaPosition -= i ;
942
937
}
943
938
}
944
939
945
- write ( s : string ) : void {
946
- this . writer . write ( s ) ;
947
- this . setLastNonTriviaPosition ( s , /*force*/ false ) ;
948
- }
949
- writeComment ( s : string ) : void {
950
- this . writer . writeComment ( s ) ;
951
- }
952
- writeKeyword ( s : string ) : void {
953
- this . writer . writeKeyword ( s ) ;
954
- this . setLastNonTriviaPosition ( s , /*force*/ false ) ;
955
- }
956
- writeOperator ( s : string ) : void {
957
- this . writer . writeOperator ( s ) ;
958
- this . setLastNonTriviaPosition ( s , /*force*/ false ) ;
959
- }
960
- writePunctuation ( s : string ) : void {
961
- this . writer . writePunctuation ( s ) ;
962
- this . setLastNonTriviaPosition ( s , /*force*/ false ) ;
963
- }
964
- writeTrailingSemicolon ( s : string ) : void {
965
- this . writer . writeTrailingSemicolon ( s ) ;
966
- this . setLastNonTriviaPosition ( s , /*force*/ false ) ;
967
- }
968
- writeParameter ( s : string ) : void {
969
- this . writer . writeParameter ( s ) ;
970
- this . setLastNonTriviaPosition ( s , /*force*/ false ) ;
971
- }
972
- writeProperty ( s : string ) : void {
973
- this . writer . writeProperty ( s ) ;
974
- this . setLastNonTriviaPosition ( s , /*force*/ false ) ;
975
- }
976
- writeSpace ( s : string ) : void {
977
- this . writer . writeSpace ( s ) ;
978
- this . setLastNonTriviaPosition ( s , /*force*/ false ) ;
979
- }
980
- writeStringLiteral ( s : string ) : void {
981
- this . writer . writeStringLiteral ( s ) ;
982
- this . setLastNonTriviaPosition ( s , /*force*/ false ) ;
983
- }
984
- writeSymbol ( s : string , sym : Symbol ) : void {
985
- this . writer . writeSymbol ( s , sym ) ;
986
- this . setLastNonTriviaPosition ( s , /*force*/ false ) ;
987
- }
988
- writeLine ( ) : void {
989
- this . writer . writeLine ( ) ;
990
- }
991
- increaseIndent ( ) : void {
992
- this . writer . increaseIndent ( ) ;
993
- }
994
- decreaseIndent ( ) : void {
995
- this . writer . decreaseIndent ( ) ;
996
- }
997
- getText ( ) : string {
998
- return this . writer . getText ( ) ;
999
- }
1000
- rawWrite ( s : string ) : void {
1001
- this . writer . rawWrite ( s ) ;
1002
- this . setLastNonTriviaPosition ( s , /*force*/ false ) ;
1003
- }
1004
- writeLiteral ( s : string ) : void {
1005
- this . writer . writeLiteral ( s ) ;
1006
- this . setLastNonTriviaPosition ( s , /*force*/ true ) ;
1007
- }
1008
- getTextPos ( ) : number {
1009
- return this . writer . getTextPos ( ) ;
1010
- }
1011
- getLine ( ) : number {
1012
- return this . writer . getLine ( ) ;
1013
- }
1014
- getColumn ( ) : number {
1015
- return this . writer . getColumn ( ) ;
1016
- }
1017
- getIndent ( ) : number {
1018
- return this . writer . getIndent ( ) ;
1019
- }
1020
- isAtStartOfLine ( ) : boolean {
1021
- return this . writer . isAtStartOfLine ( ) ;
1022
- }
1023
- clear ( ) : void {
1024
- this . writer . clear ( ) ;
1025
- this . lastNonTriviaPosition = 0 ;
940
+ function write ( s : string ) : void {
941
+ writer . write ( s ) ;
942
+ setLastNonTriviaPosition ( s , /*force*/ false ) ;
1026
943
}
944
+ function writeComment ( s : string ) : void {
945
+ writer . writeComment ( s ) ;
946
+ }
947
+ function writeKeyword ( s : string ) : void {
948
+ writer . writeKeyword ( s ) ;
949
+ setLastNonTriviaPosition ( s , /*force*/ false ) ;
950
+ }
951
+ function writeOperator ( s : string ) : void {
952
+ writer . writeOperator ( s ) ;
953
+ setLastNonTriviaPosition ( s , /*force*/ false ) ;
954
+ }
955
+ function writePunctuation ( s : string ) : void {
956
+ writer . writePunctuation ( s ) ;
957
+ setLastNonTriviaPosition ( s , /*force*/ false ) ;
958
+ }
959
+ function writeTrailingSemicolon ( s : string ) : void {
960
+ writer . writeTrailingSemicolon ( s ) ;
961
+ setLastNonTriviaPosition ( s , /*force*/ false ) ;
962
+ }
963
+ function writeParameter ( s : string ) : void {
964
+ writer . writeParameter ( s ) ;
965
+ setLastNonTriviaPosition ( s , /*force*/ false ) ;
966
+ }
967
+ function writeProperty ( s : string ) : void {
968
+ writer . writeProperty ( s ) ;
969
+ setLastNonTriviaPosition ( s , /*force*/ false ) ;
970
+ }
971
+ function writeSpace ( s : string ) : void {
972
+ writer . writeSpace ( s ) ;
973
+ setLastNonTriviaPosition ( s , /*force*/ false ) ;
974
+ }
975
+ function writeStringLiteral ( s : string ) : void {
976
+ writer . writeStringLiteral ( s ) ;
977
+ setLastNonTriviaPosition ( s , /*force*/ false ) ;
978
+ }
979
+ function writeSymbol ( s : string , sym : Symbol ) : void {
980
+ writer . writeSymbol ( s , sym ) ;
981
+ setLastNonTriviaPosition ( s , /*force*/ false ) ;
982
+ }
983
+ function writeLine ( ) : void {
984
+ writer . writeLine ( ) ;
985
+ }
986
+ function increaseIndent ( ) : void {
987
+ writer . increaseIndent ( ) ;
988
+ }
989
+ function decreaseIndent ( ) : void {
990
+ writer . decreaseIndent ( ) ;
991
+ }
992
+ function getText ( ) : string {
993
+ return writer . getText ( ) ;
994
+ }
995
+ function rawWrite ( s : string ) : void {
996
+ writer . rawWrite ( s ) ;
997
+ setLastNonTriviaPosition ( s , /*force*/ false ) ;
998
+ }
999
+ function writeLiteral ( s : string ) : void {
1000
+ writer . writeLiteral ( s ) ;
1001
+ setLastNonTriviaPosition ( s , /*force*/ true ) ;
1002
+ }
1003
+ function getTextPos ( ) : number {
1004
+ return writer . getTextPos ( ) ;
1005
+ }
1006
+ function getLine ( ) : number {
1007
+ return writer . getLine ( ) ;
1008
+ }
1009
+ function getColumn ( ) : number {
1010
+ return writer . getColumn ( ) ;
1011
+ }
1012
+ function getIndent ( ) : number {
1013
+ return writer . getIndent ( ) ;
1014
+ }
1015
+ function isAtStartOfLine ( ) : boolean {
1016
+ return writer . isAtStartOfLine ( ) ;
1017
+ }
1018
+ function clear ( ) : void {
1019
+ writer . clear ( ) ;
1020
+ lastNonTriviaPosition = 0 ;
1021
+ }
1022
+
1023
+ return {
1024
+ onEmitNode,
1025
+ onBeforeEmitNodeArray,
1026
+ onAfterEmitNodeArray,
1027
+ onBeforeEmitToken,
1028
+ onAfterEmitToken,
1029
+ write,
1030
+ writeComment,
1031
+ writeKeyword,
1032
+ writeOperator,
1033
+ writePunctuation,
1034
+ writeTrailingSemicolon,
1035
+ writeParameter,
1036
+ writeProperty,
1037
+ writeSpace,
1038
+ writeStringLiteral,
1039
+ writeSymbol,
1040
+ writeLine,
1041
+ increaseIndent,
1042
+ decreaseIndent,
1043
+ getText,
1044
+ rawWrite,
1045
+ writeLiteral,
1046
+ getTextPos,
1047
+ getLine,
1048
+ getColumn,
1049
+ getIndent,
1050
+ isAtStartOfLine,
1051
+ clear
1052
+ } ;
1027
1053
}
1028
1054
1029
1055
function getInsertionPositionAtSourceFileTop ( sourceFile : SourceFile ) : number {
0 commit comments