Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/addins/CSharpBinding/MonoDevelop.JSon/JSonIndentEngine.cs')
-rw-r--r--main/src/addins/CSharpBinding/MonoDevelop.JSon/JSonIndentEngine.cs290
1 files changed, 290 insertions, 0 deletions
diff --git a/main/src/addins/CSharpBinding/MonoDevelop.JSon/JSonIndentEngine.cs b/main/src/addins/CSharpBinding/MonoDevelop.JSon/JSonIndentEngine.cs
new file mode 100644
index 0000000000..320000b80b
--- /dev/null
+++ b/main/src/addins/CSharpBinding/MonoDevelop.JSon/JSonIndentEngine.cs
@@ -0,0 +1,290 @@
+//
+// JSonTextEditorExtension.cs
+//
+// Author:
+// Mike Krüger <mkrueger@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.Text;
+using ICSharpCode.NRefactory6.CSharp;
+using ICSharpCode.NRefactory6;
+using MonoDevelop.Ide.Editor;
+using Microsoft.CodeAnalysis.Text;
+using MonoDevelop.Ide.TypeSystem;
+
+namespace MonoDevelop.JSon
+{
+ class JSonIndentEngine : IStateMachineIndentEngine
+ {
+ TextEditor editor;
+ DocumentContext ctx;
+ int offset, line, column;
+ internal Indent thisLineIndent, nextLineIndent;
+ StringBuilder currentIndent;
+ // char previousNewline = '\0';
+ char previousChar = '\0';
+ bool isLineStart;
+ bool isInString;
+
+ public JSonIndentEngine (TextEditor editor, DocumentContext ctx)
+ {
+ if (editor == null)
+ throw new ArgumentNullException ("editor");
+ if (ctx == null)
+ throw new ArgumentNullException ("ctx");
+ this.editor = editor;
+ this.ctx = ctx;
+ Reset ();
+ }
+
+ #region IStateMachineIndentEngine implementation
+
+ public IStateMachineIndentEngine Clone ()
+ {
+ return (IStateMachineIndentEngine)MemberwiseClone ();
+ }
+
+ public bool IsInsidePreprocessorDirective {
+ get {
+ return false;
+ }
+ }
+
+ public bool IsInsidePreprocessorComment {
+ get {
+ return false;
+ }
+ }
+
+ public bool IsInsideStringLiteral {
+ get {
+ return false;
+ }
+ }
+
+ public bool IsInsideVerbatimString {
+ get {
+ return false;
+ }
+ }
+
+ public bool IsInsideCharacter {
+ get {
+ return false;
+ }
+ }
+
+ public bool IsInsideString {
+ get {
+ return isInString;
+ }
+ }
+
+ public bool IsInsideLineComment {
+ get {
+ return false;
+ }
+ }
+
+ public bool IsInsideMultiLineComment {
+ get {
+ return false;
+ }
+ }
+
+ public bool IsInsideDocLineComment {
+ get {
+ return false;
+ }
+ }
+
+ public bool IsInsideComment {
+ get {
+ return false;
+ }
+ }
+
+ public bool IsInsideOrdinaryComment {
+ get {
+ return false;
+ }
+ }
+
+ public bool IsInsideOrdinaryCommentOrString {
+ get {
+ return false;
+ }
+ }
+
+ public bool LineBeganInsideVerbatimString {
+ get {
+ return false;
+ }
+ }
+
+ public bool LineBeganInsideMultiLineComment {
+ get {
+ return false;
+ }
+ }
+
+ #endregion
+
+ #region IDocumentIndentEngine implementation
+
+ public void Push (char ch)
+ {
+ var isNewLine = NewLine.IsNewLine (ch);
+ if (!isNewLine) {
+ if (ch == '"')
+ isInString = !IsInsideString;
+ if (ch == '{' || ch == '[') {
+ nextLineIndent.Push (IndentType.Block);
+ } else if (ch == '}' || ch == ']') {
+ if (thisLineIndent.Count > 0)
+ thisLineIndent.Pop ();
+ if (nextLineIndent.Count > 0)
+ nextLineIndent.Pop ();
+ }
+ } else {
+ if (ch == NewLine.LF && previousChar == NewLine.CR) {
+ offset++;
+ previousChar = ch;
+ return;
+ }
+ }
+
+ offset++;
+ if (!isNewLine) {
+ // previousNewline = '\0';
+
+ isLineStart &= char.IsWhiteSpace (ch);
+
+ if (isLineStart)
+ currentIndent.Append (ch);
+
+ if (ch == '\t') {
+ var nextTabStop = (column - 1 + editor.Options.IndentationSize) / editor.Options.IndentationSize;
+ column = 1 + nextTabStop * editor.Options.IndentationSize;
+ } else {
+ column++;
+ }
+ } else {
+ // previousNewline = ch;
+ currentIndent.Length = 0;
+ isLineStart = true;
+ column = 1;
+ line++;
+ thisLineIndent = nextLineIndent.Clone ();
+ }
+ previousChar = ch;
+ }
+
+ public void Reset ()
+ {
+ offset = 0;
+ line = column = 1;
+ thisLineIndent = new Indent (ctx.GetOptionSet ());
+ nextLineIndent = new Indent (ctx.GetOptionSet ());
+ currentIndent = new StringBuilder ();
+ // previousNewline = '\0';
+ previousChar = '\0';
+ isLineStart = true;
+ isInString = false;
+ }
+
+ public void Update (SourceText sourceText, int offset)
+ {
+ if (Offset > offset)
+ Reset ();
+
+ while (Offset < offset) {
+ Push (sourceText [Offset]);
+ }
+ }
+
+ IDocumentIndentEngine IDocumentIndentEngine.Clone ()
+ {
+ return Clone ();
+ }
+
+ SourceText sourceText;
+ public SourceText Document {
+ get {
+ return sourceText ?? (sourceText = new MonoDevelopSourceText (editor));
+ }
+ }
+
+ public string ThisLineIndent {
+ get {
+ return thisLineIndent.IndentString;
+ }
+ }
+
+ public string NextLineIndent {
+ get {
+ return nextLineIndent.IndentString;
+ }
+ }
+
+ public string CurrentIndent {
+ get {
+ return currentIndent.ToString ();
+ }
+ }
+
+ public bool NeedsReindent {
+ get {
+ return ThisLineIndent != CurrentIndent;
+ }
+ }
+
+ public int Offset {
+ get {
+ return offset;
+ }
+ }
+//
+// public TextLocation Location {
+// get {
+// return new TextLocation (line, column);
+// }
+// }
+
+ public bool EnableCustomIndentLevels {
+ get;
+ set;
+ }
+
+ #endregion
+
+ #region ICloneable implementation
+
+ object ICloneable.Clone ()
+ {
+ return Clone ();
+ }
+
+ #endregion
+ }
+}
+