25using System.Reflection.Metadata.Ecma335;
33 internal sealed class GenericTypeParameterBuilder : TypeInfo
37 readonly TypeBuilder type;
38 readonly MethodBuilder method;
39 readonly
int paramPseudoIndex;
40 readonly
int position;
43 GenericParameterAttributes attr;
51 internal GenericTypeParameterBuilder(
string name, TypeBuilder type,
int position) :
52 this(name, type, null, position,
Signature.ELEMENT_TYPE_VAR)
63 internal GenericTypeParameterBuilder(
string name, MethodBuilder method,
int position) :
64 this(name, null, method, position,
Signature.ELEMENT_TYPE_MVAR)
77 GenericTypeParameterBuilder(
string name, TypeBuilder type, MethodBuilder method,
int position,
byte sigElementType) :
83 this.position = position;
85 rec.Number = (short)position;
87 rec.Owner = type !=
null ? type.MetadataToken : method.MetadataToken;
88 rec.Name = ModuleBuilder.GetOrAddString(name);
89 paramPseudoIndex = ModuleBuilder.GenericParamTable.AddRecord(rec);
92 public override string AssemblyQualifiedName
97 protected override bool IsValueTypeImpl
99 get {
return (this.GenericParameterAttributes & GenericParameterAttributes.NotNullableValueTypeConstraint) != 0; }
102 public override Type BaseType
104 get {
return baseType; }
107 public override Type[] __GetDeclaredInterfaces()
109 throw new NotImplementedException();
112 public override TypeAttributes Attributes
114 get {
return TypeAttributes.Public; }
117 public override string Namespace
119 get {
return DeclaringType.Namespace; }
122 public override string Name
127 public override string FullName
132 public override string ToString()
137 private ModuleBuilder ModuleBuilder
139 get {
return type !=
null ? type.ModuleBuilder : method.ModuleBuilder; }
144 get {
return ModuleBuilder; }
147 public override int GenericParameterPosition
149 get {
return position; }
152 public override Type DeclaringType
159 get {
return method; }
162 public override Type[] GetGenericParameterConstraints()
164 throw new NotImplementedException();
167 public override CustomModifiers[] __GetGenericParameterConstraintCustomModifiers()
169 throw new NotImplementedException();
172 public override GenericParameterAttributes GenericParameterAttributes
181 internal override void CheckBaked()
193 private void AddConstraint(
Type type)
196 rec.Owner = MetadataTokens.GetToken(MetadataTokens.GenericParameterHandle(paramPseudoIndex));
197 rec.Constraint = ModuleBuilder.GetTypeTokenForMemberRef(type);
198 this.ModuleBuilder.GenericParamConstraint.AddRecord(rec);
201 public void SetBaseTypeConstraint(
Type? baseTypeConstraint)
203 this.baseType = baseTypeConstraint;
204 AddConstraint(baseTypeConstraint);
207 public void SetInterfaceConstraints(params
Type[] interfaceConstraints)
209 foreach (
Type type
in interfaceConstraints)
215 public void SetGenericParameterAttributes(GenericParameterAttributes genericParameterAttributes)
217 this.attr = genericParameterAttributes;
219 this.ModuleBuilder.GenericParamTable.PatchAttribute(paramPseudoIndex, genericParameterAttributes);
222 public void SetCustomAttribute(CustomAttributeBuilder customBuilder)
224 this.ModuleBuilder.SetCustomAttribute((
GenericParamTable.Index << 24) | paramPseudoIndex, customBuilder);
227 public void SetCustomAttribute(
ConstructorInfo con,
byte[] binaryAttribute)
229 SetCustomAttribute(
new CustomAttributeBuilder(con, binaryAttribute));
232 public override int MetadataToken
241 internal override int GetModuleBuilderToken()
246 Signature.WriteTypeSpec(ModuleBuilder, spec,
this);
247 typeToken = MetadataTokens.GetToken(MetadataTokens.TypeSpecificationHandle(ModuleBuilder.TypeSpecTable.AddRecord(ModuleBuilder.GetOrAddBlob(spec.ToArray()))));
264 internal override int GetCurrentToken()
266 if (ModuleBuilder.IsSaved)
276 internal override bool IsBaked
278 get {
return ((
MemberInfo)type ?? method).IsBaked; }
IKVM.Reflection.Module Module
IKVM.Reflection.Type Type
IKVM.Reflection.ConstructorInfo ConstructorInfo
IKVM.Reflection.MemberInfo MemberInfo
IKVM.Reflection.MethodBase MethodBase
global::java.lang.invoke.LambdaForm.Name Name
Type BindMethodParameter(Type type)
Type BindTypeParameter(Type type)