/*
- Copyright (C) 2009 Jeroen Frijters
+ Copyright (C) 2009-2012 Jeroen Frijters
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
*/
using System;
using System.Collections.Generic;
+using System.Diagnostics;
namespace IKVM.Reflection
{
public abstract class ConstructorInfo : MethodBase
{
+ // prevent external subclasses
+ internal ConstructorInfo()
+ {
+ }
+
+ public sealed override string ToString()
+ {
+ return GetMethodInfo().ToString();
+ }
+
public static readonly string ConstructorName = ".ctor";
public static readonly string TypeConstructorName = ".cctor";
return new ConstructorInfoImpl((MethodInfo)GetMethodInfo().BindTypeParameters(type));
}
+ public sealed override MethodBase __GetMethodOnTypeDefinition()
+ {
+ return new ConstructorInfoImpl((MethodInfo)GetMethodInfo().__GetMethodOnTypeDefinition());
+ }
+
public sealed override MemberTypes MemberType
{
get { return MemberTypes.Constructor; }
}
- public override bool ContainsGenericParameters
+ public sealed override int __MethodRVA
+ {
+ get { return GetMethodInfo().__MethodRVA; }
+ }
+
+ public sealed override bool ContainsGenericParameters
{
get { return GetMethodInfo().ContainsGenericParameters; }
}
+ public ParameterInfo __ReturnParameter
+ {
+ get { return new ParameterInfoWrapper(this, GetMethodInfo().ReturnParameter); }
+ }
+
public sealed override ParameterInfo[] GetParameters()
{
ParameterInfo[] parameters = GetMethodInfo().GetParameters();
return parameters;
}
- private sealed class ParameterInfoWrapper : ParameterInfo
+ public sealed override CallingConventions CallingConvention
{
- private readonly ConstructorInfo ctor;
- private readonly ParameterInfo forward;
-
- internal ParameterInfoWrapper(ConstructorInfo ctor, ParameterInfo forward)
- {
- this.ctor = ctor;
- this.forward = forward;
- }
-
- public override string Name
- {
- get { return forward.Name; }
- }
-
- public override Type ParameterType
- {
- get { return forward.ParameterType; }
- }
-
- public override ParameterAttributes Attributes
- {
- get { return forward.Attributes; }
- }
-
- public override int Position
- {
- get { return forward.Position; }
- }
+ get { return GetMethodInfo().CallingConvention; }
+ }
- public override object RawDefaultValue
- {
- get { return forward.RawDefaultValue; }
- }
+ public sealed override MethodAttributes Attributes
+ {
+ get { return GetMethodInfo().Attributes; }
+ }
- public override Type[] GetOptionalCustomModifiers()
- {
- return forward.GetOptionalCustomModifiers();
- }
+ public sealed override MethodImplAttributes GetMethodImplementationFlags()
+ {
+ return GetMethodInfo().GetMethodImplementationFlags();
+ }
- public override Type[] GetRequiredCustomModifiers()
- {
- return forward.GetRequiredCustomModifiers();
- }
+ public sealed override Type DeclaringType
+ {
+ get { return GetMethodInfo().DeclaringType; }
+ }
- public override MemberInfo Member
- {
- get { return ctor; }
- }
+ public sealed override string Name
+ {
+ get { return GetMethodInfo().Name; }
+ }
- public override int MetadataToken
- {
- get { return forward.MetadataToken; }
- }
+ public sealed override int MetadataToken
+ {
+ get { return GetMethodInfo().MetadataToken; }
+ }
- internal override Module Module
- {
- get { return ctor.Module; }
- }
+ public sealed override Module Module
+ {
+ get { return GetMethodInfo().Module; }
+ }
- internal override IList<CustomAttributeData> GetCustomAttributesData(Type attributeType)
- {
- return forward.GetCustomAttributesData(attributeType);
- }
+ public sealed override MethodBody GetMethodBody()
+ {
+ return GetMethodInfo().GetMethodBody();
}
- }
- sealed class ConstructorInfoImpl : ConstructorInfo
- {
- private readonly MethodInfo method;
+ public sealed override bool __IsMissing
+ {
+ get { return GetMethodInfo().__IsMissing; }
+ }
- internal ConstructorInfoImpl(MethodInfo method)
+ internal sealed override int ParameterCount
{
- this.method = method;
+ get { return GetMethodInfo().ParameterCount; }
}
- public override bool Equals(object obj)
+ internal sealed override MemberInfo SetReflectedType(Type type)
{
- ConstructorInfoImpl other = obj as ConstructorInfoImpl;
- return other != null && other.method.Equals(method);
+ return new ConstructorInfoWithReflectedType(type, this);
}
- public override int GetHashCode()
+ internal sealed override int GetCurrentToken()
{
- return method.GetHashCode();
+ return GetMethodInfo().GetCurrentToken();
}
- public override MethodBody GetMethodBody()
+ internal sealed override List<CustomAttributeData> GetPseudoCustomAttributes(Type attributeType)
{
- return method.GetMethodBody();
+ return GetMethodInfo().GetPseudoCustomAttributes(attributeType);
}
- public override CallingConventions CallingConvention
+ internal sealed override bool IsBaked
{
- get { return method.CallingConvention; }
+ get { return GetMethodInfo().IsBaked; }
}
- public override MethodAttributes Attributes
+ internal sealed override MethodSignature MethodSignature
{
- get { return method.Attributes; }
+ get { return GetMethodInfo().MethodSignature; }
}
- public override MethodImplAttributes GetMethodImplementationFlags()
+ internal sealed override int ImportTo(Emit.ModuleBuilder module)
{
- return method.GetMethodImplementationFlags();
+ return GetMethodInfo().ImportTo(module);
}
+ }
- internal override int ParameterCount
+ sealed class ConstructorInfoImpl : ConstructorInfo
+ {
+ private readonly MethodInfo method;
+
+ internal ConstructorInfoImpl(MethodInfo method)
{
- get { return method.ParameterCount; }
+ this.method = method;
}
- public override Type DeclaringType
+ public override bool Equals(object obj)
{
- get { return method.DeclaringType; }
+ ConstructorInfoImpl other = obj as ConstructorInfoImpl;
+ return other != null && other.method.Equals(method);
}
- public override string Name
+ public override int GetHashCode()
{
- get { return method.Name; }
+ return method.GetHashCode();
}
- public override string ToString()
+ internal override MethodInfo GetMethodInfo()
{
- return method.ToString();
+ return method;
}
- public override Module Module
+ internal override MethodInfo GetMethodOnTypeDefinition()
{
- get { return method.Module; }
+ return method.GetMethodOnTypeDefinition();
}
+ }
+
+ sealed class ConstructorInfoWithReflectedType : ConstructorInfo
+ {
+ private readonly Type reflectedType;
+ private readonly ConstructorInfo ctor;
- public override int MetadataToken
+ internal ConstructorInfoWithReflectedType(Type reflectedType, ConstructorInfo ctor)
{
- get { return method.MetadataToken; }
+ Debug.Assert(reflectedType != ctor.DeclaringType);
+ this.reflectedType = reflectedType;
+ this.ctor = ctor;
}
- internal override MethodInfo GetMethodInfo()
+ public override bool Equals(object obj)
{
- return method;
+ ConstructorInfoWithReflectedType other = obj as ConstructorInfoWithReflectedType;
+ return other != null
+ && other.reflectedType == reflectedType
+ && other.ctor == ctor;
}
- internal override IList<CustomAttributeData> GetCustomAttributesData(Type attributeType)
+ public override int GetHashCode()
{
- return method.GetCustomAttributesData(attributeType);
+ return reflectedType.GetHashCode() ^ ctor.GetHashCode();
}
- internal override MethodInfo GetMethodOnTypeDefinition()
+ public override Type ReflectedType
{
- return method.GetMethodOnTypeDefinition();
+ get { return reflectedType; }
}
- internal override MethodSignature MethodSignature
+ internal override MethodInfo GetMethodInfo()
{
- get { return method.MethodSignature; }
+ return ctor.GetMethodInfo();
}
- internal override int ImportTo(Emit.ModuleBuilder module)
+ internal override MethodInfo GetMethodOnTypeDefinition()
{
- return method.ImportTo(module);
+ return ctor.GetMethodOnTypeDefinition();
}
}
}