|
5 | 5 |
|
6 | 6 | import { Logger, TemplateContext, TemplateLanguageService } from 'typescript-template-language-service-decorator'; |
7 | 7 | import * as ts from 'typescript/lib/tsserverlibrary'; |
8 | | -import { getCSSLanguageService, getSCSSLanguageService, LanguageService } from 'vscode-css-languageservice'; |
| 8 | +import { getCSSLanguageService, getSCSSLanguageService, LanguageService, FoldingRange } from 'vscode-css-languageservice'; |
9 | 9 | import { getEmmetCompletionParticipants } from 'vscode-emmet-helper'; |
10 | 10 | import * as vscode from 'vscode-languageserver-types'; |
11 | 11 | import * as config from './_config'; |
@@ -175,6 +175,23 @@ export class StyledTemplateLanguageService implements TemplateLanguageService { |
175 | 175 | this.scssLanguageService.doCodeActions(doc, range, { diagnostics }, stylesheet)); |
176 | 176 | } |
177 | 177 |
|
| 178 | + public getOutliningSpans( |
| 179 | + context: TemplateContext |
| 180 | + ): ts.OutliningSpan[] { |
| 181 | + const doc = this.virtualDocumentFactory.createVirtualDocument(context); |
| 182 | + const ranges = this.scssLanguageService.getFoldingRanges(doc); |
| 183 | + return ranges |
| 184 | + .filter(range => { |
| 185 | + // Filter out ranges outside on last line |
| 186 | + const end = context.toOffset({ |
| 187 | + line: range.endLine, |
| 188 | + character: range.endCharacter || 0, |
| 189 | + }); |
| 190 | + return end < context.text.length; |
| 191 | + }) |
| 192 | + .map(range => this.translateOutliningSpan(context, range)); |
| 193 | + } |
| 194 | + |
178 | 195 | private toVsRange( |
179 | 196 | context: TemplateContext, |
180 | 197 | start: number, |
@@ -325,6 +342,26 @@ export class StyledTemplateLanguageService implements TemplateLanguageService { |
325 | 342 | }], |
326 | 343 | }; |
327 | 344 | } |
| 345 | + |
| 346 | + private translateOutliningSpan( |
| 347 | + context: TemplateContext, |
| 348 | + range: FoldingRange |
| 349 | + ): ts.OutliningSpan { |
| 350 | + const startOffset = context.toOffset(this.virtualDocumentFactory.fromVirtualDocPosition({ line: range.startLine, character: range.startCharacter || 0 })); |
| 351 | + const endOffset = context.toOffset(this.virtualDocumentFactory.fromVirtualDocPosition({ line: range.endLine, character: range.endCharacter || 0 })); |
| 352 | + const span = { |
| 353 | + start: startOffset, |
| 354 | + length: endOffset - startOffset, |
| 355 | + }; |
| 356 | + |
| 357 | + return { |
| 358 | + autoCollapse: false, |
| 359 | + kind: this.typescript.OutliningSpanKind.Code, |
| 360 | + bannerText: '', |
| 361 | + textSpan: span, |
| 362 | + hintSpan: span, |
| 363 | + }; |
| 364 | + } |
328 | 365 | } |
329 | 366 |
|
330 | 367 | function filterScssCompletionItems( |
|
0 commit comments