@@ -2088,10 +2088,15 @@ namespace ts {
20882088 const token = findPrecedingToken ( position , sourceFile ) ;
20892089 if ( ! token ) return undefined ;
20902090 const element = token . kind === SyntaxKind . GreaterThanToken && isJsxOpeningElement ( token . parent ) ? token . parent . parent
2091- : isJsxText ( token ) ? token . parent : undefined ;
2091+ : isJsxText ( token ) && isJsxElement ( token . parent ) ? token . parent : undefined ;
20922092 if ( element && isUnclosedTag ( element ) ) {
20932093 return { newText : `</${ element . openingElement . tagName . getText ( sourceFile ) } >` } ;
20942094 }
2095+ const fragment = token . kind === SyntaxKind . GreaterThanToken && isJsxOpeningFragment ( token . parent ) ? token . parent . parent
2096+ : isJsxText ( token ) && isJsxFragment ( token . parent ) ? token . parent : undefined ;
2097+ if ( fragment && isUnclosedFragment ( fragment ) ) {
2098+ return { newText : "</>" } ;
2099+ }
20952100 }
20962101
20972102 function getLinesForRange ( sourceFile : SourceFile , textRange : TextRange ) {
@@ -2334,6 +2339,10 @@ namespace ts {
23342339 isJsxElement ( parent ) && tagNamesAreEquivalent ( openingElement . tagName , parent . openingElement . tagName ) && isUnclosedTag ( parent ) ;
23352340 }
23362341
2342+ function isUnclosedFragment ( { closingFragment, parent } : JsxFragment ) : boolean {
2343+ return ! ! ( closingFragment . flags & NodeFlags . ThisNodeHasError ) || ( isJsxFragment ( parent ) && isUnclosedFragment ( parent ) ) ;
2344+ }
2345+
23372346 function getSpanOfEnclosingComment ( fileName : string , position : number , onlyMultiLine : boolean ) : TextSpan | undefined {
23382347 const sourceFile = syntaxTreeCache . getCurrentSourceFile ( fileName ) ;
23392348 const range = formatting . getRangeOfEnclosingComment ( sourceFile , position ) ;
0 commit comments