@@ -14,7 +14,8 @@ export const enum RenderWhitespace {
1414 None = 0 ,
1515 Boundary = 1 ,
1616 Selection = 2 ,
17- All = 3
17+ Trailing = 3 ,
18+ All = 4
1819}
1920
2021export const enum LinePartMetadata {
@@ -113,7 +114,7 @@ export class RenderLineInput {
113114 middotWidth : number ,
114115 wsmiddotWidth : number ,
115116 stopRenderingLineAfter : number ,
116- renderWhitespace : 'none' | 'boundary' | 'selection' | 'all' ,
117+ renderWhitespace : 'none' | 'boundary' | 'selection' | 'trailing' | ' all',
117118 renderControlCharacters : boolean ,
118119 fontLigatures : boolean ,
119120 selectionsOnLine : LineRange [ ] | null
@@ -138,7 +139,9 @@ export class RenderLineInput {
138139 ? RenderWhitespace . Boundary
139140 : renderWhitespace === 'selection'
140141 ? RenderWhitespace . Selection
141- : RenderWhitespace . None
142+ : renderWhitespace === 'trailing'
143+ ? RenderWhitespace . Trailing
144+ : RenderWhitespace . None
142145 ) ;
143146 this . renderControlCharacters = renderControlCharacters ;
144147 this . fontLigatures = fontLigatures ;
@@ -435,7 +438,11 @@ function resolveRenderLineInput(input: RenderLineInput): ResolvedRenderLineInput
435438 }
436439
437440 let tokens = transformAndRemoveOverflowing ( input . lineTokens , input . fauxIndentLength , len ) ;
438- if ( input . renderWhitespace === RenderWhitespace . All || input . renderWhitespace === RenderWhitespace . Boundary || ( input . renderWhitespace === RenderWhitespace . Selection && ! ! input . selectionsOnLine ) ) {
441+ if ( input . renderWhitespace === RenderWhitespace . All ||
442+ input . renderWhitespace === RenderWhitespace . Boundary ||
443+ ( input . renderWhitespace === RenderWhitespace . Selection && ! ! input . selectionsOnLine ) ||
444+ input . renderWhitespace === RenderWhitespace . Trailing ) {
445+
439446 tokens = _applyRenderWhitespace ( input , lineContent , len , tokens ) ;
440447 }
441448 let containsForeignElements = ForeignElementType . None ;
@@ -592,6 +599,7 @@ function _applyRenderWhitespace(input: RenderLineInput, lineContent: string, len
592599 const useMonospaceOptimizations = input . useMonospaceOptimizations ;
593600 const selections = input . selectionsOnLine ;
594601 const onlyBoundary = ( input . renderWhitespace === RenderWhitespace . Boundary ) ;
602+ const onlyTrailing = ( input . renderWhitespace === RenderWhitespace . Trailing ) ;
595603 const generateLinePartForEachWhitespace = ( input . renderSpaceWidth !== input . spaceWidth ) ;
596604
597605 let result : LinePart [ ] = [ ] , resultLen = 0 ;
@@ -600,10 +608,11 @@ function _applyRenderWhitespace(input: RenderLineInput, lineContent: string, len
600608 let tokenEndIndex = tokens [ tokenIndex ] . endIndex ;
601609 const tokensLength = tokens . length ;
602610
611+ let lineIsEmptyOrWhitespace = false ;
603612 let firstNonWhitespaceIndex = strings . firstNonWhitespaceIndex ( lineContent ) ;
604613 let lastNonWhitespaceIndex : number ;
605614 if ( firstNonWhitespaceIndex === - 1 ) {
606- // The entire line is whitespace
615+ lineIsEmptyOrWhitespace = true ;
607616 firstNonWhitespaceIndex = len ;
608617 lastNonWhitespaceIndex = len ;
609618 } else {
@@ -651,6 +660,11 @@ function _applyRenderWhitespace(input: RenderLineInput, lineContent: string, len
651660 isInWhitespace = ! ! currentSelection && currentSelection . startOffset <= charIndex && currentSelection . endOffset > charIndex ;
652661 }
653662
663+ // If rendering only trailing whitespace, check that the charIndex points to trailing whitespace.
664+ if ( isInWhitespace && onlyTrailing ) {
665+ isInWhitespace = lineIsEmptyOrWhitespace || charIndex > lastNonWhitespaceIndex ;
666+ }
667+
654668 if ( wasInWhitespace ) {
655669 // was in whitespace token
656670 if ( ! isInWhitespace || ( ! useMonospaceOptimizations && tmpIndent >= tabSize ) ) {
0 commit comments