type.scope = scope;
type.DeclaringType = declaring_type;
- MetadataSystem.TryProcessPrimitiveType (type);
+ MetadataSystem.TryProcessPrimitiveTypeReference (type);
return type;
}
ImportScope (type.Scope),
type.IsValueType);
- MetadataSystem.TryProcessPrimitiveType (reference);
+ MetadataSystem.TryProcessPrimitiveTypeReference (reference);
if (type.IsNested)
reference.DeclaringType = ImportType (type.DeclaringType, context);
};
}
- public static void TryProcessPrimitiveType (TypeReference type)
+ public static void TryProcessPrimitiveTypeReference (TypeReference type)
{
var scope = type.scope;
- if (scope == null)
+ if (scope == null || scope.MetadataScopeType != MetadataScopeType.AssemblyNameReference || scope.Name != "mscorlib")
return;
- if (scope.MetadataScopeType != MetadataScopeType.AssemblyNameReference)
+ Row<ElementType, bool> primitive_data;
+ if (!TryGetPrimitiveData (type, out primitive_data))
return;
- if (scope.Name != "mscorlib")
- return;
+ type.etype = primitive_data.Col1;
+ type.IsValueType = primitive_data.Col2;
+ }
+
+ public static bool TryGetPrimitiveElementType (TypeDefinition type, out ElementType etype)
+ {
+ etype = ElementType.None;
+
+ if (!type.HasImage || !type.Module.IsCorlib ())
+ return false;
+
+ Row<ElementType, bool> primitive_data;
+ if (!TryGetPrimitiveData (type, out primitive_data) && primitive_data.Col1.IsPrimitive ())
+ return false;
+
+ etype = primitive_data.Col1;
+ return true;
+ }
+
+ static bool TryGetPrimitiveData (TypeReference type, out Row<ElementType, bool> primitive_data)
+ {
+ primitive_data = new Row<ElementType, bool> ();
if (type.Namespace != "System")
- return;
+ return false;
if (primitive_value_types == null)
InitializePrimitives ();
- Row<ElementType, bool> primitive_data;
- if (!primitive_value_types.TryGetValue (type.Name, out primitive_data))
- return;
-
- type.etype = primitive_data.Col1;
- type.IsValueType = primitive_data.Col2;
+ return primitive_value_types.TryGetValue (type.Name, out primitive_data);
}
public void Clear ()
return self != null && self.HasImage;
}
+ public static bool IsCorlib (this ModuleDefinition module)
+ {
+ if (module.Assembly == null)
+ return false;
+
+ return module.Assembly.Name.Name == "mscorlib";
+ }
+
public static string GetFullyQualifiedName (this Stream self)
{
#if !SILVERLIGHT
//
using System;
-
+using Mono.Cecil.Metadata;
using Mono.Collections.Generic;
namespace Mono.Cecil {
}
}
+ public override bool IsPrimitive {
+ get {
+ ElementType primitive_etype;
+ return MetadataSystem.TryGetPrimitiveElementType (this, out primitive_etype);
+ }
+ }
+
+ public override MetadataType MetadataType {
+ get {
+ ElementType primitive_etype;
+ if (MetadataSystem.TryGetPrimitiveElementType (this, out primitive_etype))
+ return (MetadataType) primitive_etype;
+
+ return base.MetadataType;
+ }
+ }
+
public override bool IsDefinition {
get { return true; }
}
SplitFullName (type_info.type_fullname, out @namespace, out name);
var type = new TypeReference (@namespace, name, module, scope);
- MetadataSystem.TryProcessPrimitiveType (type);
+ MetadataSystem.TryProcessPrimitiveTypeReference (type);
AdjustGenericParameters (type);
get { return false; }
}
- public bool IsPrimitive {
- get {
- switch (etype) {
- case ElementType.Boolean:
- case ElementType.Char:
- case ElementType.I:
- case ElementType.U:
- case ElementType.I1:
- case ElementType.U1:
- case ElementType.I2:
- case ElementType.U2:
- case ElementType.I4:
- case ElementType.U4:
- case ElementType.I8:
- case ElementType.U8:
- case ElementType.R4:
- case ElementType.R8:
- return true;
- default:
- return false;
- }
- }
+ public virtual bool IsPrimitive {
+ get { return etype.IsPrimitive (); }
}
public virtual MetadataType MetadataType {
static partial class Mixin {
+ public static bool IsPrimitive (this ElementType self)
+ {
+ switch (self) {
+ case ElementType.Boolean:
+ case ElementType.Char:
+ case ElementType.I:
+ case ElementType.U:
+ case ElementType.I1:
+ case ElementType.U1:
+ case ElementType.I2:
+ case ElementType.U2:
+ case ElementType.I4:
+ case ElementType.U4:
+ case ElementType.I8:
+ case ElementType.U8:
+ case ElementType.R4:
+ case ElementType.R8:
+ return true;
+ default:
+ return false;
+ }
+ }
+
public static bool IsTypeOf (this TypeReference self, string @namespace, string name)
{
return self.Name == name
internal static TypeSystem CreateTypeSystem (ModuleDefinition module)
{
- if (IsCorlib (module))
+ if (module.IsCorlib ())
return new CorlibTypeSystem (module);
return new CommonTypeSystem (module);
}
- static bool IsCorlib (ModuleDefinition module)
- {
- if (module.Assembly == null)
- return false;
-
- return module.Assembly.Name.Name == "mscorlib";
- }
-
internal abstract TypeReference LookupType (string @namespace, string name);
TypeReference LookupSystemType (string name, ElementType element_type)