Пример #1
0
        void DisassembleRecord(BamlContext ctx, BamlRecord record)
        {
            if (BamlNode.IsFooter(record))
            {
                while (scopeStack.Count > 0 && !BamlNode.IsMatch(scopeStack.Peek(), record))
                {
                    scopeStack.Pop();
                    output.DecreaseIndent();
                }
                if (scopeStack.Count > 0)
                {
                    scopeStack.Pop();
                    output.DecreaseIndent();
                }
            }

            output.Write(record.Type.ToString(), BamlToolTipReference.Create(GetRecordReference(record)), DecompilerReferenceFlags.Local | DecompilerReferenceFlags.Definition, BoxedTextColor.Keyword);

            if (handlerMap.TryGetValue(record.Type, out var handler))
            {
                output.Write(" [", BoxedTextColor.Text);
                handler(ctx, record);
                output.Write("]", BoxedTextColor.Text);
            }

            output.WriteLine();

            if (BamlNode.IsHeader(record))
            {
                scopeStack.Push(record);
                output.IncreaseIndent();
            }
        }
Пример #2
0
        void DisassembleRecord(BamlContext ctx, BamlRecord record)
        {
            if (BamlNode.IsFooter(record))
            {
                while (scopeStack.Count > 0 && !BamlNode.IsMatch(scopeStack.Peek(), record))
                {
                    scopeStack.Pop();
                    output.Unindent();
                }
                if (scopeStack.Count > 0)
                {
                    scopeStack.Pop();
                    output.Unindent();
                }
            }

            output.WriteDefinition(record.Type.ToString(), BamlToolTipReference.Create(GetRecordReference(record)), TextTokenKind.Keyword, true);

            Action <BamlContext, BamlRecord> handler;

            if (handlerMap.TryGetValue(record.Type, out handler))
            {
                output.Write(" [", TextTokenKind.Text);
                handler(ctx, record);
                output.Write("]", TextTokenKind.Text);
            }

            output.WriteLine();

            if (BamlNode.IsHeader(record))
            {
                scopeStack.Push(record);
                output.Indent();
            }
        }
Пример #3
0
        void WriteAssemblyId(BamlContext ctx, ushort id)
        {
            string reference;

            if (id == 0xffff)
            {
                reference = ctx.KnownThings.FrameworkAssembly.FullName;
            }
            else if (ctx.AssemblyIdMap.ContainsKey(id))
            {
                reference = ctx.AssemblyIdMap[id].AssemblyFullName;
            }
            else
            {
                reference = null;
            }
            output.Write($"0x{id:x4}", BamlToolTipReference.Create(reference), DecompilerReferenceFlags.Local, BoxedTextColor.Number);
        }
Пример #4
0
        void WriteAssemblyId(BamlContext ctx, ushort id)
        {
            string reference;

            if (id == 0xffff)
            {
                reference = ctx.KnownThings.FrameworkAssembly.FullName;
            }
            else if (ctx.AssemblyIdMap.ContainsKey(id))
            {
                reference = ctx.AssemblyIdMap[id].AssemblyFullName;
            }
            else
            {
                reference = null;
            }
            output.WriteReference(string.Format("0x{0:x4}", id), BamlToolTipReference.Create(reference), TextTokenKind.Number, true);
        }
Пример #5
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);
        }
Пример #6
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 = string.Format("(0x{0:x4})", attrInfo.OwnerTypeId);
                }
                name = attrInfo.Name;
            }
            else
            {
                declType = name = null;
            }

            string reference = null;

            if (declType != null && name != null)
            {
                reference = string.Format("{0}::{1}", IdentifierEscaper.Escape(declType), IdentifierEscaper.Escape(name));
            }
            output.WriteReference(string.Format("0x{0:x4}", id), BamlToolTipReference.Create(reference), TextTokenKind.Number, true);
        }
Пример #7
0
        void WriteStringId(BamlContext ctx, ushort id)
        {
            string str;

            if (id > 0x7fff)
            {
                str = ctx.KnownThings.Strings((short)-id);
            }
            else if (ctx.StringIdMap.ContainsKey(id))
            {
                str = ctx.StringIdMap[id].Value;
            }
            else
            {
                str = null;
            }
            string reference = null;

            if (str is not null)
            {
                reference = SimpleTypeConverter.ToString(str, true);
            }
            output.Write($"0x{id:x4}", BamlToolTipReference.Create(reference), DecompilerReferenceFlags.Local, BoxedTextColor.Number);
        }
Пример #8
0
        void WriteTypeId(BamlContext ctx, ushort id)
        {
            string reference;

            if (id > 0x7fff)
            {
                reference = ctx.KnownThings.Types((KnownTypes)(-id)).FullName;
            }
            else if (ctx.TypeIdMap.ContainsKey(id))
            {
                reference = ctx.TypeIdMap[id].TypeFullName;
            }
            else
            {
                reference = null;
            }

            if (reference is not null)
            {
                reference = IdentifierEscaper.Escape(reference);
            }

            output.Write($"0x{id:x4}", BamlToolTipReference.Create(reference), DecompilerReferenceFlags.Local, BoxedTextColor.Number);
        }
Пример #9
0
        void WriteStringId(BamlContext ctx, ushort id)
        {
            string str;

            if (id > 0x7fff)
            {
                str = ctx.KnownThings.Strings((short)-id);
            }
            else if (ctx.StringIdMap.ContainsKey(id))
            {
                str = ctx.StringIdMap[id].Value;
            }
            else
            {
                str = null;
            }
            string reference = null;

            if (str != null)
            {
                reference = NumberVMUtils.ToString(str, true);
            }
            output.WriteReference(string.Format("0x{0:x4}", id), BamlToolTipReference.Create(reference), TextTokenKind.Number, true);
        }
Пример #10
0
        void WriteTypeId(BamlContext ctx, ushort id)
        {
            string reference;

            if (id > 0x7fff)
            {
                reference = ctx.KnownThings.Types((KnownTypes)(-id)).FullName;
            }
            else if (ctx.TypeIdMap.ContainsKey(id))
            {
                reference = ctx.TypeIdMap[id].TypeFullName;
            }
            else
            {
                reference = null;
            }

            if (reference != null)
            {
                reference = IdentifierEscaper.Escape(reference);
            }

            output.WriteReference(string.Format("0x{0:x4}", id), BamlToolTipReference.Create(reference), TextTokenKind.Number, true);
        }
Пример #11
0
 void WriteRecordRef(BamlRecord record) => output.Write(record.Type.ToString(), BamlToolTipReference.Create(GetRecordReference(record)), DecompilerReferenceFlags.Local, BoxedTextColor.Keyword);
Пример #12
0
        void WriteDefinition(string value, string def = null)
        {
            string str = SimpleTypeConverter.ToString(value, true);

            output.Write(str, BamlToolTipReference.Create(def ?? IdentifierEscaper.Escape(value)), DecompilerReferenceFlags.Local | DecompilerReferenceFlags.Definition, BoxedTextColor.String);
        }
Пример #13
0
 void WriteRecordRef(BamlRecord record)
 {
     output.WriteReference(record.Type.ToString(), BamlToolTipReference.Create(GetRecordReference(record)), TextTokenKind.Keyword, true);
 }
Пример #14
0
        void WriteDefinition(string value, string def = null)
        {
            string str = NumberVMUtils.ToString(value, true);

            output.WriteDefinition(str, BamlToolTipReference.Create(def ?? IdentifierEscaper.Escape(value)), TextTokenKind.String, true);
        }