--- /dev/null
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+(function (factory) {
+ if (typeof module === "object" && typeof module.exports === "object") {
+ var v = factory(require, exports);
+ if (v !== undefined) module.exports = v;
+ }
+ else if (typeof define === "function" && define.amd) {
+ define(["require", "exports", "jsonc-parser", "../jsonLanguageTypes"], factory);
+ }
+})(function (require, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ exports.getFoldingRanges = void 0;
+ var jsonc_parser_1 = require("jsonc-parser");
+ var jsonLanguageTypes_1 = require("../jsonLanguageTypes");
+ function getFoldingRanges(document, context) {
+ var ranges = [];
+ var nestingLevels = [];
+ var stack = [];
+ var prevStart = -1;
+ var scanner = jsonc_parser_1.createScanner(document.getText(), false);
+ var token = scanner.scan();
+ function addRange(range) {
+ ranges.push(range);
+ nestingLevels.push(stack.length);
+ }
+ while (token !== 17 /* EOF */) {
+ switch (token) {
+ case 1 /* OpenBraceToken */:
+ case 3 /* OpenBracketToken */: {
+ var startLine = document.positionAt(scanner.getTokenOffset()).line;
+ var range = { startLine: startLine, endLine: startLine, kind: token === 1 /* OpenBraceToken */ ? 'object' : 'array' };
+ stack.push(range);
+ break;
+ }
+ case 2 /* CloseBraceToken */:
+ case 4 /* CloseBracketToken */: {
+ var kind = token === 2 /* CloseBraceToken */ ? 'object' : 'array';
+ if (stack.length > 0 && stack[stack.length - 1].kind === kind) {
+ var range = stack.pop();
+ var line = document.positionAt(scanner.getTokenOffset()).line;
+ if (range && line > range.startLine + 1 && prevStart !== range.startLine) {
+ range.endLine = line - 1;
+ addRange(range);
+ prevStart = range.startLine;
+ }
+ }
+ break;
+ }
+ case 13 /* BlockCommentTrivia */: {
+ var startLine = document.positionAt(scanner.getTokenOffset()).line;
+ var endLine = document.positionAt(scanner.getTokenOffset() + scanner.getTokenLength()).line;
+ if (scanner.getTokenError() === 1 /* UnexpectedEndOfComment */ && startLine + 1 < document.lineCount) {
+ scanner.setPosition(document.offsetAt(jsonLanguageTypes_1.Position.create(startLine + 1, 0)));
+ }
+ else {
+ if (startLine < endLine) {
+ addRange({ startLine: startLine, endLine: endLine, kind: jsonLanguageTypes_1.FoldingRangeKind.Comment });
+ prevStart = startLine;
+ }
+ }
+ break;
+ }
+ case 12 /* LineCommentTrivia */: {
+ var text = document.getText().substr(scanner.getTokenOffset(), scanner.getTokenLength());
+ var m = text.match(/^\/\/\s*#(region\b)|(endregion\b)/);
+ if (m) {
+ var line = document.positionAt(scanner.getTokenOffset()).line;
+ if (m[1]) { // start pattern match
+ var range = { startLine: line, endLine: line, kind: jsonLanguageTypes_1.FoldingRangeKind.Region };
+ stack.push(range);
+ }
+ else {
+ var i = stack.length - 1;
+ while (i >= 0 && stack[i].kind !== jsonLanguageTypes_1.FoldingRangeKind.Region) {
+ i--;
+ }
+ if (i >= 0) {
+ var range = stack[i];
+ stack.length = i;
+ if (line > range.startLine && prevStart !== range.startLine) {
+ range.endLine = line;
+ addRange(range);
+ prevStart = range.startLine;
+ }
+ }
+ }
+ }
+ break;
+ }
+ }
+ token = scanner.scan();
+ }
+ var rangeLimit = context && context.rangeLimit;
+ if (typeof rangeLimit !== 'number' || ranges.length <= rangeLimit) {
+ return ranges;
+ }
+ if (context && context.onRangeLimitExceeded) {
+ context.onRangeLimitExceeded(document.uri);
+ }
+ var counts = [];
+ for (var _i = 0, nestingLevels_1 = nestingLevels; _i < nestingLevels_1.length; _i++) {
+ var level = nestingLevels_1[_i];
+ if (level < 30) {
+ counts[level] = (counts[level] || 0) + 1;
+ }
+ }
+ var entries = 0;
+ var maxLevel = 0;
+ for (var i = 0; i < counts.length; i++) {
+ var n = counts[i];
+ if (n) {
+ if (n + entries > rangeLimit) {
+ maxLevel = i;
+ break;
+ }
+ entries += n;
+ }
+ }
+ var result = [];
+ for (var i = 0; i < ranges.length; i++) {
+ var level = nestingLevels[i];
+ if (typeof level === 'number') {
+ if (level < maxLevel || (level === maxLevel && entries++ < rangeLimit)) {
+ result.push(ranges[i]);
+ }
+ }
+ }
+ return result;
+ }
+ exports.getFoldingRanges = getFoldingRanges;
+});