1 /*---------------------------------------------------------------------------------------------
2 * Copyright (c) Microsoft Corporation. All rights reserved.
3 * Licensed under the MIT License. See License.txt in the project root for license information.
4 *--------------------------------------------------------------------------------------------*/
6 if (typeof module === "object" && typeof module.exports === "object") {
7 var v = factory(require, exports);
8 if (v !== undefined) module.exports = v;
10 else if (typeof define === "function" && define.amd) {
11 define(["require", "exports", "jsonc-parser", "../jsonLanguageTypes"], factory);
13 })(function (require, exports) {
15 Object.defineProperty(exports, "__esModule", { value: true });
16 exports.getFoldingRanges = void 0;
17 var jsonc_parser_1 = require("jsonc-parser");
18 var jsonLanguageTypes_1 = require("../jsonLanguageTypes");
19 function getFoldingRanges(document, context) {
21 var nestingLevels = [];
24 var scanner = jsonc_parser_1.createScanner(document.getText(), false);
25 var token = scanner.scan();
26 function addRange(range) {
28 nestingLevels.push(stack.length);
30 while (token !== 17 /* EOF */) {
32 case 1 /* OpenBraceToken */:
33 case 3 /* OpenBracketToken */: {
34 var startLine = document.positionAt(scanner.getTokenOffset()).line;
35 var range = { startLine: startLine, endLine: startLine, kind: token === 1 /* OpenBraceToken */ ? 'object' : 'array' };
39 case 2 /* CloseBraceToken */:
40 case 4 /* CloseBracketToken */: {
41 var kind = token === 2 /* CloseBraceToken */ ? 'object' : 'array';
42 if (stack.length > 0 && stack[stack.length - 1].kind === kind) {
43 var range = stack.pop();
44 var line = document.positionAt(scanner.getTokenOffset()).line;
45 if (range && line > range.startLine + 1 && prevStart !== range.startLine) {
46 range.endLine = line - 1;
48 prevStart = range.startLine;
53 case 13 /* BlockCommentTrivia */: {
54 var startLine = document.positionAt(scanner.getTokenOffset()).line;
55 var endLine = document.positionAt(scanner.getTokenOffset() + scanner.getTokenLength()).line;
56 if (scanner.getTokenError() === 1 /* UnexpectedEndOfComment */ && startLine + 1 < document.lineCount) {
57 scanner.setPosition(document.offsetAt(jsonLanguageTypes_1.Position.create(startLine + 1, 0)));
60 if (startLine < endLine) {
61 addRange({ startLine: startLine, endLine: endLine, kind: jsonLanguageTypes_1.FoldingRangeKind.Comment });
62 prevStart = startLine;
67 case 12 /* LineCommentTrivia */: {
68 var text = document.getText().substr(scanner.getTokenOffset(), scanner.getTokenLength());
69 var m = text.match(/^\/\/\s*#(region\b)|(endregion\b)/);
71 var line = document.positionAt(scanner.getTokenOffset()).line;
72 if (m[1]) { // start pattern match
73 var range = { startLine: line, endLine: line, kind: jsonLanguageTypes_1.FoldingRangeKind.Region };
77 var i = stack.length - 1;
78 while (i >= 0 && stack[i].kind !== jsonLanguageTypes_1.FoldingRangeKind.Region) {
84 if (line > range.startLine && prevStart !== range.startLine) {
87 prevStart = range.startLine;
95 token = scanner.scan();
97 var rangeLimit = context && context.rangeLimit;
98 if (typeof rangeLimit !== 'number' || ranges.length <= rangeLimit) {
101 if (context && context.onRangeLimitExceeded) {
102 context.onRangeLimitExceeded(document.uri);
105 for (var _i = 0, nestingLevels_1 = nestingLevels; _i < nestingLevels_1.length; _i++) {
106 var level = nestingLevels_1[_i];
108 counts[level] = (counts[level] || 0) + 1;
113 for (var i = 0; i < counts.length; i++) {
116 if (n + entries > rangeLimit) {
124 for (var i = 0; i < ranges.length; i++) {
125 var level = nestingLevels[i];
126 if (typeof level === 'number') {
127 if (level < maxLevel || (level === maxLevel && entries++ < rangeLimit)) {
128 result.push(ranges[i]);
134 exports.getFoldingRanges = getFoldingRanges;