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); } } }
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); } }
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 }
public static void WriteTo(this ITypeDefOrRef type, ITextOutput writer, ILNameSyntax syntax = ILNameSyntax.Signature) { type.WriteTo(writer, syntax, 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 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); } } } }
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 }
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); } } } }
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); } }
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(); } }