void EndKeywordBlock(IDecompilerOutput output, BraceInfo info, CodeBracesRangeFlags flags, bool addLineSeparator = false) { output.DecreaseIndent(); var end = output.NextPosition; output.Write("}", BoxedTextColor.Punctuation); output.AddBracePair(new TextSpan(info.Start, 1), new TextSpan(end, 1), flags); if (addLineSeparator) { output.AddLineSeparator(end); } output.WriteLine(); }
public void WriteTo(IDecompilerOutput output) { #if DEBUG for (int i = 1; i < references.Count; i++) { if (references[i - 1].Span.End > references[i].Span.Start) { throw new InvalidOperationException(); } } #endif int outputStart = output.Length; int pos = 0; var textLocal = text; foreach (var info in references) { if (info.Span.Length == 0) { continue; } if (pos < info.Span.Start) { output.Write(textLocal, pos, info.Span.Start - pos, BoxedTextColor.Text); } var flags = DecompilerReferenceFlags.Local; if (info.IsDefinition) { flags |= DecompilerReferenceFlags.Definition; } output.Write(textLocal, info.Span.Start, info.Span.Length, info.Reference, flags, BoxedTextColor.Text); pos = info.Span.End; } if (pos < textLocal.Length) { output.Write(textLocal, pos, textLocal.Length - pos, BoxedTextColor.Text); } Debug.Assert(output.Length - outputStart == textLocal.Length); // Don't add a line separator after the last tag int end = lineSeparators.Count - 1; for (int i = 0; i < end; i++) { output.AddLineSeparator(lineSeparators[i]); } foreach (var info in bracesInfo) { output.AddCodeBracesRange(info); } }
public override void Decompile(TypeDef type, IDecompilerOutput output, DecompilationContext ctx) { this.WriteCommentLine(output, $"Type: {type.FullName}"); if (type.BaseType != null) { WriteCommentBegin(output, true); output.Write("Base type: ", BoxedTextColor.Comment); output.Write(IdentifierEscaper.Escape(type.BaseType.FullName), type.BaseType, DecompilerReferenceFlags.None, BoxedTextColor.Comment); WriteCommentEnd(output, true); output.WriteLine(); } foreach (var nested in type.NestedTypes) { Decompile(nested, output, ctx); output.WriteLine(); } int lastFieldPos = -1; foreach (var field in type.Fields) { Decompile(field, output, ctx); lastFieldPos = output.NextPosition; output.WriteLine(); } if (lastFieldPos >= 0) { output.AddLineSeparator(lastFieldPos); output.WriteLine(); } foreach (var property in type.Properties) { Decompile(property, output, ctx); output.WriteLine(); } foreach (var @event in type.Events) { Decompile(@event, output, ctx); output.WriteLine(); } foreach (var method in type.Methods) { Decompile(method, output, ctx); output.WriteLine(); } }
public void AddLineSeparator(int position) => output.AddLineSeparator(position);