@@ -2088,10 +2088,15 @@ namespace ts {
2088
2088
const token = findPrecedingToken ( position , sourceFile ) ;
2089
2089
if ( ! token ) return undefined ;
2090
2090
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 ;
2092
2092
if ( element && isUnclosedTag ( element ) ) {
2093
2093
return { newText : `</${ element . openingElement . tagName . getText ( sourceFile ) } >` } ;
2094
2094
}
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
+ }
2095
2100
}
2096
2101
2097
2102
function getLinesForRange ( sourceFile : SourceFile , textRange : TextRange ) {
@@ -2334,6 +2339,10 @@ namespace ts {
2334
2339
isJsxElement ( parent ) && tagNamesAreEquivalent ( openingElement . tagName , parent . openingElement . tagName ) && isUnclosedTag ( parent ) ;
2335
2340
}
2336
2341
2342
+ function isUnclosedFragment ( { closingFragment, parent } : JsxFragment ) : boolean {
2343
+ return ! ! ( closingFragment . flags & NodeFlags . ThisNodeHasError ) || ( isJsxFragment ( parent ) && isUnclosedFragment ( parent ) ) ;
2344
+ }
2345
+
2337
2346
function getSpanOfEnclosingComment ( fileName : string , position : number , onlyMultiLine : boolean ) : TextSpan | undefined {
2338
2347
const sourceFile = syntaxTreeCache . getCurrentSourceFile ( fileName ) ;
2339
2348
const range = formatting . getRangeOfEnclosingComment ( sourceFile , position ) ;
0 commit comments