/// <summary> /// Create <see cref="NewFolding"/>s for the specified document. /// </summary> public IEnumerable <NewFolding> CreateNewFoldings(ITextSource document) { var newFoldings = new List <NewFolding>(); var startOffsets = new Stack <int>(); var lastNewLineOffset = 0; var currentIndex = 0; var json = document.Text; //for (var i = 0; i < document.TextLength; i++) //{ // var c = document.GetCharAt(i); // if (c == '{') // { // startOffsets.Push(i); // } // else if (c == '}' && startOffsets.Count > 0) // { // var startOffset = startOffsets.Pop(); // // don't fold if opening and closing brace are on the same line // if (startOffset < lastNewLineOffset) // { // newFoldings.Add(new NewFolding(startOffset, i + 1)); // } // } // else if (c == '\n' || c == '\r') // { // lastNewLineOffset = i + 1; // } //} while (true) { //¿ªÊ¼±ê¼Ç var index = json.IndexOfAny(Braces, currentIndex); if (index == -1) { break; } currentIndex = index + 1; var brace = json.Substring(index, 1); if (OpeningBrace.Contains(brace)) { startOffsets.Push(index); } else if (ClosingBrace.Contains(brace) && startOffsets.Any()) { var start = startOffsets.Pop(); if (start < lastNewLineOffset) { newFoldings.Add(new NewFolding(start, index + 1)); } } else if (Line.Contains(brace)) { lastNewLineOffset = index + 1; } } newFoldings.Sort((a, b) => a.StartOffset.CompareTo(b.StartOffset)); return(newFoldings); }
private int countEndBlock(string text) { int res = 0; List <string> words = Folding.VerilogFoldingStrategy.MySplit(text); foreach (string s in words) { if (ClosingBrace.Contains(s)) { res++; } } return(res); }