@@ -8,6 +8,7 @@ import { LanguageService as HTMLLanguageService, TokenType, Range } from 'vscode
88
99import { FoldingRangeType , FoldingRange , FoldingRangeList } from '../protocol/foldingProvider.proposed' ;
1010import { LanguageModes } from './languageModes' ;
11+ import { binarySearch } from '../utils/arrays' ;
1112
1213export function getFoldingRegions ( languageModes : LanguageModes , document : TextDocument , maxRanges : number | undefined , cancellationToken : CancellationToken | null ) : FoldingRangeList {
1314 let htmlMode = languageModes . getMode ( 'html' ) ;
@@ -90,6 +91,11 @@ function limitRanges(ranges: FoldingRange[], maxRanges: number) {
9091 return ranges . filter ( ( r , index ) => ( typeof nestingLevels [ index ] === 'number' ) && nestingLevels [ index ] < maxLevel ) ;
9192}
9293
94+ export const EMPTY_ELEMENTS : string [ ] = [ 'area' , 'base' , 'br' , 'col' , 'embed' , 'hr' , 'img' , 'input' , 'keygen' , 'link' , 'menuitem' , 'meta' , 'param' , 'source' , 'track' , 'wbr' ] ;
95+
96+ export function isEmptyElement ( e : string ) : boolean {
97+ return ! ! e && binarySearch ( EMPTY_ELEMENTS , e . toLowerCase ( ) , ( s1 : string , s2 : string ) => s1 . localeCompare ( s2 ) ) >= 0 ;
98+ }
9399
94100export function getHTMLFoldingRegions ( htmlLanguageService : HTMLLanguageService , document : TextDocument , range : Range ) : FoldingRange [ ] {
95101 const scanner = htmlLanguageService . createScanner ( document . getText ( ) ) ;
@@ -121,6 +127,11 @@ export function getHTMLFoldingRegions(htmlLanguageService: HTMLLanguageService,
121127 lastTagName = scanner . getTokenText ( ) ;
122128 break ;
123129 }
130+ case TokenType . StartTagClose :
131+ if ( ! isEmptyElement ( lastTagName ) ) {
132+ break ;
133+ }
134+ // fallthrough
124135 case TokenType . EndTagClose :
125136 case TokenType . StartTagSelfClose : {
126137 let name = elementNames . pop ( ) ;
0 commit comments