/* Copyright (C) 2014-2019 de4dot@gmail.com This file is part of dnSpy dnSpy is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. dnSpy is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with dnSpy. If not, see . */ using System; using dnSpy.Contracts.Text; namespace dnSpy.Contracts.Decompiler { /// /// Converts a to a /// public sealed class TextColorWriterToDecompilerOutput : IDecompilerOutput { readonly ITextColorWriter output; readonly Indenter indenter; int offset; bool addIndent = true; /// /// Creates a new instance /// /// Output to use /// public static IDecompilerOutput Create(ITextColorWriter output) => new TextColorWriterToDecompilerOutput(output); TextColorWriterToDecompilerOutput(ITextColorWriter output) { this.output = output; indenter = new Indenter(4, 4, true); offset = 0; } int IDecompilerOutput.Length => offset; int IDecompilerOutput.NextPosition => offset + (addIndent ? indenter.String.Length : 0); bool IDecompilerOutput.UsesCustomData => false; void IDecompilerOutput.AddCustomData(string id, TData data) { } void IDecompilerOutput.IncreaseIndent() => indenter.IncreaseIndent(); void IDecompilerOutput.DecreaseIndent() => indenter.DecreaseIndent(); void IDecompilerOutput.Write(string text, int index, int length, object color) { if (index == 0 && text.Length == length) ((IDecompilerOutput)this).Write(text, color); else ((IDecompilerOutput)this).Write(text.Substring(index, length), color); } void IDecompilerOutput.Write(string text, object color) { if (addIndent) { var s = indenter.String; if (s.Length != 0) output.Write(BoxedTextColor.Text, s); offset += s.Length; } output.Write(color, text); offset += text.Length; addIndent = text.LastIndexOfAny(newLineChars) == text.Length - 1; } static readonly char[] newLineChars = new char[] { '\r', '\n', '\u0085', '\u2028', '\u2029' }; void IDecompilerOutput.Write(string text, object? reference, DecompilerReferenceFlags flags, object color) => ((IDecompilerOutput)this).Write(text, color); void IDecompilerOutput.Write(string text, int index, int length, object? reference, DecompilerReferenceFlags flags, object color) => ((IDecompilerOutput)this).Write(text, index, length, color); void IDecompilerOutput.WriteLine() => ((IDecompilerOutput)this).Write(Environment.NewLine, BoxedTextColor.Text); } }