Skip to content

Commit b5f5513

Browse files
Merge pull request microsoft#25329 from uniqueiniquity/jsxFolding
Add outlining spans for JSX elements
2 parents fe2baac + 5c7b47e commit b5f5513

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

src/services/outliningElementsCollector.ts

+20
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,26 @@ namespace ts.OutliningElementsCollector {
183183
return spanForObjectOrArrayLiteral(n);
184184
case SyntaxKind.ArrayLiteralExpression:
185185
return spanForObjectOrArrayLiteral(n, SyntaxKind.OpenBracketToken);
186+
case SyntaxKind.JsxElement:
187+
return spanForJSXElement(<JsxElement>n);
188+
case SyntaxKind.JsxSelfClosingElement:
189+
case SyntaxKind.JsxOpeningElement:
190+
return spanForJSXAttributes((<JsxOpeningLikeElement>n).attributes);
191+
}
192+
193+
function spanForJSXElement(node: JsxElement): OutliningSpan | undefined {
194+
const textSpan = createTextSpanFromBounds(node.openingElement.getStart(sourceFile), node.closingElement.getEnd());
195+
const tagName = node.openingElement.tagName.getText(sourceFile);
196+
const bannerText = "<" + tagName + ">...</" + tagName + ">";
197+
return createOutliningSpan(textSpan, OutliningSpanKind.Code, textSpan, /*autoCollapse*/ false, bannerText);
198+
}
199+
200+
function spanForJSXAttributes(node: JsxAttributes): OutliningSpan | undefined {
201+
if (node.properties.length === 0) {
202+
return undefined;
203+
}
204+
205+
return createOutliningSpanFromBounds(node.getStart(sourceFile), node.getEnd(), OutliningSpanKind.Code);
186206
}
187207

188208
function spanForObjectOrArrayLiteral(node: Node, open: SyntaxKind.OpenBraceToken | SyntaxKind.OpenBracketToken = SyntaxKind.OpenBraceToken): OutliningSpan | undefined {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
////import React, { Component } from 'react';
2+
////
3+
////export class Home extends Component[| {
4+
//// render()[| {
5+
//// return (
6+
//// [|<div>
7+
//// [|<h1>Hello, world!</h1>|]
8+
//// [|<ul>
9+
//// [|<li>
10+
//// [|<a [|href='https://get.asp.net/'|]>
11+
//// ASP.NET Core
12+
//// </a>|]
13+
//// </li>|]
14+
//// [|<li>[|<a [|href='https://facebook.github.io/react/'|]>React</a>|] for client-side code</li>|]
15+
//// [|<li>[|<a [|href='http://getbootstrap.com/'|]>Bootstrap</a>|] for layout and styling</li>|]
16+
//// </ul>|]
17+
//// <div
18+
//// [|accesskey="test"
19+
//// class="active"
20+
//// dir="auto"|] />
21+
//// <PageHeader [|title="Log in"
22+
//// {...[|{
23+
//// item: true,
24+
//// xs: 9,
25+
//// md: 5
26+
//// }|]}|]
27+
//// />
28+
//// </div>|]
29+
//// );
30+
//// }|]
31+
////}|]
32+
33+
verify.outliningSpansInCurrentFile(test.ranges(), "code");

0 commit comments

Comments
 (0)