示例#1
0
 protected virtual void FormatTypeName(IDecompilerOutput output, TypeDef type)
 {
     if (type == null)
     {
         throw new ArgumentNullException(nameof(type));
     }
     output.Write(IdentifierEscaper.Escape(type.Name), MetadataTextColorProvider.GetColor(type));
 }
示例#2
0
 internal static string GetFormattedIdentifier(string id)
 {
     if (isKeyword.Contains(id))
     {
         return(IDENTIFIER_ESCAPE + IdentifierEscaper.Escape(id));
     }
     return(IdentifierEscaper.Escape(id));
 }
示例#3
0
 static void WriteIdentifier(ITextOutput output, string id, TextTokenKind tokenKind)
 {
     if (isKeyword.Contains(id))
     {
         output.Write("@", TextTokenKind.Operator);
     }
     output.Write(IdentifierEscaper.Escape(id), tokenKind);
 }
示例#4
0
 protected virtual void FormatPropertyName(IDecompilerOutput output, PropertyDef property, bool?isIndexer = null)
 {
     if (property == null)
     {
         throw new ArgumentNullException(nameof(property));
     }
     output.Write(IdentifierEscaper.Escape(property.Name), MetadataTextColorProvider.GetColor(property));
 }
示例#5
0
 static void WriteIdentifier(IDecompilerOutput output, string id, object tokenKind)
 {
     if (isKeyword.Contains(id))
     {
         output.Write("@", tokenKind);
     }
     output.Write(IdentifierEscaper.Escape(id), tokenKind);
 }
示例#6
0
 protected virtual void FormatTypeName(ITextOutput output, TypeDef type)
 {
     if (type == null)
     {
         throw new ArgumentNullException("type");
     }
     output.Write(IdentifierEscaper.Escape(type.Name), TextTokenKindUtils.GetTextTokenType(type));
 }
示例#7
0
 protected virtual void FormatPropertyName(ITextOutput output, PropertyDef property, bool?isIndexer = null)
 {
     if (property == null)
     {
         throw new ArgumentNullException("property");
     }
     output.Write(IdentifierEscaper.Escape(property.Name), TextTokenKindUtils.GetTextTokenType(property));
 }
示例#8
0
 public virtual void WriteToolTip(ITextOutput output, IVariable variable, string name)
 {
     output.Write(variable is Local ? "(local variable)" : "(parameter)", TextTokenType.Text);
     output.WriteSpace();
     WriteToolTip(output, variable.Type.ToTypeDefOrRef(), variable is Parameter ? ((Parameter)variable).ParamDef : null);
     output.WriteSpace();
     output.Write(IdentifierEscaper.Escape(GetName(variable, name)), variable is Local ? TextTokenType.Local : TextTokenType.Parameter);
 }
示例#9
0
 public static string CleanUpIdentifier(string id)
 {
     if (id == null)
     {
         return(id);
     }
     id = IdentifierEscaper.Escape(id);
     return(CleanUpName(id));
 }
示例#10
0
 /// <summary>
 /// Cleans an identifier
 /// </summary>
 /// <param name="id">Identifier</param>
 /// <returns></returns>
 public static string?CleanIdentifier(string id)
 {
     if (id is null)
     {
         return(id);
     }
     id = IdentifierEscaper.Escape(id);
     return(CleanName(id));
 }
示例#11
0
        public override void WriteIdentifier(Identifier identifier, TextTokenType tokenType)
        {
            if (tokenType == TextTokenType.Text)
            {
                tokenType = TextTokenHelper.GetTextTokenType(identifier.AnnotationVT <TextTokenType>() ?? identifier.Annotation <object>());
            }

            if (tokenType != TextTokenType.Keyword && (identifier.IsVerbatim || CSharpOutputVisitor.IsKeyword(identifier.Name, identifier)))
            {
                output.Write('@', TextTokenType.Operator);
            }

            var definition = GetCurrentDefinition(identifier);

            if (definition != null)
            {
                output.WriteDefinition(IdentifierEscaper.Escape(identifier.Name), definition, tokenType, false);
                return;
            }

            object memberRef = GetCurrentMemberReference();

            if (memberRef != null)
            {
                output.WriteReference(IdentifierEscaper.Escape(identifier.Name), memberRef, tokenType);
                return;
            }

            definition = GetCurrentLocalDefinition();
            if (definition != null)
            {
                output.WriteDefinition(IdentifierEscaper.Escape(identifier.Name), definition, tokenType);
                return;
            }

            memberRef = GetCurrentLocalReference();
            if (memberRef != null)
            {
                output.WriteReference(IdentifierEscaper.Escape(identifier.Name), memberRef, tokenType, true);
                return;
            }

            if (firstUsingDeclaration)
            {
                output.MarkFoldStart(defaultCollapsed: true);
                firstUsingDeclaration = false;
            }

            var s = identifier.Name;

            if (identifier.Annotation <IdentifierFormatted>() == null)
            {
                s = IdentifierEscaper.Escape(s);
            }
            output.Write(s, tokenType);
        }
示例#12
0
 void StartKeywordBlock(IDecompilerOutput output, string keyword, IMemberDef member)
 {
     output.Write(keyword, BoxedTextColor.Keyword);
     output.Write(" ", BoxedTextColor.Text);
     output.Write(IdentifierEscaper.Escape(member.Name), member, DecompilerReferenceFlags.Definition, TextColorHelper.GetColor(member));
     output.Write(" ", BoxedTextColor.Text);
     output.Write("{", BoxedTextColor.Punctuation);
     output.WriteLine();
     output.IncreaseIndent();
 }
示例#13
0
 void StartKeywordBlock(ITextOutput output, string keyword, IMemberDef member)
 {
     output.Write(keyword, TextTokenKind.Keyword);
     output.WriteSpace();
     output.WriteDefinition(IdentifierEscaper.Escape(member.Name), member, TextTokenKindUtils.GetTextTokenType(member), false);
     output.WriteSpace();
     output.WriteLeftBrace();
     output.WriteLine();
     output.Indent();
 }
示例#14
0
        public override void WriteIdentifier(Identifier identifier, TextTokenKind tokenKind)
        {
            if (tokenKind == TextTokenKind.Text)
            {
                tokenKind = TextTokenKindUtils.GetTextTokenType(identifier.AnnotationVT <TextTokenKind>() ?? identifier.Annotation <object>());
            }

            if (tokenKind != TextTokenKind.Keyword && (identifier.IsVerbatim || CSharpOutputVisitor.IsKeyword(identifier.Name, identifier)))
            {
                output.Write("@", TextTokenKind.Operator);
            }

            var definition = GetCurrentDefinition(identifier);

            if (definition != null)
            {
                output.WriteDefinition(IdentifierEscaper.Escape(identifier.Name), definition, tokenKind, false);
                return;
            }

            object memberRef = GetCurrentMemberReference();

            if (memberRef != null)
            {
                output.WriteReference(IdentifierEscaper.Escape(identifier.Name), memberRef, tokenKind);
                return;
            }

            definition = GetCurrentLocalDefinition();
            if (definition != null)
            {
                output.WriteDefinition(IdentifierEscaper.Escape(identifier.Name), definition, tokenKind);
                return;
            }

            memberRef = GetCurrentLocalReference();
            if (memberRef != null)
            {
                output.WriteReference(IdentifierEscaper.Escape(identifier.Name), memberRef, tokenKind, true);
                return;
            }

            if (firstUsingDeclaration)
            {
                firstUsingDeclaration = false;
            }

            var s = identifier.Name;

            if (identifier.Annotation <IdentifierFormatted>() == null)
            {
                s = IdentifierEscaper.Escape(s);
            }
            output.Write(s, tokenKind);
        }
示例#15
0
        void WriteFullTypeName(string fullName)
        {
            string ns, name;

            SplitTypeName(fullName, out ns, out name);
            if (!string.IsNullOrEmpty(ns))
            {
                output.WriteNamespace(ns);
                output.Write(BoxedTextColor.Operator, ".");
            }
            output.Write(BoxedTextColor.Type, IdentifierEscaper.Escape(name));
        }
示例#16
0
        void WriteFullTypeName(string fullName)
        {
            string ns, name;

            SplitTypeName(fullName, out ns, out name);
            if (!string.IsNullOrEmpty(ns))
            {
                output.WriteNamespace(ns);
                output.Write(".", TextTokenKind.Operator);
            }
            output.Write(IdentifierEscaper.Escape(name), TextTokenKind.Type);
        }
示例#17
0
        public override void DecompileAssembly(LoadedAssembly assembly, ITextOutput output, DecompilationOptions options, DecompileAssemblyFlags flags = DecompileAssemblyFlags.AssemblyAndModule)
        {
            if (options.FullDecompilation && options.SaveAsProjectDirectory != null)
            {
                HashSet <string> directories = new HashSet <string>(StringComparer.OrdinalIgnoreCase);
                var files = WriteCodeFilesInProject(assembly.ModuleDefinition, options, directories).ToList();
                files.AddRange(WriteResourceFilesInProject(assembly, options, directories));
                WriteProjectFile(new TextOutputWriter(output), files, assembly, options);
            }
            else
            {
                bool decompileAsm = (flags & DecompileAssemblyFlags.Assembly) != 0;
                bool decompileMod = (flags & DecompileAssemblyFlags.Module) != 0;
                base.DecompileAssembly(assembly, output, options, flags);
                output.WriteLine();
                ModuleDef mainModule = assembly.ModuleDefinition;
                if (decompileMod && mainModule.Types.Count > 0)
                {
                    output.Write("' Global type: ", TextTokenType.Comment);
                    output.WriteReference(IdentifierEscaper.Escape(mainModule.GlobalType.FullName), mainModule.GlobalType, TextTokenType.Comment);
                    output.WriteLine();
                }
                if (decompileMod || decompileAsm)
                {
                    PrintEntryPoint(assembly, output);
                }
                if (decompileMod)
                {
                    WriteCommentLine(output, "Architecture: " + CSharpLanguage.GetPlatformDisplayName(mainModule));
                    if (!mainModule.IsILOnly)
                    {
                        WriteCommentLine(output, "This assembly contains unmanaged code.");
                    }
                    string runtimeName = ICSharpCode.ILSpy.CSharpLanguage.GetRuntimeDisplayName(mainModule);
                    if (runtimeName != null)
                    {
                        WriteCommentLine(output, "Runtime: " + runtimeName);
                    }
                }
                if (decompileMod || decompileAsm)
                {
                    output.WriteLine();
                }

                // don't automatically load additional assemblies when an assembly node is selected in the tree view
                using (options.FullDecompilation ? null : LoadedAssembly.DisableAssemblyLoad()) {
                    AstBuilder codeDomBuilder = CreateAstBuilder(options, currentModule: assembly.ModuleDefinition);
                    codeDomBuilder.AddAssembly(assembly.ModuleDefinition, !options.FullDecompilation, decompileAsm, decompileMod);
                    RunTransformsAndGenerateCode(codeDomBuilder, output, options, assembly.ModuleDefinition);
                }
            }
        }
示例#18
0
        BraceInfo StartKeywordBlock(IDecompilerOutput output, string keyword, IMemberDef member)
        {
            output.Write(keyword, BoxedTextColor.Keyword);
            output.Write(" ", BoxedTextColor.Text);
            output.Write(IdentifierEscaper.Escape(member.Name), member, DecompilerReferenceFlags.Definition, MetadataTextColorProvider.GetColor(member));
            output.Write(" ", BoxedTextColor.Text);
            var start = output.NextPosition;

            output.Write("{", BoxedTextColor.Punctuation);
            output.WriteLine();
            output.IncreaseIndent();
            return(new BraceInfo(start));
        }
示例#19
0
 public override void Decompile(Language language, ITextOutput output, DecompilationOptions options)
 {
     App.Current.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(EnsureChildrenFiltered));
     // Show metadata order of references
     foreach (var r in module.GetAssemblyRefs())
     {
         new AssemblyReferenceTreeNode(r, parentAssembly, assemblyListTreeNode).Decompile(language, output, options);
     }
     foreach (var r in module.GetModuleRefs())
     {
         language.WriteCommentLine(output, IdentifierEscaper.Escape(r.Name));
     }
 }
示例#20
0
 public static string Escape(string identifier)
 {
     if (!MustEscape(identifier))
     {
         return(IdentifierEscaper.LimitIdentifierLength(identifier));
     }
     else
     {
         // The ECMA specification says that ' inside SQString should be ecaped using an octal escape sequence,
         // but we follow Microsoft's ILDasm and use \'.
         return("'" + IdentifierEscaper.LimitIdentifierLength(NRefactory.CSharp.TextWriterTokenWriter.ConvertString(identifier).Replace("'", "\\'")) + "'");
     }
 }
示例#21
0
        internal static void WriteNamespace(ITextOutput writer, string ns)
        {
            var parts = ns.Split('.');

            for (int i = 0; i < parts.Length; i++)
            {
                if (i > 0)
                {
                    writer.Write('.', TextTokenType.Operator);
                }
                writer.Write(IdentifierEscaper.Escape(parts[i]), TextTokenType.NamespacePart);
            }
        }
示例#22
0
 public virtual void DecompileNamespace(string @namespace, IEnumerable <TypeDef> types, IDecompilerOutput output, DecompilationContext ctx)
 {
     this.WriteCommentLine(output, string.IsNullOrEmpty(@namespace) ? string.Empty : IdentifierEscaper.Escape(@namespace));
     this.WriteCommentLine(output, string.Empty);
     this.WriteCommentLine(output, dnSpy_Decompiler_Resources.Decompile_Namespace_Types);
     this.WriteCommentLine(output, string.Empty);
     foreach (var type in types)
     {
         WriteCommentBegin(output, true);
         output.Write(IdentifierEscaper.Escape(type.Name), type, DecompilerReferenceFlags.None, BoxedTextColor.Comment);
         WriteCommentEnd(output, true);
         output.WriteLine();
     }
 }
示例#23
0
 public virtual void DecompileNamespace(string @namespace, IEnumerable <TypeDef> types, ITextOutput output, DecompilationContext ctx)
 {
     this.WriteCommentLine(output, string.IsNullOrEmpty(@namespace) ? string.Empty : IdentifierEscaper.Escape(@namespace));
     this.WriteCommentLine(output, string.Empty);
     this.WriteCommentLine(output, Languages_Resources.Decompile_Namespace_Types);
     this.WriteCommentLine(output, string.Empty);
     foreach (var type in types)
     {
         this.WriteCommentBegin(output, true);
         output.WriteReference(IdentifierEscaper.Escape(type.Name), type, TextTokenKind.Comment);
         this.WriteCommentEnd(output, true);
         output.WriteLine();
     }
 }
示例#24
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();
            }
        }
示例#25
0
 protected virtual void TypeToString(IDecompilerOutput output, ITypeDefOrRef type, bool includeNamespace, IHasCustomAttribute typeAttributes = null)
 {
     if (type == null)
     {
         return;
     }
     if (includeNamespace)
     {
         output.Write(IdentifierEscaper.Escape(type.FullName), MetadataTextColorProvider.GetColor(type));
     }
     else
     {
         output.Write(IdentifierEscaper.Escape(type.Name), MetadataTextColorProvider.GetColor(type));
     }
 }
示例#26
0
 public virtual void TypeToString(ITextOutput output, ITypeDefOrRef type, bool includeNamespace, IHasCustomAttribute typeAttributes = null)
 {
     if (type == null)
     {
         return;
     }
     if (includeNamespace)
     {
         output.Write(IdentifierEscaper.Escape(type.FullName), TextTokenHelper.GetTextTokenType(type));
     }
     else
     {
         output.Write(IdentifierEscaper.Escape(type.Name), TextTokenHelper.GetTextTokenType(type));
     }
 }
示例#27
0
        internal static void WriteNamespace(ITextOutput writer, string ns)
        {
            var parts = ns.Split('.');

            for (int i = 0; i < parts.Length; i++)
            {
                if (i > 0)
                {
                    writer.Write(".", TextTokenKind.Operator);
                }
                var nsPart = parts[i];
                if (!string.IsNullOrEmpty(nsPart))
                {
                    writer.Write(IdentifierEscaper.Escape(nsPart), TextTokenKind.NamespacePart);
                }
            }
        }
示例#28
0
        public override void WriteIdentifier(Identifier identifier, TextTokenType tokenType)
        {
            if (tokenType == TextTokenType.Text)
            {
                tokenType = TextTokenHelper.GetTextTokenType(identifier.AnnotationVT <TextTokenType>() ?? identifier.Annotation <object>());
            }

            var definition = GetCurrentDefinition(identifier);

            if (definition != null)
            {
                output.WriteDefinition(IdentifierEscaper.Escape(identifier.Name), definition, tokenType, false);
                return;
            }

            object memberRef = GetCurrentMemberReference();

            if (memberRef != null)
            {
                output.WriteReference(IdentifierEscaper.Escape(identifier.Name), memberRef, tokenType);
                return;
            }

            definition = GetCurrentLocalDefinition();
            if (definition != null)
            {
                output.WriteDefinition(IdentifierEscaper.Escape(identifier.Name), definition, tokenType);
                return;
            }

            memberRef = GetCurrentLocalReference();
            if (memberRef != null)
            {
                output.WriteReference(IdentifierEscaper.Escape(identifier.Name), memberRef, tokenType, true);
                return;
            }

            if (firstUsingDeclaration)
            {
                output.MarkFoldStart(defaultCollapsed: true);
                firstUsingDeclaration = false;
            }

            output.Write(IdentifierEscaper.Escape(identifier.Name), tokenType);
        }
示例#29
0
 public static ITextOutput Write(ITextOutput output, string name)
 {
     if (name.Length == 0)
     {
         output.Write('-', TextTokenType.Operator);
     }
     else
     {
         var parts = name.Split('.');
         for (int i = 0; i < parts.Length; i++)
         {
             if (i > 0)
             {
                 output.Write('.', TextTokenType.Operator);
             }
             output.Write(IdentifierEscaper.Escape(parts[i]), TextTokenType.NamespacePart);
         }
     }
     return(output);
 }
示例#30
0
        void WriteAttributeId(BamlContext ctx, ushort id)
        {
            string declType;
            string name;

            if (id > 0x7fff)
            {
                var knownMember = ctx.KnownThings.Members((KnownMembers)(-id));
                declType = knownMember.DeclaringType.FullName;
                name     = knownMember.Name;
            }
            else if (ctx.AttributeIdMap.ContainsKey(id))
            {
                var attrInfo = ctx.AttributeIdMap[id];
                if (attrInfo.OwnerTypeId > 0x7fff)
                {
                    declType = ctx.KnownThings.Types((KnownTypes)(-attrInfo.OwnerTypeId)).FullName;
                }
                else if (ctx.TypeIdMap.ContainsKey(attrInfo.OwnerTypeId))
                {
                    declType = ctx.TypeIdMap[attrInfo.OwnerTypeId].TypeFullName;
                }
                else
                {
                    declType = $"(0x{attrInfo.OwnerTypeId:x4})";
                }
                name = attrInfo.Name;
            }
            else
            {
                declType = name = null;
            }

            string reference = null;

            if (declType is not null && name is not null)
            {
                reference = $"{IdentifierEscaper.Escape(declType)}::{IdentifierEscaper.Escape(name)}";
            }
            output.Write($"0x{id:x4}", BamlToolTipReference.Create(reference), DecompilerReferenceFlags.Local, BoxedTextColor.Number);
        }