예제 #1
0
        public void WriteEvent(EventDefinition definition, ISourceCodeOutput output, DecompilerOptions options)
        {
            output.WriteDefinition(".event ", definition);
            output.Write(definition.EventType.ToShortTypeName() + " ");
            output.Write(definition.Name + " ");

            OpenBlock(output);

            if (definition.HasCustomAttributes)
            {
                WriteCustomAttributes(definition.CustomAttributes, output);
            }

            if (definition.AddMethod != null)
            {
                var setter = definition.AddMethod;
                output.Write(".addon ");
                if (setter.HasThis)
                {
                    output.Write("instance ");
                }

                output.Write(
                    setter.ReturnType.IsPrimitive || setter.IsVoid()
          ? setter.ReturnType.Name.ToLowerInvariant()
          : setter.ReturnType.FullName);

                output.WriteSpace();
                //setter.ReturnType == setter.Module.TypeSystem.Void
                //setter.ReturnType.FullName + " " + (setter.DeclaringType.FullName + "::" + setter.Name) + MethodSignatureFullName(setter)
                output.WriteLine("{0}::{1}{2}", setter.DeclaringType.FullName, setter.Name, MethodSignatureFullName(setter));
            }

            if (definition.RemoveMethod != null)
            {
                var getter = definition.RemoveMethod;
                output.Write(".removeon ");
                if (getter.HasThis)
                {
                    output.Write("instance ");
                }

                output.Write(
                    getter.ReturnType.IsPrimitive || getter.IsVoid()
          ? getter.ReturnType.Name.ToLowerInvariant()
          : getter.ReturnType.FullName);

                output.WriteSpace();
                output.WriteLine("{0}::{1}{2}", getter.DeclaringType.FullName, getter.Name, MethodSignatureFullName(getter));
            }

            CloseBlock(output);
        }
예제 #2
0
        public void WriteProperty(PropertyDefinition definition, ISourceCodeOutput output, DecompilerOptions options)
        {
            output.WriteDefinition(".property ", definition);
            output.Write(definition.HasThis ? "instance " : "class ");
            if (definition.PropertyType.IsValueType && !definition.PropertyType.IsPrimitive)
            {
                output.Write("valuetype ");
            }

            output.Write(definition.PropertyType.ToShortTypeName() + " ");
            output.Write(definition.Name);

            OpenBlock(output);

            if (definition.HasCustomAttributes)
            {
                WriteCustomAttributes(definition.CustomAttributes, output);
            }

            if (definition.HasGetter())
            {
                var getter     = definition.GetMethod;
                var returnType = getter.MethodReturnType.ReturnType;
                output.Write(".get ");
                if (getter.HasThis)
                {
                    output.Write("instance ");
                }
                if (returnType.IsValueType && !returnType.IsPrimitive)
                {
                    output.Write("valuetype ");
                }
                // TODO: To be unwrapped
                output.WriteLine(getter.ToString());
            }

            if (definition.HasSetter())
            {
                var setter = definition.SetMethod;
                output.Write(".set ");
                if (setter.HasThis)
                {
                    output.Write("instance ");
                }
                output.WriteLine(setter.ToString());
            }

            CloseBlock(output);
        }
예제 #3
0
    public void WriteMethod(MethodDefinition definition, ISourceCodeOutput output, DecompilerOptions options)
    {
      output.WriteDefinition(".method ", definition);
      WriteMethodName(definition, output, options);

      OpenBlock(output);

      if (definition.HasCustomAttributes)
        WriteCustomAttributes(definition.CustomAttributes, output);

      if (definition.HasBody && options != null && options.FullDecompilation)
      {
        output.WriteLine(".maxstack {0}", definition.Body.MaxStackSize);
        WriteMethodLocals(definition, output);
        foreach (var instruction in definition.Body.Instructions)
          output.WriteLine(instruction.ToString());
      }

      CloseBlock(output);
    }
예제 #4
0
        public void WriteMethod(MethodDefinition definition, ISourceCodeOutput output, DecompilerOptions options)
        {
            output.WriteDefinition(".method ", definition);
            WriteMethodName(definition, output, options);

            OpenBlock(output);

            if (definition.HasCustomAttributes)
            {
                WriteCustomAttributes(definition.CustomAttributes, output);
            }

            if (definition.HasBody && options != null && options.FullDecompilation)
            {
                output.WriteLine(".maxstack {0}", definition.Body.MaxStackSize);
                WriteMethodLocals(definition, output);
                foreach (var instruction in definition.Body.Instructions)
                {
                    output.WriteLine(instruction.ToString());
                }
            }

            CloseBlock(output);
        }
예제 #5
0
        public void WriteType(TypeDefinition definition, ISourceCodeOutput output, DecompilerOptions options)
        {
            output.WriteDefinition(".class ", definition);

            //if (definition.IsClass || definition.IsInterface) builder.AppendFormat("{0}.class ", indent);
            if (definition.IsPublic || definition.IsNestedPublic)
            {
                output.Write("public ");
            }
            if (definition.IsNotPublic || definition.IsNestedPrivate)
            {
                output.Write("private ");
            }
            if (definition.IsInterface)
            {
                output.Write("interface ");
            }
            if (definition.IsAbstract)
            {
                output.Write("abstract ");
            }
            if (definition.IsSequentialLayout)
            {
                output.Write("sequential ");
            }
            if (definition.IsAutoLayout)
            {
                output.Write("auto ");
            }
            if (definition.IsAnsiClass)
            {
                output.Write("ansi ");
            }
            if (definition.IsSealed)
            {
                output.Write("sealed ");
            }
            if (definition.IsNested)
            {
                output.Write("nested ");
            }
            if (definition.IsNestedFamily)
            {
                output.Write("family ");
            }
            if (definition.IsBeforeFieldInit)
            {
                output.Write("beforefieldinit ");
            }

            output.Write(definition.ToShortTypeName());

            if (definition.BaseType != null)
            {
                output.WriteLine();
                output.Indent();
                output.Write("extends {0}", definition.BaseType.ToShortTypeName());
                output.Unindent();
            }

            if (definition.HasInterfaces)
            {
                output.WriteLine();
                output.Indent();
                output.Write("implements ");

                for (int i = 0; i < definition.Interfaces.Count; i++)
                {
                    if (i > 0)
                    {
                        output.Write(", ");
                    }
                    output.Write(definition.Interfaces[i].FullName);
                }
                output.Unindent();
            }

            OpenBlock(output);

            if (definition.HasCustomAttributes)
            {
                WriteCustomAttributes(definition.CustomAttributes, output);
                output.WriteLine();
            }

            if (options != null && options.FullDecompilation)
            {
                if (definition.HasNestedTypes)
                {
                    foreach (var nestedType in definition.NestedTypes.OrderBy(t => t.Name))
                    {
                        WriteType(nestedType, output, options);
                        output.WriteLine();
                    }
                }

                if (definition.HasMethods)
                {
                    foreach (var method in definition.Methods.OrderBy(m => m.Name))
                    {
                        if (method.IsGetter || method.IsSetter)
                        {
                            continue;
                        }
                        if (method.IsAddOn || method.IsRemoveOn)
                        {
                            continue;
                        }
                        WriteMethod(method, output, null);
                        output.WriteLine();
                    }
                }

                if (definition.HasProperties)
                {
                    foreach (var property in definition.Properties.OrderBy(p => p.Name))
                    {
                        WriteProperty(property, output, null);
                        output.WriteLine();
                    }
                }

                if (definition.HasEvents)
                {
                    foreach (var eventDefinition in definition.Events.OrderBy(e => e.Name))
                    {
                        WriteEvent(eventDefinition, output, null);
                        output.WriteLine();
                    }
                }

                if (definition.HasFields)
                {
                    foreach (var field in definition.Fields.OrderBy(f => f.Name))
                    {
                        WriteField(field, output, null);
                        output.WriteLine();
                    }
                }
            }

            CloseBlock(output);
        }
예제 #6
0
        // TODO: look at ILSpy WriteEnum/WriteFlags helpers
        public void WriteField(FieldDefinition definition, ISourceCodeOutput output, DecompilerOptions options)
        {
            output.WriteDefinition(".field ", definition);

            if (definition.IsAssembly)
            {
                output.Write("assembly ");
            }
            if (definition.IsFamily)
            {
                output.Write("family ");
            }
            if (definition.IsPrivate)
            {
                output.Write("private ");
            }
            if (definition.IsPublic)
            {
                output.Write("public ");
            }
            if (definition.IsStatic)
            {
                output.Write("static ");
            }
            if (!definition.FieldType.IsPrimitive && definition.FieldType.IsValueType)
            {
                output.Write("valuetype ");
            }
            if (definition.IsSpecialName)
            {
                output.Write("specialname ");
            }
            if (definition.IsRuntimeSpecialName)
            {
                output.Write("rtspecialname ");
            }
            if (definition.IsLiteral)
            {
                output.Write("literal ");
            }
            if (definition.IsInitOnly)
            {
                output.Write("initonly ");
            }
            output.Write(definition.FieldType.ToShortTypeName() + " ");
            output.Write(definition.Name + " ");

            if (definition.HasConstant)
            {
                string valueFormat = definition.FieldType == definition.Module.TypeSystem.String ? "'{0}'" : "{0}";
                output.Write(" = {0}({1})", definition.FieldType.FullName, string.Format(valueFormat, definition.Constant.ToString()));
            }

            if (definition.HasCustomAttributes)
            {
                OpenBlock(output);
                WriteCustomAttributes(definition.CustomAttributes, output);
                CloseBlock(output);
            }

            output.WriteLine();
        }
예제 #7
0
    public void WriteType(TypeDefinition definition, ISourceCodeOutput output, DecompilerOptions options)
    {
      output.WriteDefinition(".class ", definition);

      //if (definition.IsClass || definition.IsInterface) builder.AppendFormat("{0}.class ", indent);
      if (definition.IsPublic || definition.IsNestedPublic) output.Write("public ");
      if (definition.IsNotPublic || definition.IsNestedPrivate) output.Write("private ");
      if (definition.IsInterface) output.Write("interface ");
      if (definition.IsAbstract) output.Write("abstract ");
      if (definition.IsSequentialLayout) output.Write("sequential ");
      if (definition.IsAutoLayout) output.Write("auto ");
      if (definition.IsAnsiClass) output.Write("ansi ");
      if (definition.IsSealed) output.Write("sealed ");
      if (definition.IsNested) output.Write("nested ");
      if (definition.IsNestedFamily) output.Write("family ");
      if (definition.IsBeforeFieldInit) output.Write("beforefieldinit ");

      output.Write(definition.ToShortTypeName());

      if (definition.BaseType != null)
      {
        output.WriteLine();
        output.Indent();
        output.Write("extends {0}", definition.BaseType.ToShortTypeName());
        output.Unindent();
      }

      if (definition.HasInterfaces)
      {
        output.WriteLine();
        output.Indent();
        output.Write("implements ");

        for (int i = 0; i < definition.Interfaces.Count; i++)
        {
          if (i > 0) output.Write(", ");
          output.Write(definition.Interfaces[i].FullName);
        }
        output.Unindent();
      }

      OpenBlock(output);

      if (definition.HasCustomAttributes)
      {
        WriteCustomAttributes(definition.CustomAttributes, output);
        output.WriteLine();
      }

      if (options != null && options.FullDecompilation)
      {
        if (definition.HasNestedTypes)
        {
          foreach (var nestedType in definition.NestedTypes.OrderBy(t => t.Name))
          {
            WriteType(nestedType, output, options);
            output.WriteLine();
          }
        }

        if (definition.HasMethods)
        {
          foreach (var method in definition.Methods.OrderBy(m => m.Name))
          {
            if (method.IsGetter || method.IsSetter) continue;
            if (method.IsAddOn || method.IsRemoveOn) continue;
            WriteMethod(method, output, null);
            output.WriteLine();
          }
        }

        if (definition.HasProperties)
        {
          foreach (var property in definition.Properties.OrderBy(p => p.Name))
          {
            WriteProperty(property, output, null);
            output.WriteLine();
          }
        }

        if (definition.HasEvents)
        {
          foreach (var eventDefinition in definition.Events.OrderBy(e => e.Name))
          {
            WriteEvent(eventDefinition, output, null);
            output.WriteLine();
          }
        }

        if (definition.HasFields)
        {
          foreach (var field in definition.Fields.OrderBy(f => f.Name))
          {
            WriteField(field, output, null);
            output.WriteLine();
          }
        }
      }

      CloseBlock(output);
    }
예제 #8
0
    public void WriteEvent(EventDefinition definition, ISourceCodeOutput output, DecompilerOptions options)
    {
      output.WriteDefinition(".event ", definition);
      output.Write(definition.EventType.ToShortTypeName() + " ");
      output.Write(definition.Name + " ");

      OpenBlock(output);

      if (definition.HasCustomAttributes)
        WriteCustomAttributes(definition.CustomAttributes, output);

      if (definition.AddMethod != null)
      {
        var setter = definition.AddMethod;
        output.Write(".addon ");
        if (setter.HasThis) output.Write("instance ");

        output.Write(
          setter.ReturnType.IsPrimitive || setter.IsVoid()
          ? setter.ReturnType.Name.ToLowerInvariant()
          : setter.ReturnType.FullName);

        output.WriteSpace();
        //setter.ReturnType == setter.Module.TypeSystem.Void
        //setter.ReturnType.FullName + " " + (setter.DeclaringType.FullName + "::" + setter.Name) + MethodSignatureFullName(setter)
        output.WriteLine("{0}::{1}{2}", setter.DeclaringType.FullName, setter.Name, MethodSignatureFullName(setter));
      }

      if (definition.RemoveMethod != null)
      {
        var getter = definition.RemoveMethod;
        output.Write(".removeon ");
        if (getter.HasThis) output.Write("instance ");

        output.Write(
          getter.ReturnType.IsPrimitive || getter.IsVoid()
          ? getter.ReturnType.Name.ToLowerInvariant()
          : getter.ReturnType.FullName);

        output.WriteSpace();
        output.WriteLine("{0}::{1}{2}", getter.DeclaringType.FullName, getter.Name, MethodSignatureFullName(getter));
      }

      CloseBlock(output);
    }
예제 #9
0
    // TODO: look at ILSpy WriteEnum/WriteFlags helpers
    public void WriteField(FieldDefinition definition, ISourceCodeOutput output, DecompilerOptions options)
    {
      output.WriteDefinition(".field ", definition);

      if (definition.IsAssembly) output.Write("assembly ");
      if (definition.IsFamily) output.Write("family ");
      if (definition.IsPrivate) output.Write("private ");
      if (definition.IsPublic) output.Write("public ");
      if (definition.IsStatic) output.Write("static ");
      if (!definition.FieldType.IsPrimitive && definition.FieldType.IsValueType) output.Write("valuetype ");
      if (definition.IsSpecialName) output.Write("specialname ");
      if (definition.IsRuntimeSpecialName) output.Write("rtspecialname ");
      if (definition.IsLiteral) output.Write("literal ");
      if (definition.IsInitOnly) output.Write("initonly ");
      output.Write(definition.FieldType.ToShortTypeName() + " ");
      output.Write(definition.Name + " ");

      if (definition.HasConstant)
      {
        string valueFormat = definition.FieldType == definition.Module.TypeSystem.String ? "'{0}'" : "{0}";
        output.Write(" = {0}({1})", definition.FieldType.FullName, string.Format(valueFormat, definition.Constant.ToString()));
      }

      if (definition.HasCustomAttributes)
      {
        OpenBlock(output);
        WriteCustomAttributes(definition.CustomAttributes, output);
        CloseBlock(output);
      }

      output.WriteLine();
    }
예제 #10
0
    public void WriteProperty(PropertyDefinition definition, ISourceCodeOutput output, DecompilerOptions options)
    {
      output.WriteDefinition(".property ", definition);
      output.Write(definition.HasThis ? "instance " : "class ");
      if (definition.PropertyType.IsValueType && !definition.PropertyType.IsPrimitive)
        output.Write("valuetype ");

      output.Write(definition.PropertyType.ToShortTypeName() + " ");
      output.Write(definition.Name);

      OpenBlock(output);

      if (definition.HasCustomAttributes)
        WriteCustomAttributes(definition.CustomAttributes, output);

      if (definition.HasGetter())
      {
        var getter = definition.GetMethod;
        var returnType = getter.MethodReturnType.ReturnType;
        output.Write(".get ");
        if (getter.HasThis) output.Write("instance ");
        if (returnType.IsValueType && !returnType.IsPrimitive) output.Write("valuetype ");
        // TODO: To be unwrapped
        output.WriteLine(getter.ToString());
      }

      if (definition.HasSetter())
      {
        var setter = definition.SetMethod;
        output.Write(".set ");
        if (setter.HasThis) output.Write("instance ");
        output.WriteLine(setter.ToString());
      }

      CloseBlock(output);
    }