@@ -1985,12 +1985,12 @@ namespace ts {
19851985 }
19861986 }
19871987
1988- function toggleLineComment ( fileName : string , textRange : TextRange ) : TextChange [ ] {
1988+ function toggleLineComment ( fileName : string , textRange : TextRange , insertComment ?: boolean ) : TextChange [ ] {
19891989 const sourceFile = syntaxTreeCache . getCurrentSourceFile ( fileName ) ;
19901990 const textChanges : TextChange [ ] = [ ] ;
19911991 const { lineStarts, firstLine, lastLine } = getLinesForRange ( sourceFile , textRange ) ;
19921992
1993- let isCommenting = false ;
1993+ let isCommenting = insertComment || false ;
19941994 let leftMostPosition = Number . MAX_VALUE ;
19951995 let lineTextStarts = new Map < number > ( ) ;
19961996 const whiteSpaceRegex = new RegExp ( / \S / ) ;
@@ -2008,7 +2008,7 @@ namespace ts {
20082008 lineTextStarts . set ( i . toString ( ) , regExec . index ) ;
20092009
20102010 if ( lineText . substr ( regExec . index , openComment . length ) !== openComment ) {
2011- isCommenting = true ;
2011+ isCommenting = insertComment !== undefined ? insertComment : true ;
20122012 }
20132013 }
20142014 }
@@ -2029,7 +2029,7 @@ namespace ts {
20292029 start : lineStarts [ i ] + leftMostPosition
20302030 }
20312031 } ) ;
2032- } else {
2032+ } else if ( sourceFile . text . substr ( lineStarts [ i ] + lineTextStart , openComment . length ) === openComment ) {
20332033 textChanges . push ( {
20342034 newText : "" ,
20352035 span : {
@@ -2049,7 +2049,7 @@ namespace ts {
20492049 const textChanges : TextChange [ ] = [ ] ;
20502050 const { text } = sourceFile ;
20512051
2052- let isCommenting = insertComment !== undefined ? insertComment : false ;
2052+ let isCommenting = insertComment || false ;
20532053 const positions = [ ] as number [ ] as SortedArray < number > ;
20542054
20552055 let pos = textRange . pos ;
@@ -2083,7 +2083,9 @@ namespace ts {
20832083 } else { // If it's not in a comment range, then we need to comment the uncommented portions.
20842084 let newPos = text . substring ( pos , textRange . end ) . search ( `(${ openMultilineRegex } )|(${ closeMultilineRegex } )` ) ;
20852085
2086- isCommenting = isCommenting || ! isTextWhiteSpaceLike ( text , pos , newPos === - 1 ? textRange . end : pos + newPos ) ;
2086+ isCommenting = insertComment !== undefined
2087+ ? insertComment
2088+ : isCommenting || ! isTextWhiteSpaceLike ( text , pos , newPos === - 1 ? textRange . end : pos + newPos ) ; // If isCommenting is already true we don't need to check whitespace again.
20872089 pos = newPos === - 1 ? textRange . end + 1 : pos + newPos + closeMultiline . length ;
20882090 }
20892091 }
@@ -2157,6 +2159,31 @@ namespace ts {
21572159 return textChanges ;
21582160 }
21592161
2162+ function commentSelection ( fileName : string , textRange : TextRange ) : TextChange [ ] {
2163+ return toggleLineComment ( fileName , textRange , true ) ;
2164+ }
2165+ function uncommentSelection ( fileName : string , textRange : TextRange ) : TextChange [ ] {
2166+ const sourceFile = syntaxTreeCache . getCurrentSourceFile ( fileName ) ;
2167+ const textChanges : TextChange [ ] = [ ] ;
2168+
2169+ for ( let i = textRange . pos ; i <= textRange . end ; i ++ ) {
2170+ let commentRange = isInComment ( sourceFile , i ) ;
2171+ if ( commentRange ) {
2172+ switch ( commentRange . kind ) {
2173+ case SyntaxKind . SingleLineCommentTrivia :
2174+ textChanges . push . apply ( textChanges , toggleLineComment ( fileName , { end : commentRange . end , pos : commentRange . pos + 1 } , false ) ) ;
2175+ break ;
2176+ case SyntaxKind . MultiLineCommentTrivia :
2177+ textChanges . push . apply ( textChanges , toggleMultilineComment ( fileName , { end : commentRange . end , pos : commentRange . pos + 1 } , false ) ) ;
2178+ }
2179+
2180+ i = commentRange . end + 1 ;
2181+ }
2182+ }
2183+
2184+ return textChanges ;
2185+ }
2186+
21602187 function isUnclosedTag ( { openingElement, closingElement, parent } : JsxElement ) : boolean {
21612188 return ! tagNamesAreEquivalent ( openingElement . tagName , closingElement . tagName ) ||
21622189 isJsxElement ( parent ) && tagNamesAreEquivalent ( openingElement . tagName , parent . openingElement . tagName ) && isUnclosedTag ( parent ) ;
@@ -2437,7 +2464,9 @@ namespace ts {
24372464 provideCallHierarchyIncomingCalls,
24382465 provideCallHierarchyOutgoingCalls,
24392466 toggleLineComment,
2440- toggleMultilineComment
2467+ toggleMultilineComment,
2468+ commentSelection,
2469+ uncommentSelection,
24412470 } ;
24422471 }
24432472
0 commit comments