public static void WriteTo(this ITypeDefOrRef type, ITextOutput writer, ILNameSyntax syntax = ILNameSyntax.Signature)
		{
			if (type is TypeSpec) {
				((TypeSpec)type).TypeSig.WriteTo(writer, syntax);
				return;
			}

			string name = PrimitiveTypeName(type.FullName);
			if (syntax == ILNameSyntax.ShortTypeName) {
				if (name != null)
					writer.WriteKeyword(name);
				else
					writer.WriteReference(Escape(type.Name), type);
			}
			else if ((syntax == ILNameSyntax.Signature || syntax == ILNameSyntax.SignatureNoNamedTypeParameters) && name != null) {
				writer.WriteKeyword(name);
			}
			else {
				if (syntax == ILNameSyntax.Signature || syntax == ILNameSyntax.SignatureNoNamedTypeParameters)
					writer.WriteKeyword(type.IsValueType ? "valuetype " : "class ");

				if (type.DeclaringType != null) {
					type.DeclaringType.WriteTo(writer, ILNameSyntax.TypeName);
					writer.Write('/');
					writer.WriteReference(Escape(type.Name), type);
				}
				else {
					if (!(type is TypeDef) && type.Scope != null) {
						IAssembly assembly;
						if (type.Scope is IAssembly)
							assembly = (IAssembly)type.Scope;
						else if (type.Scope is ModuleRef)
							assembly = ((ModuleRef)type.Scope).DefinitionAssembly;
						else if (type.Scope is ModuleDef)
							assembly = ((ModuleDef)type.Scope).Assembly;
						else
							throw new NotSupportedException();
						writer.Write("[");
						writer.WriteReference(Escape(assembly.Name), assembly);
						writer.Write("]");
					}
					writer.WriteReference(Escape(type.FullName), type);
				}
			}
		}
コード例 #2
0
        public static void WriteTo(this ITypeDefOrRef type, ITextOutput writer, ILNameSyntax syntax, int depth)
        {
            if (depth++ > MAX_CONVERTTYPE_DEPTH || type == null)
                return;
            var ts = type as TypeSpec;
            if (ts != null && !(ts.TypeSig is FnPtrSig)) {
                WriteTo(((TypeSpec)type).TypeSig, writer, syntax, depth);
                return;
            }
            string typeFullName = type.FullName;
            string typeName = type.Name.String;
            if (ts != null) {
                var fnPtrSig = ts.TypeSig as FnPtrSig;
                typeFullName = DnlibExtensions.GetFnPtrFullName(fnPtrSig);
                typeName = DnlibExtensions.GetFnPtrName(fnPtrSig);
            }
            TypeSig typeSig = null;
            string name = type.DefinitionAssembly.IsCorLib() ? PrimitiveTypeName(typeFullName, type.Module, out typeSig) : null;
            if (syntax == ILNameSyntax.ShortTypeName) {
                if (name != null)
                    WriteKeyword(writer, name, typeSig.ToTypeDefOrRef());
                else
                    writer.WriteReference(Escape(typeName), type, TextTokenHelper.GetTextTokenType(type));
            } else if ((syntax == ILNameSyntax.Signature || syntax == ILNameSyntax.SignatureNoNamedTypeParameters) && name != null) {
                WriteKeyword(writer, name, typeSig.ToTypeDefOrRef());
            } else {
                if (syntax == ILNameSyntax.Signature || syntax == ILNameSyntax.SignatureNoNamedTypeParameters) {
                    writer.Write(DnlibExtensions.IsValueType(type) ? "valuetype" : "class", TextTokenType.Keyword);
                    writer.WriteSpace();
                }

                if (type.DeclaringType != null) {
                    type.DeclaringType.WriteTo(writer, ILNameSyntax.TypeName, depth);
                    writer.Write('/', TextTokenType.Operator);
                    writer.WriteReference(Escape(typeName), type, TextTokenHelper.GetTextTokenType(type));
                } else {
                    if (!(type is TypeDef) && type.Scope != null && !(type is TypeSpec)) {
                        writer.Write('[', TextTokenType.Operator);
                        writer.Write(Escape(type.Scope.GetScopeName()), TextTokenType.ILModule);
                        writer.Write(']', TextTokenType.Operator);
                    }
                    if (ts != null || MustEscape(typeFullName))
                        writer.WriteReference(Escape(typeFullName), type, TextTokenHelper.GetTextTokenType(type));
                    else {
                        WriteNamespace(writer, type.Namespace);
                        if (!string.IsNullOrEmpty(type.Namespace))
                            writer.Write('.', TextTokenType.Operator);
                        writer.WriteReference(IdentifierEscaper.Escape(type.Name), type, TextTokenHelper.GetTextTokenType(type));
                    }
                }
            }
        }
		public static void WriteTo(this TypeSig type, ITextOutput writer, ILNameSyntax syntax = ILNameSyntax.Signature)
		{
			ILNameSyntax syntaxForElementTypes = syntax == ILNameSyntax.SignatureNoNamedTypeParameters ? syntax : ILNameSyntax.Signature;
			if (type is PinnedSig) {
				type.Next.WriteTo(writer, syntaxForElementTypes);
				writer.WriteKeyword(" pinned");
			} else if (type is SZArraySig) {
				type.Next.WriteTo(writer, syntaxForElementTypes);
				writer.Write("[]");
			} else if (type is ArraySig) {
				ArraySig sig = (ArraySig)type;
				type.Next.WriteTo(writer, syntaxForElementTypes);
				writer.Write('[');
				for (int i = 0; i < sig.Rank; i++) {
					if (i != 0)
						writer.Write(", ");
					int? lower = i < sig.LowerBounds.Count ? sig.LowerBounds[i] : (int?)null;
					uint? size = i < sig.Sizes.Count ? sig.Sizes[i] : (uint?)null;
					if (lower != null) {
						writer.Write(lower.ToString());
						writer.Write("..");
						if (size != null)
							writer.Write((lower.Value + (int)size.Value - 1).ToString());
						else
							writer.Write(".");
					}
				}
				writer.Write(']');
			} else if (type is GenericSig) {
				writer.Write('!');
				if (type is GenericMVar)
					writer.Write('!');
				var genericParam = ((GenericSig)type).GenericParam;
				if (genericParam == null || string.IsNullOrEmpty(genericParam.Name) ||
					syntax == ILNameSyntax.SignatureNoNamedTypeParameters)
					writer.Write(((GenericSig)type).Number.ToString());
				else
					writer.Write(Escape(genericParam.Name));
			} else if (type is ByRefSig) {
				type.Next.WriteTo(writer, syntaxForElementTypes);
				writer.Write('&');
			} else if (type is PtrSig) {
				type.Next.WriteTo(writer, syntaxForElementTypes);
				writer.Write('*');
			} else if (type is GenericInstSig) {
				((GenericInstSig)type).GenericType.WriteTo(writer, syntaxForElementTypes);
				writer.Write('<');
				var arguments = ((GenericInstSig)type).GenericArguments;
				for (int i = 0; i < arguments.Count; i++) {
					if (i > 0)
						writer.Write(", ");
					arguments[i].WriteTo(writer, syntaxForElementTypes);
				}
				writer.Write('>');
			} else if (type is CModOptSig) {
				type.Next.WriteTo(writer, syntax);
				writer.WriteKeyword(" modopt(");
				((CModOptSig)type).Modifier.WriteTo(writer, ILNameSyntax.TypeName);
				writer.WriteKeyword(") ");
			} else if (type is CModReqdSig) {
				type.Next.WriteTo(writer, syntax);
				writer.WriteKeyword(" modreq(");
				((CModReqdSig)type).Modifier.WriteTo(writer, ILNameSyntax.TypeName);
				writer.WriteKeyword(") ");
			} else if (type is ValueArraySig) {
				type.Next.WriteTo(writer, syntax);
				writer.WriteKeyword(" ValueArray(");
				writer.Write(((ValueArraySig)type).Size.ToString());
				writer.WriteKeyword(") ");
			} else if (type is ModuleSig) {
				type.Next.WriteTo(writer, syntax);
				writer.WriteKeyword(" Module(");
				writer.Write(((ModuleSig)type).Index.ToString());
				writer.WriteKeyword(") ");
			} else if (type is FnPtrSig) {
				((FnPtrSig)type).MethodSig.WriteTo(null, writer);
			} else if (type is TypeDefOrRefSig) {
				((TypeDefOrRefSig)type).TypeDefOrRef.WriteTo(writer, syntax);
			}
		}
コード例 #4
0
 public static void WriteTo(this TypeSig type, ITextOutput writer, ILNameSyntax syntax, int depth)
 {
     if (depth++ > MAX_CONVERTTYPE_DEPTH)
         return;
     ILNameSyntax syntaxForElementTypes = syntax == ILNameSyntax.SignatureNoNamedTypeParameters ? syntax : ILNameSyntax.Signature;
     if (type is PinnedSig) {
         ((PinnedSig)type).Next.WriteTo(writer, syntaxForElementTypes, depth);
         writer.WriteSpace();
         writer.Write("pinned", TextTokenType.Keyword);
     } else if (type is ArraySig) {
         ArraySig at = (ArraySig)type;
         at.Next.WriteTo(writer, syntaxForElementTypes, depth);
         writer.Write('[', TextTokenType.Operator);
         for (int i = 0; i < at.Rank; i++)
         {
             if (i != 0) {
                 writer.Write(',', TextTokenType.Operator);
                 writer.WriteSpace();
             }
             int? lower = i < at.LowerBounds.Count ? at.LowerBounds[i] : (int?)null;
             uint? size = i < at.Sizes.Count ? at.Sizes[i] : (uint?)null;
             if (lower != null)
             {
                 writer.Write(lower.ToString(), TextTokenType.Number);
                 if (size != null) {
                     writer.Write("..", TextTokenType.Operator);
                     writer.Write((lower.Value + (int)size.Value - 1).ToString(), TextTokenType.Number);
                 }
                 else
                     writer.Write("...", TextTokenType.Operator);
             }
         }
         writer.Write(']', TextTokenType.Operator);
     } else if (type is SZArraySig) {
         SZArraySig at = (SZArraySig)type;
         at.Next.WriteTo(writer, syntaxForElementTypes, depth);
         writer.Write("[]", TextTokenType.Operator);
     } else if (type is GenericSig) {
         if (((GenericSig)type).IsMethodVar)
             writer.Write("!!", TextTokenType.Operator);
         else
             writer.Write("!", TextTokenType.Operator);
         string typeName = type.TypeName;
         if (string.IsNullOrEmpty(typeName) || typeName[0] == '!' || syntax == ILNameSyntax.SignatureNoNamedTypeParameters)
             writer.Write(((GenericSig)type).Number.ToString(), TextTokenType.Number);
         else
             writer.Write(Escape(typeName), TextTokenHelper.GetTextTokenType(type));
     } else if (type is ByRefSig) {
         ((ByRefSig)type).Next.WriteTo(writer, syntaxForElementTypes, depth);
         writer.Write('&', TextTokenType.Operator);
     } else if (type is PtrSig) {
         ((PtrSig)type).Next.WriteTo(writer, syntaxForElementTypes, depth);
         writer.Write('*', TextTokenType.Operator);
     } else if (type is GenericInstSig) {
         ((GenericInstSig)type).GenericType.WriteTo(writer, syntaxForElementTypes, depth);
         writer.Write('<', TextTokenType.Operator);
         var arguments = ((GenericInstSig)type).GenericArguments;
         for (int i = 0; i < arguments.Count; i++) {
             if (i > 0) {
                 writer.Write(',', TextTokenType.Operator);
                 writer.WriteSpace();
             }
             arguments[i].WriteTo(writer, syntaxForElementTypes, depth);
         }
         writer.Write('>', TextTokenType.Operator);
     } else if (type is CModOptSig) {
         ((ModifierSig)type).Next.WriteTo(writer, syntax, depth);
         writer.WriteSpace();
         writer.Write("modopt", TextTokenType.Keyword);
         writer.Write('(', TextTokenType.Operator);
         ((ModifierSig)type).Modifier.WriteTo(writer, ILNameSyntax.TypeName, depth);
         writer.Write(')', TextTokenType.Operator);
         writer.WriteSpace();
     }
     else if (type is CModReqdSig) {
         ((ModifierSig)type).Next.WriteTo(writer, syntax, depth);
         writer.WriteSpace();
         writer.Write("modreq", TextTokenType.Keyword);
         writer.Write('(', TextTokenType.Operator);
         ((ModifierSig)type).Modifier.WriteTo(writer, ILNameSyntax.TypeName, depth);
         writer.Write(')', TextTokenType.Operator);
         writer.WriteSpace();
     }
     else if (type is TypeDefOrRefSig) {
         WriteTo(((TypeDefOrRefSig)type).TypeDefOrRef, writer, syntax, depth);
     } else if (type is FnPtrSig) {
         WriteTo(type.ToTypeDefOrRef(), writer, syntax, depth);
     }
     //TODO: SentinelSig
 }
コード例 #5
0
 public static void WriteTo(this ITypeDefOrRef type, ITextOutput writer, ILNameSyntax syntax = ILNameSyntax.Signature)
 {
     type.WriteTo(writer, syntax, 0);
 }
コード例 #6
0
ファイル: DisassemblerHelpers.cs プロジェクト: xornand/dnSpy
        public static void WriteTo(this ITypeDefOrRef type, ITextOutput writer, ILNameSyntax syntax, int depth)
        {
            if (depth++ > MAX_CONVERTTYPE_DEPTH || type == null)
            {
                return;
            }
            var ts = type as TypeSpec;

            if (ts != null && !(ts.TypeSig is FnPtrSig))
            {
                WriteTo(((TypeSpec)type).TypeSig, writer, syntax, depth);
                return;
            }
            string typeFullName = type.FullName;
            string typeName     = type.Name.String;

            if (ts != null)
            {
                var fnPtrSig = ts.TypeSig as FnPtrSig;
                typeFullName = DnlibExtensions.GetFnPtrFullName(fnPtrSig);
                typeName     = DnlibExtensions.GetFnPtrName(fnPtrSig);
            }
            TypeSig typeSig = null;
            string  name    = type.DefinitionAssembly.IsCorLib() ? PrimitiveTypeName(typeFullName, type.Module, out typeSig) : null;

            if (syntax == ILNameSyntax.ShortTypeName)
            {
                if (name != null)
                {
                    WriteKeyword(writer, name, typeSig.ToTypeDefOrRef());
                }
                else
                {
                    writer.WriteReference(Escape(typeName), type, TextTokenHelper.GetTextTokenType(type));
                }
            }
            else if ((syntax == ILNameSyntax.Signature || syntax == ILNameSyntax.SignatureNoNamedTypeParameters) && name != null)
            {
                WriteKeyword(writer, name, typeSig.ToTypeDefOrRef());
            }
            else
            {
                if (syntax == ILNameSyntax.Signature || syntax == ILNameSyntax.SignatureNoNamedTypeParameters)
                {
                    writer.Write(DnlibExtensions.IsValueType(type) ? "valuetype" : "class", TextTokenType.Keyword);
                    writer.WriteSpace();
                }

                if (type.DeclaringType != null)
                {
                    type.DeclaringType.WriteTo(writer, ILNameSyntax.TypeName, depth);
                    writer.Write('/', TextTokenType.Operator);
                    writer.WriteReference(Escape(typeName), type, TextTokenHelper.GetTextTokenType(type));
                }
                else
                {
                    if (!(type is TypeDef) && type.Scope != null && !(type is TypeSpec))
                    {
                        writer.Write('[', TextTokenType.Operator);
                        writer.Write(Escape(type.Scope.GetScopeName()), TextTokenType.ILModule);
                        writer.Write(']', TextTokenType.Operator);
                    }
                    if (ts != null || MustEscape(typeFullName))
                    {
                        writer.WriteReference(Escape(typeFullName), type, TextTokenHelper.GetTextTokenType(type));
                    }
                    else
                    {
                        WriteNamespace(writer, type.Namespace);
                        if (!string.IsNullOrEmpty(type.Namespace))
                        {
                            writer.Write('.', TextTokenType.Operator);
                        }
                        writer.WriteReference(IdentifierEscaper.Escape(type.Name), type, TextTokenHelper.GetTextTokenType(type));
                    }
                }
            }
        }
コード例 #7
0
		public static void WriteTo(this TypeReference type, ITextOutput writer, ILNameSyntax syntax = ILNameSyntax.Signature)
		{
			ILNameSyntax syntaxForElementTypes = syntax == ILNameSyntax.SignatureNoNamedTypeParameters ? syntax : ILNameSyntax.Signature;
			if (type is PinnedType) {
				((PinnedType)type).ElementType.WriteTo(writer, syntaxForElementTypes);
				writer.Write(" pinned");
			} else if (type is ArrayType) {
				ArrayType at = (ArrayType)type;
				at.ElementType.WriteTo(writer, syntaxForElementTypes);
				writer.Write('[');
				writer.Write(string.Join(", ", at.Dimensions));
				writer.Write(']');
			} else if (type is GenericParameter) {
				writer.Write('!');
				if (((GenericParameter)type).Owner.GenericParameterType == GenericParameterType.Method)
					writer.Write('!');
				if (string.IsNullOrEmpty(type.Name) || type.Name[0] == '!' || syntax == ILNameSyntax.SignatureNoNamedTypeParameters)
					writer.Write(((GenericParameter)type).Position.ToString());
				else
					writer.Write(Escape(type.Name));
			} else if (type is ByReferenceType) {
				((ByReferenceType)type).ElementType.WriteTo(writer, syntaxForElementTypes);
				writer.Write('&');
			} else if (type is PointerType) {
				((PointerType)type).ElementType.WriteTo(writer, syntaxForElementTypes);
				writer.Write('*');
			} else if (type is GenericInstanceType) {
				type.GetElementType().WriteTo(writer, syntaxForElementTypes);
				writer.Write('<');
				var arguments = ((GenericInstanceType)type).GenericArguments;
				for (int i = 0; i < arguments.Count; i++) {
					if (i > 0)
						writer.Write(", ");
					arguments[i].WriteTo(writer, syntaxForElementTypes);
				}
				writer.Write('>');
			} else if (type is OptionalModifierType) {
				((OptionalModifierType)type).ElementType.WriteTo(writer, syntax);
				writer.Write(" modopt(");
				((OptionalModifierType)type).ModifierType.WriteTo(writer, ILNameSyntax.TypeName);
				writer.Write(") ");
			} else if (type is RequiredModifierType) {
				((RequiredModifierType)type).ElementType.WriteTo(writer, syntax);
				writer.Write(" modreq(");
				((RequiredModifierType)type).ModifierType.WriteTo(writer, ILNameSyntax.TypeName);
				writer.Write(") ");
			} else {
				string name = PrimitiveTypeName(type.FullName);
				if (syntax == ILNameSyntax.ShortTypeName) {
					if (name != null)
						writer.Write(name);
					else
						writer.WriteReference(Escape(type.Name), type);
				} else if ((syntax == ILNameSyntax.Signature || syntax == ILNameSyntax.SignatureNoNamedTypeParameters) && name != null) {
					writer.Write(name);
				} else {
					if (syntax == ILNameSyntax.Signature || syntax == ILNameSyntax.SignatureNoNamedTypeParameters)
						writer.Write(type.IsValueType ? "valuetype " : "class ");
					
					if (type.DeclaringType != null) {
						type.DeclaringType.WriteTo(writer, ILNameSyntax.TypeName);
						writer.Write('/');
						writer.WriteReference(Escape(type.Name), type);
					} else {
						if (!type.IsDefinition && type.Scope != null && !(type is TypeSpecification))
							writer.Write("[{0}]", Escape(type.Scope.Name));
						writer.WriteReference(Escape(type.FullName), type);
					}
				}
			}
		}
コード例 #8
0
ファイル: DisassemblerHelpers.cs プロジェクト: xornand/dnSpy
        public static void WriteTo(this TypeSig type, ITextOutput writer, ILNameSyntax syntax, int depth)
        {
            if (depth++ > MAX_CONVERTTYPE_DEPTH)
            {
                return;
            }
            ILNameSyntax syntaxForElementTypes = syntax == ILNameSyntax.SignatureNoNamedTypeParameters ? syntax : ILNameSyntax.Signature;

            if (type is PinnedSig)
            {
                ((PinnedSig)type).Next.WriteTo(writer, syntaxForElementTypes, depth);
                writer.WriteSpace();
                writer.Write("pinned", TextTokenType.Keyword);
            }
            else if (type is ArraySig)
            {
                ArraySig at = (ArraySig)type;
                at.Next.WriteTo(writer, syntaxForElementTypes, depth);
                writer.Write('[', TextTokenType.Operator);
                for (int i = 0; i < at.Rank; i++)
                {
                    if (i != 0)
                    {
                        writer.Write(',', TextTokenType.Operator);
                        writer.WriteSpace();
                    }
                    int? lower = i < at.LowerBounds.Count ? at.LowerBounds[i] : (int?)null;
                    uint?size  = i < at.Sizes.Count ? at.Sizes[i] : (uint?)null;
                    if (lower != null)
                    {
                        writer.Write(lower.ToString(), TextTokenType.Number);
                        if (size != null)
                        {
                            writer.Write("..", TextTokenType.Operator);
                            writer.Write((lower.Value + (int)size.Value - 1).ToString(), TextTokenType.Number);
                        }
                        else
                        {
                            writer.Write("...", TextTokenType.Operator);
                        }
                    }
                }
                writer.Write(']', TextTokenType.Operator);
            }
            else if (type is SZArraySig)
            {
                SZArraySig at = (SZArraySig)type;
                at.Next.WriteTo(writer, syntaxForElementTypes, depth);
                writer.Write("[]", TextTokenType.Operator);
            }
            else if (type is GenericSig)
            {
                if (((GenericSig)type).IsMethodVar)
                {
                    writer.Write("!!", TextTokenType.Operator);
                }
                else
                {
                    writer.Write("!", TextTokenType.Operator);
                }
                string typeName = type.TypeName;
                if (string.IsNullOrEmpty(typeName) || typeName[0] == '!' || syntax == ILNameSyntax.SignatureNoNamedTypeParameters)
                {
                    writer.Write(((GenericSig)type).Number.ToString(), TextTokenType.Number);
                }
                else
                {
                    writer.Write(Escape(typeName), TextTokenHelper.GetTextTokenType(type));
                }
            }
            else if (type is ByRefSig)
            {
                ((ByRefSig)type).Next.WriteTo(writer, syntaxForElementTypes, depth);
                writer.Write('&', TextTokenType.Operator);
            }
            else if (type is PtrSig)
            {
                ((PtrSig)type).Next.WriteTo(writer, syntaxForElementTypes, depth);
                writer.Write('*', TextTokenType.Operator);
            }
            else if (type is GenericInstSig)
            {
                ((GenericInstSig)type).GenericType.WriteTo(writer, syntaxForElementTypes, depth);
                writer.Write('<', TextTokenType.Operator);
                var arguments = ((GenericInstSig)type).GenericArguments;
                for (int i = 0; i < arguments.Count; i++)
                {
                    if (i > 0)
                    {
                        writer.Write(',', TextTokenType.Operator);
                        writer.WriteSpace();
                    }
                    arguments[i].WriteTo(writer, syntaxForElementTypes, depth);
                }
                writer.Write('>', TextTokenType.Operator);
            }
            else if (type is CModOptSig)
            {
                ((ModifierSig)type).Next.WriteTo(writer, syntax, depth);
                writer.WriteSpace();
                writer.Write("modopt", TextTokenType.Keyword);
                writer.Write('(', TextTokenType.Operator);
                ((ModifierSig)type).Modifier.WriteTo(writer, ILNameSyntax.TypeName, depth);
                writer.Write(')', TextTokenType.Operator);
                writer.WriteSpace();
            }
            else if (type is CModReqdSig)
            {
                ((ModifierSig)type).Next.WriteTo(writer, syntax, depth);
                writer.WriteSpace();
                writer.Write("modreq", TextTokenType.Keyword);
                writer.Write('(', TextTokenType.Operator);
                ((ModifierSig)type).Modifier.WriteTo(writer, ILNameSyntax.TypeName, depth);
                writer.Write(')', TextTokenType.Operator);
                writer.WriteSpace();
            }
            else if (type is TypeDefOrRefSig)
            {
                WriteTo(((TypeDefOrRefSig)type).TypeDefOrRef, writer, syntax, depth);
            }
            else if (type is FnPtrSig)
            {
                WriteTo(type.ToTypeDefOrRef(), writer, syntax, depth);
            }
            //TODO: SentinelSig
        }
コード例 #9
0
ファイル: DisassemblerHelpers.cs プロジェクト: xornand/dnSpy
 public static void WriteTo(this ITypeDefOrRef type, ITextOutput writer, ILNameSyntax syntax = ILNameSyntax.Signature)
 {
     type.WriteTo(writer, syntax, 0);
 }
コード例 #10
0
        public static void WriteTo(this TypeReference type, ITextOutput writer, ILNameSyntax syntax = ILNameSyntax.Signature)
        {
            ILNameSyntax syntaxForElementTypes = syntax == ILNameSyntax.SignatureNoNamedTypeParameters ? syntax : ILNameSyntax.Signature;

            if (type is PinnedType)
            {
                ((PinnedType)type).ElementType.WriteTo(writer, syntaxForElementTypes);
                writer.Write(" pinned");
            }
            else if (type is ArrayType)
            {
                ArrayType at = (ArrayType)type;
                at.ElementType.WriteTo(writer, syntaxForElementTypes);
                writer.Write('[');
                writer.Write(string.Join(", ", at.Dimensions));
                writer.Write(']');
            }
            else if (type is GenericParameter)
            {
                writer.Write('!');
                if (((GenericParameter)type).Owner.GenericParameterType == GenericParameterType.Method)
                {
                    writer.Write('!');
                }
                if (string.IsNullOrEmpty(type.Name) || type.Name[0] == '!' || syntax == ILNameSyntax.SignatureNoNamedTypeParameters)
                {
                    writer.Write(((GenericParameter)type).Position.ToString());
                }
                else
                {
                    writer.Write(Escape(type.Name));
                }
            }
            else if (type is ByReferenceType)
            {
                ((ByReferenceType)type).ElementType.WriteTo(writer, syntaxForElementTypes);
                writer.Write('&');
            }
            else if (type is PointerType)
            {
                ((PointerType)type).ElementType.WriteTo(writer, syntaxForElementTypes);
                writer.Write('*');
            }
            else if (type is GenericInstanceType)
            {
                type.GetElementType().WriteTo(writer, syntaxForElementTypes);
                writer.Write('<');
                var arguments = ((GenericInstanceType)type).GenericArguments;
                for (int i = 0; i < arguments.Count; i++)
                {
                    if (i > 0)
                    {
                        writer.Write(", ");
                    }
                    arguments[i].WriteTo(writer, syntaxForElementTypes);
                }
                writer.Write('>');
            }
            else if (type is OptionalModifierType)
            {
                ((OptionalModifierType)type).ElementType.WriteTo(writer, syntax);
                writer.Write(" modopt(");
                ((OptionalModifierType)type).ModifierType.WriteTo(writer, ILNameSyntax.TypeName);
                writer.Write(") ");
            }
            else if (type is RequiredModifierType)
            {
                ((RequiredModifierType)type).ElementType.WriteTo(writer, syntax);
                writer.Write(" modreq(");
                ((RequiredModifierType)type).ModifierType.WriteTo(writer, ILNameSyntax.TypeName);
                writer.Write(") ");
            }
            else
            {
                string name = PrimitiveTypeName(type.FullName);
                if (syntax == ILNameSyntax.ShortTypeName)
                {
                    if (name != null)
                    {
                        writer.Write(name);
                    }
                    else
                    {
                        writer.WriteReference(Escape(type.Name), type);
                    }
                }
                else if ((syntax == ILNameSyntax.Signature || syntax == ILNameSyntax.SignatureNoNamedTypeParameters) && name != null)
                {
                    writer.Write(name);
                }
                else
                {
                    if (syntax == ILNameSyntax.Signature || syntax == ILNameSyntax.SignatureNoNamedTypeParameters)
                    {
                        writer.Write(type.IsValueType ? "valuetype " : "class ");
                    }

                    if (type.DeclaringType != null)
                    {
                        type.DeclaringType.WriteTo(writer, ILNameSyntax.TypeName);
                        writer.Write('/');
                        writer.WriteReference(Escape(type.Name), type);
                    }
                    else
                    {
                        if (!type.IsDefinition && type.Scope != null && !(type is TypeSpecification))
                        {
                            writer.Write("[{0}]", Escape(type.Scope.Name));
                        }
                        writer.WriteReference(Escape(type.FullName), type);
                    }
                }
            }
        }
コード例 #11
0
 public static void WriteTo(this IType type, ITextOutput output, ILNameSyntax nameSyntax = ILNameSyntax.ShortTypeName)
 {
     output.WriteReference(type, type.ReflectionName);
 }
 private void WriteArrayType(TypeReference type, ILNameSyntax syntaxForElementTypes)
 {
     ArrayType at = (ArrayType)type;
     WriteTypeReference(at.ElementType, syntaxForElementTypes);
     WriteToken("[");
     for (int i = 0; i < at.Dimensions.Count; i++)
     {
         if (i > 0)
         {
             WriteTokenPostSpace(",");
         }
         WriteToken(at.Dimensions[i].ToString());
     }
     WriteToken("]");
 }
 private void WriteGenericTypeParameter(TypeReference type, ILNameSyntax syntax)
 {
     WriteToken("!");
     if (((GenericParameter)type).Owner.GenericParameterType == GenericParameterType.Method)
     {
         WriteToken("!");
     }
     if (string.IsNullOrEmpty(type.Name) || type.Name[0] == '!' || syntax == ILNameSyntax.SignatureNoNamedTypeParameters)
     {
         WriteReference(((GenericParameter)type).Position.ToString(), null);
     }
     else
     {
         WriteReference(ILHelpers.Escape(type.Name), null);
     }
 }
        protected void WriteType(TypeReference type, ILNameSyntax syntax)
        {
            if (type is ArrayType)
            {
                WriteArrayType(type, syntax);
                return;
            }
            string name = ILHelpers.PrimitiveTypeName(type.GetFriendlyFullName(Language));
            if (syntax == ILNameSyntax.ShortTypeName)
            {
                if (name != null)
                    WriteReference(name, type);
                else
                    WriteReference(ILHelpers.Escape(type.Name), type);
            }
            else if ((syntax == ILNameSyntax.Signature || syntax == ILNameSyntax.SignatureNoNamedTypeParameters) && name != null)
            {
                WriteReference(name, type);
            }
            else
            {
                if (syntax == ILNameSyntax.Signature || syntax == ILNameSyntax.SignatureNoNamedTypeParameters)
                    WriteKeyWordPostSpace(type.IsValueType ? "valuetype" : "class");

                if (type.DeclaringType != null)
                {
                    WriteTypeReference(type.DeclaringType, ILNameSyntax.TypeName);
                    WriteKeyword("/");
                    WriteReference(ILHelpers.Escape(type.Name), type);
                }
                else
                {
                    if (!type.IsDefinition && type.Scope != null && !(type is TypeSpecification))
                    {
                        WriteToken("[");
                        WriteEscaped(type.Scope.Name);
                        WriteToken("]");
                    }
                    WriteReference(ILHelpers.Escape(type.FullName), type);
                }
            }
        }
 private void WriteTypeReference(TypeReference type, ILNameSyntax syntax = ILNameSyntax.Signature)
 {
     ILNameSyntax syntaxForElementTypes = syntax == ILNameSyntax.SignatureNoNamedTypeParameters ? syntax : ILNameSyntax.Signature;
     if (type is PinnedType)
     {
         WriteTypeReference(((PinnedType)type).ElementType, syntaxForElementTypes);
         WriteKeyWordPreSpace("pinned");
     }
     else if (type is ArrayType)
     {
         WriteArrayType(type, syntaxForElementTypes);
     }
     else if (type is GenericParameter)
     {
         WriteGenericTypeParameter(type, syntax);
     }
     else if (type is ByReferenceType)
     {
         WriteTypeReference(((ByReferenceType)type).ElementType, syntaxForElementTypes);
         WriteToken("&");
     }
     else if (type is PointerType)
     {
         WriteTypeReference(((PointerType)type).ElementType, syntaxForElementTypes);
         WriteToken("*");
     }
     else if (type is GenericInstanceType)
     {
         WriteTypeReference(type.GetElementType(), syntaxForElementTypes);
         WriteToken("<");
         var arguments = ((GenericInstanceType)type).GenericArguments;
         for (int i = 0; i < arguments.Count; i++)
         {
             TypeReference toWrite = arguments[i];
             if (((GenericInstanceType)type).PostionToArgument.ContainsKey(i))
             {
                 toWrite = ((GenericInstanceType)type).PostionToArgument[i];
             }
             if (i > 0)
                 WriteTokenPostSpace(",");
             WriteTypeReference(toWrite, syntaxForElementTypes);
         }
         WriteToken(">");
     }
     else if (type is OptionalModifierType)
     {
         WriteTypeReference(((OptionalModifierType)type).ElementType, syntax);
         WriteKeyWordPreSpace("modopt");
         WriteToken("(");
         WriteTypeReference(((OptionalModifierType)type).ModifierType, ILNameSyntax.TypeName);
         WriteTokenPostSpace(")");
     }
     else if (type is RequiredModifierType)
     {
         WriteTypeReference(((RequiredModifierType)type).ElementType, syntax);
         WriteKeyWordPreSpace("modreq");
         WriteToken("(");
         WriteTypeReference(((RequiredModifierType)type).ModifierType, ILNameSyntax.TypeName);
         WriteTokenPostSpace(")");
     }
     else
     {
         WriteType(type, syntax);
     }
 }
コード例 #16
0
        private void WriteCustomAttributeConstructorArguments(Collection <CustomAttributeArgument> constructorArguments)
        {
            foreach (CustomAttributeArgument argument in constructorArguments)
            {
                TypeReference argType = argument.Type;
                if (argType.IsArray)
                {
                    ILNameSyntax syntax;
                    if ((argType as ArrayType).ElementType.IsPrimitive || argType.FullName == "System.String")
                    {
                        syntax = ILNameSyntax.ShortTypeName;
                    }
                    else
                    {
                        syntax = ILNameSyntax.TypeName;
                    }
                    WriteType((argType as ArrayType).ElementType, syntax);
                    Write("[");
                    WriteLiteral((argument.Value as Array).Length.ToString());
                    Write("]");
                }
                else
                {
                    ILNameSyntax syntax = ILNameSyntax.TypeName;
                    if (argType.IsPrimitive || argType.FullName == "System.String")
                    {
                        syntax = ILNameSyntax.ShortTypeName;
                    }

                    TypeDefinition argTypeDefinition = argType.Resolve();
                    if (argTypeDefinition != null)
                    {
                        if (argTypeDefinition.IsEnum)
                        {
                            argType = GetEnumerationUnderlayingType(argTypeDefinition);
                            syntax  = ILNameSyntax.ShortTypeName;
                        }

                        WriteType(argType, syntax);
                    }
                    else
                    {
                        WriteNotResolvedReference(argType.FullName, argType, SyntaxProblemsDueToNotResolvedType);
                    }
                }
                Write("(");
                WriteSpace();
                if (argument.Value is bool)
                {
                    WriteBooleanLiteral((bool)argument.Value);
                }
                else if (argument.Value is string)
                {
                    WriteStringLiteral((string)argument.Value);
                }
                else if (argument.Value is CustomAttributeArgument[])
                {
                    WriteArrayValues(argument.Value as CustomAttributeArgument[]);
                }
                else
                {
                    WriteLiteral(argument.Value.ToString());
                }
                WriteSpace();
                Write(")");
                WriteLine();
            }
        }