MethodBase metaInfo;
readonly AParametersCollection parameters;
- public MethodSpec (IMemberDefinition details, MethodBase info, AParametersCollection parameters, Modifiers modifiers)
- : base (details, info.Name, modifiers)
+ public MethodSpec (MemberKind kind, IMemberDefinition details, MethodBase info, AParametersCollection parameters, Modifiers modifiers)
+ : base (kind, details, info.Name, modifiers)
{
this.MetaInfo = info;
this.parameters = parameters;
// TODO: Does not work on .NET
var par = TypeManager.GetParameterData (mb);
- return new MethodSpec (definition, mb, par, modifiers);
+ return new MethodSpec (Kind, definition, mb, par, Modifiers);
}
public bool IsAbstract {
get {
- return (modifiers & Modifiers.ABSTRACT) != 0;
+ return (Modifiers & Modifiers.ABSTRACT) != 0;
}
}
// When is virtual or abstract
public bool IsVirtual {
get {
- return (modifiers & (Modifiers.VIRTUAL | Modifiers.ABSTRACT | Modifiers.OVERRIDE)) != 0;
+ return (Modifiers & (Modifiers.VIRTUAL | Modifiers.ABSTRACT | Modifiers.OVERRIDE)) != 0;
}
}
ModFlags |= Modifiers.DEBUGGER_HIDDEN;
}
+ MemberKind kind;
+ if (this is Operator)
+ kind = MemberKind.Operator;
+ else if (this is Destructor)
+ kind = MemberKind.Destructor;
+ else
+ kind = MemberKind.Method;
+
if (IsPartialDefinition) {
caching_flags &= ~Flags.Excluded_Undetected;
caching_flags |= Flags.Excluded;
// Add to member cache only when a partial method implementation has not been found yet
if ((caching_flags & Flags.PartialDefinitionExists) == 0) {
MethodBase mb = new PartialMethodDefinitionInfo (this);
- Parent.MemberCache.AddMember (mb, this);
- TypeManager.AddMethod (mb, this);
- spec = new MethodSpec (this, mb, Parameters, ModFlags);
+ spec = new MethodSpec (kind, this, mb, Parameters, ModFlags);
+ Parent.MemberCache.AddMember (mb, spec);
+ TypeManager.AddMethod (mb, this);
}
return true;
MethodBuilder = MethodData.MethodBuilder;
- spec = new MethodSpec (this, MethodBuilder, Parameters, ModFlags);
+ spec = new MethodSpec (kind, this, MethodBuilder, Parameters, ModFlags);
if (TypeManager.IsGenericMethod (MethodBuilder))
Parent.MemberCache.AddGenericMember (MethodBuilder, this);
- Parent.MemberCache.AddMember (MethodBuilder, this);
+ Parent.MemberCache.AddMember (MethodBuilder, spec);
return true;
}
FullNamedExpression return_type, Modifiers mod,
MemberName name, ParametersCompiled parameters, Attributes attrs)
: base (parent, generic, return_type, mod,
- parent.PartialContainer.Kind == Kind.Interface ? AllowedInterfaceModifiers : AllowedModifiers,
+ parent.PartialContainer.Kind == MemberKind.Interface ? AllowedInterfaceModifiers : AllowedModifiers,
name, attrs, parameters)
{
}
Parent.MemberCache.CheckExistingMembersOverloads (this, ConstructorInfo.ConstructorName,
Parameters, Report);
- if (Parent.PartialContainer.Kind == Kind.Struct) {
+ if (Parent.PartialContainer.Kind == MemberKind.Struct) {
if (Parameters.Count == 0) {
Report.Error (568, Location,
"Structs cannot contain explicit parameterless constructors");
ca, CallingConventions,
Parameters.GetEmitTypes ());
- spec = new MethodSpec (this, ConstructorBuilder, Parameters, ModFlags);
+ spec = new MethodSpec (MemberKind.Constructor, this, ConstructorBuilder, Parameters, ModFlags);
if (Parent.PartialContainer.IsComImport) {
if (!IsDefault ()) {
ConstructorBuilder.SetImplementationFlags (MethodImplAttributes.InternalCall);
}
- Parent.MemberCache.AddMember (ConstructorBuilder, this);
+ Parent.MemberCache.AddMember (ConstructorBuilder, spec);
TypeManager.AddMethod (ConstructorBuilder, this);
// It's here only to report an error
if (block != null) {
// If this is a non-static `struct' constructor and doesn't have any
// initializer, it must initialize all of the struct's fields.
- if ((Parent.PartialContainer.Kind == Kind.Struct) &&
+ if ((Parent.PartialContainer.Kind == MemberKind.Struct) &&
((ModFlags & Modifiers.STATIC) == 0) && (Initializer == null))
block.AddThisVariable (Parent, Location);
if (block != null && (ModFlags & Modifiers.STATIC) == 0){
- if (Parent.PartialContainer.Kind == Kind.Class && Initializer == null)
+ if (Parent.PartialContainer.Kind == MemberKind.Class && Initializer == null)
Initializer = new GeneratedBaseInitializer (Location);
if (Initializer != null) {
return true;
}
- public override bool IsUsed
- {
+ public override bool IsUsed {
get {
if (IsDummy)
return false;
}
}
+ public MethodSpec Spec { get; protected set; }
+
//
// Represents header string for documentation comment.
//
return null;
}
+ public static OpType? GetType (string metadata_name)
+ {
+ for (int i = 0; i < names.Length; ++i) {
+ if (names[i][1] == metadata_name)
+ return (OpType) i;
+ }
+
+ return null;
+ }
+
public OpType GetMatchingOperator ()
{
switch (OperatorType) {