@@ -153,8 +153,8 @@ namespace ts.OutliningElementsCollector {
153
153
function getOutliningSpanForNode ( n : Node , sourceFile : SourceFile ) : OutliningSpan | undefined {
154
154
switch ( n . kind ) {
155
155
case SyntaxKind . Block :
156
- if ( isFunctionBlock ( n ) ) {
157
- return spanForNode ( n . parent , /*autoCollapse*/ n . parent . kind !== SyntaxKind . ArrowFunction ) ;
156
+ if ( isFunctionLike ( n . parent ) ) {
157
+ return functionSpan ( n . parent , n as Block , sourceFile ) ;
158
158
}
159
159
// Check if the block is standalone, or 'attached' to some parent statement.
160
160
// If the latter, we want to collapse the block, but consider its hint span
@@ -225,18 +225,26 @@ namespace ts.OutliningElementsCollector {
225
225
return spanForNode ( node , /*autoCollapse*/ false , /*useFullStart*/ ! isArrayLiteralExpression ( node . parent ) && ! isCallExpression ( node . parent ) , open ) ;
226
226
}
227
227
228
- function spanForNode ( hintSpanNode : Node , autoCollapse = false , useFullStart = true , open : SyntaxKind . OpenBraceToken | SyntaxKind . OpenBracketToken = SyntaxKind . OpenBraceToken ) : OutliningSpan | undefined {
228
+ function spanForNode ( hintSpanNode : Node , autoCollapse = false , useFullStart = true , open : SyntaxKind . OpenBraceToken | SyntaxKind . OpenBracketToken = SyntaxKind . OpenBraceToken , close : SyntaxKind = open === SyntaxKind . OpenBraceToken ? SyntaxKind . CloseBraceToken : SyntaxKind . CloseBracketToken ) : OutliningSpan | undefined {
229
229
const openToken = findChildOfKind ( n , open , sourceFile ) ;
230
- const close = open === SyntaxKind . OpenBraceToken ? SyntaxKind . CloseBraceToken : SyntaxKind . CloseBracketToken ;
231
230
const closeToken = findChildOfKind ( n , close , sourceFile ) ;
232
- if ( ! openToken || ! closeToken ) {
233
- return undefined ;
234
- }
235
- const textSpan = createTextSpanFromBounds ( useFullStart ? openToken . getFullStart ( ) : openToken . getStart ( sourceFile ) , closeToken . getEnd ( ) ) ;
236
- return createOutliningSpan ( textSpan , OutliningSpanKind . Code , createTextSpanFromNode ( hintSpanNode , sourceFile ) , autoCollapse ) ;
231
+ return openToken && closeToken && spanBetweenTokens ( openToken , closeToken , hintSpanNode , sourceFile , autoCollapse , useFullStart ) ;
237
232
}
238
233
}
239
234
235
+ function functionSpan ( node : FunctionLike , body : Block , sourceFile : SourceFile ) : OutliningSpan | undefined {
236
+ const openToken = isNodeArrayMultiLine ( node . parameters , sourceFile )
237
+ ? findChildOfKind ( node , SyntaxKind . OpenParenToken , sourceFile )
238
+ : findChildOfKind ( body , SyntaxKind . OpenBraceToken , sourceFile ) ;
239
+ const closeToken = findChildOfKind ( body , SyntaxKind . CloseBraceToken , sourceFile ) ;
240
+ return openToken && closeToken && spanBetweenTokens ( openToken , closeToken , node . parent , sourceFile , /*autoCollapse*/ node . parent . kind !== SyntaxKind . ArrowFunction ) ;
241
+ }
242
+
243
+ function spanBetweenTokens ( openToken : Node , closeToken : Node , hintSpanNode : Node , sourceFile : SourceFile , autoCollapse = false , useFullStart = true ) : OutliningSpan {
244
+ const textSpan = createTextSpanFromBounds ( useFullStart ? openToken . getFullStart ( ) : openToken . getStart ( sourceFile ) , closeToken . getEnd ( ) ) ;
245
+ return createOutliningSpan ( textSpan , OutliningSpanKind . Code , createTextSpanFromNode ( hintSpanNode , sourceFile ) , autoCollapse ) ;
246
+ }
247
+
240
248
function createOutliningSpan ( textSpan : TextSpan , kind : OutliningSpanKind , hintSpan : TextSpan = textSpan , autoCollapse = false , bannerText = "..." ) : OutliningSpan {
241
249
return { textSpan, kind, hintSpan, bannerText, autoCollapse } ;
242
250
}
0 commit comments