Exemplo n.º 1
0
        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();
        }
Exemplo n.º 2
0
        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);
            }
        }
Exemplo n.º 3
0
        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();
            }
        }
Exemplo n.º 4
0
 public void AddLineSeparator(int position) => output.AddLineSeparator(position);