예제 #1
0
 static void WriteLong(this ITextColorWriter output, InstructionVM instr)
 {
     output.WriteShort(instr);
     output.WriteSpace();
     output.Write(BoxedTextColor.OpCode, instr.Code.ToOpCode().Name);
     output.WriteSpace();
     Write(output, instr.InstructionOperandVM);
 }
예제 #2
0
 static void Write(this ITextColorWriter output, IList <InstructionVM> instrs)
 {
     output.Write(BoxedTextColor.Punctuation, "[");
     for (int i = 0; i < instrs.Count; i++)
     {
         if (i > 0)
         {
             output.Write(BoxedTextColor.Punctuation, ",");
             output.WriteSpace();
         }
         output.WriteShort(instrs[i]);
     }
     output.Write(BoxedTextColor.Punctuation, "]");
 }
예제 #3
0
        public static void WriteObject(ITextColorWriter output, object obj, WriteObjectFlags flags = WriteObjectFlags.None)
        {
            if (IsNull(obj))
            {
                output.Write(BoxedTextColor.Keyword, "null");
                return;
            }

            var mr = obj as IMemberRef;

            if (mr != null)
            {
                if (simpleILPrinter.Write(TextColorWriterToDecompilerOutput.Create(output), mr))
                {
                    return;
                }
            }

            var local = obj as LocalVM;

            if (local != null)
            {
                output.Write(BoxedTextColor.Local, IdentifierEscaper.Escape(GetLocalName(local.Name, local.Index)));
                output.WriteSpace();
                output.WriteLocalParameterIndex(local.Index);
                return;
            }

            var parameter = obj as Parameter;

            if (parameter != null)
            {
                if (parameter.IsHiddenThisParameter)
                {
                    output.Write(BoxedTextColor.Keyword, "this");
                }
                else
                {
                    output.Write(BoxedTextColor.Parameter, IdentifierEscaper.Escape(GetParameterName(parameter.Name, parameter.Index)));
                    output.WriteSpace();
                    output.WriteLocalParameterIndex(parameter.Index);
                }
                return;
            }

            var instr = obj as InstructionVM;

            if (instr != null)
            {
                if ((flags & WriteObjectFlags.ShortInstruction) != 0)
                {
                    output.WriteShort(instr);
                }
                else
                {
                    output.WriteLong(instr);
                }
                return;
            }

            var instrs = obj as IList <InstructionVM>;

            if (instrs != null)
            {
                output.Write(instrs);
                return;
            }

            var methodSig = obj as MethodSig;

            if (methodSig != null)
            {
                simpleILPrinter.Write(TextColorWriterToDecompilerOutput.Create(output), methodSig);
                return;
            }

            if (obj is TypeSig)
            {
                simpleILPrinter.Write(TextColorWriterToDecompilerOutput.Create(output), obj as TypeSig);
                return;
            }

            if (obj is Code)
            {
                output.Write(BoxedTextColor.OpCode, ((Code)obj).ToOpCode().Name);
                return;
            }

            // This code gets called by the combobox and it sometimes passes in the empty string.
            // It's never shown in the UI.
            Debug.Assert(string.Empty.Equals(obj), "Shouldn't be here");
            output.Write(BoxedTextColor.Text, obj.ToString());
        }