Skip to content

Commit c7d691d

Browse files
Generalize to nested arrays and refactor
1 parent df5e1a0 commit c7d691d

File tree

2 files changed

+33
-26
lines changed

2 files changed

+33
-26
lines changed

src/services/outliningElementsCollector.ts

Lines changed: 14 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,13 @@ namespace ts.OutliningElementsCollector {
44
const elements: OutliningSpan[] = [];
55
const collapseText = "...";
66

7-
function addOutliningSpan(hintSpanNode: Node, startElement: Node, endElement: Node, autoCollapse: boolean) {
7+
function addOutliningSpan(hintSpanNode: Node, startElement: Node, endElement: Node, autoCollapse: boolean, fullStart: boolean) {
88
if (hintSpanNode && startElement && endElement) {
99
const span: OutliningSpan = {
10-
textSpan: createTextSpanFromBounds(startElement.pos, endElement.end),
11-
hintSpan: createTextSpanFromNode(hintSpanNode, sourceFile),
12-
bannerText: collapseText,
13-
autoCollapse,
14-
};
15-
elements.push(span);
16-
}
17-
}
18-
19-
function addOutliningForObjectLiteralsInArray(startElement: Node, endElement: Node, autoCollapse: boolean) {
20-
if (startElement && endElement) {
21-
const span: OutliningSpan = {
22-
textSpan: createTextSpanFromBounds(startElement.getStart(), endElement.end),
10+
textSpan: createTextSpanFromBounds(fullStart ? startElement.pos : startElement.getStart(), endElement.end),
2311
hintSpan: createTextSpanFromBounds(startElement.getStart(), endElement.end),
2412
bannerText: collapseText,
25-
autoCollapse
13+
autoCollapse,
2614
};
2715
elements.push(span);
2816
}
@@ -125,21 +113,21 @@ namespace ts.OutliningElementsCollector {
125113
parent.kind === SyntaxKind.WithStatement ||
126114
parent.kind === SyntaxKind.CatchClause) {
127115

128-
addOutliningSpan(parent, openBrace, closeBrace, autoCollapse(n));
116+
addOutliningSpan(parent, openBrace, closeBrace, autoCollapse(n), /* fullStart */ true);
129117
break;
130118
}
131119

132120
if (parent.kind === SyntaxKind.TryStatement) {
133121
// Could be the try-block, or the finally-block.
134122
const tryStatement = <TryStatement>parent;
135123
if (tryStatement.tryBlock === n) {
136-
addOutliningSpan(parent, openBrace, closeBrace, autoCollapse(n));
124+
addOutliningSpan(parent, openBrace, closeBrace, autoCollapse(n), /* fullStart */ true);
137125
break;
138126
}
139127
else if (tryStatement.finallyBlock === n) {
140128
const finallyKeyword = findChildOfKind(tryStatement, SyntaxKind.FinallyKeyword, sourceFile);
141129
if (finallyKeyword) {
142-
addOutliningSpan(finallyKeyword, openBrace, closeBrace, autoCollapse(n));
130+
addOutliningSpan(finallyKeyword, openBrace, closeBrace, autoCollapse(n), /* fullStart */ true);
143131
break;
144132
}
145133
}
@@ -163,27 +151,27 @@ namespace ts.OutliningElementsCollector {
163151
case SyntaxKind.ModuleBlock: {
164152
const openBrace = findChildOfKind(n, SyntaxKind.OpenBraceToken, sourceFile);
165153
const closeBrace = findChildOfKind(n, SyntaxKind.CloseBraceToken, sourceFile);
166-
addOutliningSpan(n.parent, openBrace, closeBrace, autoCollapse(n));
154+
addOutliningSpan(n.parent, openBrace, closeBrace, autoCollapse(n), /* fullStart */ true);
167155
break;
168156
}
169157
case SyntaxKind.ClassDeclaration:
170158
case SyntaxKind.InterfaceDeclaration:
171159
case SyntaxKind.EnumDeclaration:
172-
case SyntaxKind.ObjectLiteralExpression:
173160
case SyntaxKind.CaseBlock: {
174161
const openBrace = findChildOfKind(n, SyntaxKind.OpenBraceToken, sourceFile);
175162
const closeBrace = findChildOfKind(n, SyntaxKind.CloseBraceToken, sourceFile);
176-
if (n.kind === SyntaxKind.ObjectLiteralExpression && n.parent.kind === SyntaxKind.ArrayLiteralExpression) {
177-
addOutliningForObjectLiteralsInArray(openBrace, closeBrace, autoCollapse(n));
178-
break;
179-
}
180-
addOutliningSpan(n, openBrace, closeBrace, autoCollapse(n));
163+
addOutliningSpan(n, openBrace, closeBrace, autoCollapse(n), /* fullStart */ true);
181164
break;
182165
}
166+
case SyntaxKind.ObjectLiteralExpression:
167+
const openBrace = findChildOfKind(n, SyntaxKind.OpenBraceToken, sourceFile);
168+
const closeBrace = findChildOfKind(n, SyntaxKind.CloseBraceToken, sourceFile);
169+
addOutliningSpan(n, openBrace, closeBrace, autoCollapse(n), /* fullStart */ n.parent.kind !== SyntaxKind.ArrayLiteralExpression);
170+
break;
183171
case SyntaxKind.ArrayLiteralExpression:
184172
const openBracket = findChildOfKind(n, SyntaxKind.OpenBracketToken, sourceFile);
185173
const closeBracket = findChildOfKind(n, SyntaxKind.CloseBracketToken, sourceFile);
186-
addOutliningSpan(n, openBracket, closeBracket, autoCollapse(n));
174+
addOutliningSpan(n, openBracket, closeBracket, autoCollapse(n), /* fullStart */ n.parent.kind !== SyntaxKind.ArrayLiteralExpression);
187175
break;
188176
}
189177
depth++;

tests/cases/fourslash/getOutliningForObjectsInArray.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,24 @@
1919
//// c: 2
2020
//// }|]
2121
//// ]|];
22+
////
23+
////// same behavior for nested arrays
24+
//// const w =[| [
25+
//// [|[ a: 0 ]|],
26+
//// [|[ b: 1 ]|],
27+
//// [|[ c: 2 ]|]
28+
//// ]|];
29+
////
30+
//// const z =[| [
31+
//// [|[
32+
//// a: 0
33+
//// ]|],
34+
//// [|[
35+
//// b: 1
36+
//// ]|],
37+
//// [|[
38+
//// c: 2
39+
//// ]|]
40+
//// ]|];
2241

2342
verify.outliningSpansInCurrentFile(test.ranges());

0 commit comments

Comments
 (0)