mirror of https://github.com/icsharpcode/ILSpy.git
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							228 lines
						
					
					
						
							5.6 KiB
						
					
					
				
			
		
		
	
	
							228 lines
						
					
					
						
							5.6 KiB
						
					
					
				// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) | 
						|
// This code is distributed under MIT X11 license (for details please see \doc\license.txt) | 
						|
 | 
						|
using System; | 
						|
using System.Collections; | 
						|
using System.Text; | 
						|
 | 
						|
namespace ICSharpCode.NRefactory.VB.PrettyPrinter | 
						|
{ | 
						|
	/// <summary> | 
						|
	/// Base class of output formatters. | 
						|
	/// </summary> | 
						|
	public abstract class AbstractOutputFormatter : IOutputFormatter | 
						|
	{ | 
						|
		StringBuilder text = new StringBuilder(); | 
						|
		 | 
						|
		int           indentationLevel = 0; | 
						|
		bool          indent         = true; | 
						|
		bool          doNewLine      = true; | 
						|
		AbstractPrettyPrintOptions prettyPrintOptions; | 
						|
		 | 
						|
		public bool IsInMemberBody { get; set; } | 
						|
		 | 
						|
		public int IndentationLevel { | 
						|
			get { | 
						|
				return indentationLevel; | 
						|
			} | 
						|
			set { | 
						|
				indentationLevel = value; | 
						|
			} | 
						|
		} | 
						|
		 | 
						|
		public string Text { | 
						|
			get { | 
						|
				return text.ToString(); | 
						|
			} | 
						|
		} | 
						|
		 | 
						|
		public int TextLength { | 
						|
			get { | 
						|
				return text.Length; | 
						|
			} | 
						|
		} | 
						|
		 | 
						|
		 | 
						|
		public bool DoIndent { | 
						|
			get { | 
						|
				return indent; | 
						|
			} | 
						|
			set { | 
						|
				indent = value; | 
						|
			} | 
						|
		} | 
						|
		 | 
						|
		public bool DoNewLine { | 
						|
			get { | 
						|
				return doNewLine; | 
						|
			} | 
						|
			set { | 
						|
				doNewLine = value; | 
						|
			} | 
						|
		} | 
						|
		 | 
						|
		protected AbstractOutputFormatter(AbstractPrettyPrintOptions prettyPrintOptions) | 
						|
		{ | 
						|
			this.prettyPrintOptions = prettyPrintOptions; | 
						|
		} | 
						|
		 | 
						|
		internal bool isIndented = false; | 
						|
		public void Indent() | 
						|
		{ | 
						|
			if (DoIndent) { | 
						|
				int indent = 0; | 
						|
				while (indent < prettyPrintOptions.IndentSize * indentationLevel) { | 
						|
					char ch = prettyPrintOptions.IndentationChar; | 
						|
					if (ch == '\t' && indent + prettyPrintOptions.TabSize > prettyPrintOptions.IndentSize * indentationLevel) { | 
						|
						ch = ' '; | 
						|
					} | 
						|
					text.Append(ch); | 
						|
					if (ch == '\t') { | 
						|
						indent += prettyPrintOptions.TabSize; | 
						|
					} else { | 
						|
						++indent; | 
						|
					} | 
						|
				} | 
						|
				isIndented = true; | 
						|
			} | 
						|
		} | 
						|
		 | 
						|
		public void Reset () | 
						|
		{ | 
						|
			text.Length = 0; | 
						|
			isIndented = false; | 
						|
		} | 
						|
		 | 
						|
		public void Space() | 
						|
		{ | 
						|
			text.Append(' '); | 
						|
			isIndented = false; | 
						|
		} | 
						|
		 | 
						|
		internal int lastLineStart = 0; | 
						|
		internal int lineBeforeLastStart = 0; | 
						|
		 | 
						|
		public bool LastCharacterIsNewLine { | 
						|
			get { | 
						|
				return text.Length == lastLineStart; | 
						|
			} | 
						|
		} | 
						|
		 | 
						|
		public bool LastCharacterIsWhiteSpace { | 
						|
			get { | 
						|
				return text.Length == 0 || char.IsWhiteSpace(text[text.Length - 1]); | 
						|
			} | 
						|
		} | 
						|
		 | 
						|
		public virtual void NewLine() | 
						|
		{ | 
						|
			if (DoNewLine) { | 
						|
				if (!LastCharacterIsNewLine) { | 
						|
					lineBeforeLastStart = lastLineStart; | 
						|
				} | 
						|
				text.AppendLine(); | 
						|
				lastLineStart = text.Length; | 
						|
				isIndented = false; | 
						|
			} | 
						|
		} | 
						|
		 | 
						|
		public virtual void EndFile() | 
						|
		{ | 
						|
		} | 
						|
		 | 
						|
		protected void WriteLineInPreviousLine(string txt, bool forceWriteInPreviousBlock) | 
						|
		{ | 
						|
			WriteInPreviousLine(txt + Environment.NewLine, forceWriteInPreviousBlock); | 
						|
		} | 
						|
		protected void WriteLineInPreviousLine(string txt, bool forceWriteInPreviousBlock, bool indent) | 
						|
		{ | 
						|
			WriteInPreviousLine(txt + Environment.NewLine, forceWriteInPreviousBlock, indent); | 
						|
		} | 
						|
		 | 
						|
		protected void WriteInPreviousLine(string txt, bool forceWriteInPreviousBlock) | 
						|
		{ | 
						|
			WriteInPreviousLine(txt, forceWriteInPreviousBlock, true); | 
						|
		} | 
						|
		protected void WriteInPreviousLine(string txt, bool forceWriteInPreviousBlock, bool indent) | 
						|
		{ | 
						|
			if (txt.Length == 0) return; | 
						|
			 | 
						|
			bool lastCharacterWasNewLine = LastCharacterIsNewLine; | 
						|
			if (lastCharacterWasNewLine) { | 
						|
				if (forceWriteInPreviousBlock == false) { | 
						|
					if (indent && txt != Environment.NewLine) Indent(); | 
						|
					text.Append(txt); | 
						|
					lineBeforeLastStart = lastLineStart; | 
						|
					lastLineStart = text.Length; | 
						|
					return; | 
						|
				} | 
						|
				lastLineStart = lineBeforeLastStart; | 
						|
			} | 
						|
			string lastLine = text.ToString(lastLineStart, text.Length - lastLineStart); | 
						|
			text.Remove(lastLineStart, text.Length - lastLineStart); | 
						|
			if (indent && txt != Environment.NewLine) { | 
						|
				if (forceWriteInPreviousBlock) ++indentationLevel; | 
						|
				Indent(); | 
						|
				if (forceWriteInPreviousBlock) --indentationLevel; | 
						|
			} | 
						|
			text.Append(txt); | 
						|
			lineBeforeLastStart = lastLineStart; | 
						|
			lastLineStart = text.Length; | 
						|
			text.Append(lastLine); | 
						|
			if (lastCharacterWasNewLine) { | 
						|
				lineBeforeLastStart = lastLineStart; | 
						|
				lastLineStart = text.Length; | 
						|
			} | 
						|
			isIndented = false; | 
						|
		} | 
						|
		 | 
						|
		/// <summary> | 
						|
		/// Prints a text that cannot be inserted before using WriteInPreviousLine | 
						|
		/// into the current line | 
						|
		/// </summary> | 
						|
		protected void PrintSpecialText(string specialText) | 
						|
		{ | 
						|
			lineBeforeLastStart = text.Length; | 
						|
			text.Append(specialText); | 
						|
			lastLineStart = text.Length; | 
						|
			isIndented = false; | 
						|
		} | 
						|
		 | 
						|
		public void PrintTokenList(ArrayList tokenList) | 
						|
		{ | 
						|
			foreach (int token in tokenList) { | 
						|
				PrintToken(token); | 
						|
				Space(); | 
						|
			} | 
						|
		} | 
						|
		 | 
						|
//		public abstract void PrintComment(Comment comment, bool forceWriteInPreviousBlock); | 
						|
		 | 
						|
//		public virtual void PrintPreprocessingDirective(PreprocessingDirective directive, bool forceWriteInPreviousBlock) | 
						|
//		{ | 
						|
//			if (!directive.Expression.IsNull) { | 
						|
////				CSharpOutputVisitor visitor = new CSharpOutputVisitor(); | 
						|
////				directive.Expression.AcceptVisitor(visitor, null); | 
						|
////				WriteLineInPreviousLine(directive.Cmd + " " + visitor.Text, forceWriteInPreviousBlock); | 
						|
//			} else if (string.IsNullOrEmpty(directive.Arg)) | 
						|
//				WriteLineInPreviousLine(directive.Cmd, forceWriteInPreviousBlock); | 
						|
//			else | 
						|
//				WriteLineInPreviousLine(directive.Cmd + " " + directive.Arg, forceWriteInPreviousBlock); | 
						|
//		} | 
						|
		 | 
						|
		public void PrintBlankLine(bool forceWriteInPreviousBlock) | 
						|
		{ | 
						|
			WriteInPreviousLine(Environment.NewLine, forceWriteInPreviousBlock); | 
						|
		} | 
						|
		 | 
						|
		public abstract void PrintToken(int token); | 
						|
		 | 
						|
		public void PrintText(string text) | 
						|
		{ | 
						|
			this.text.Append(text); | 
						|
			isIndented = false; | 
						|
		} | 
						|
		 | 
						|
		public abstract void PrintIdentifier(string identifier); | 
						|
	} | 
						|
}
 | 
						|
 |