1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 04:22:20 +02:00

Added ReflectAttribute.ReflectImplementer

This commit is contained in:
Brian Fiete 2020-09-26 08:26:42 -07:00
parent 52ccdfe46a
commit 0e10eba8f5
3 changed files with 37 additions and 3 deletions

View file

@ -30,6 +30,9 @@ namespace System
Alias = 0x100000, Alias = 0x100000,
Block = 0x200000, Block = 0x200000,
Types = .Struct | .Enum | .Function | .Class | .Interface,
ValueTypes = .Struct | .Enum | .Function,
All = Assembly | Module | Class | Struct | Enum | Constructor | All = Assembly | Module | Class | Struct | Enum | Constructor |
Method | Property | Field | StaticField | Interface | Parameter | Method | Property | Field | StaticField | Interface | Parameter |
Delegate | Function | ReturnValue | GenericParameter | Invocation | MemberAccess | Delegate | Function | ReturnValue | GenericParameter | Invocation | MemberAccess |
@ -51,7 +54,7 @@ namespace System
AllMembers = 0x7F, AllMembers = 0x7F,
All = 0xFF, // Doesn't include dynamic boxing All = 0xFF, // Doesn't include dynamic boxing
ApplyToInnerTypes = 0x200, ApplyToInnerTypes = 0x200
} }
public enum AttributeFlags public enum AttributeFlags
@ -107,6 +110,11 @@ namespace System
public this(ReflectKind reflectKind = .AllMembers) public this(ReflectKind reflectKind = .AllMembers)
{ {
} }
public ReflectKind ReflectImplementer
{
set mut { }
}
} }
[AttributeUsage(.Method | .Constructor | .Invocation)] [AttributeUsage(.Method | .Constructor | .Invocation)]

View file

@ -13601,6 +13601,30 @@ BfReflectKind BfModule::GetReflectKind(BfReflectKind reflectKind, BfTypeInstance
} }
} }
for (auto ifaceEntry : typeInstance->mInterfaces)
{
if (ifaceEntry.mInterfaceType->mCustomAttributes != NULL)
{
auto iface = ifaceEntry.mInterfaceType;
auto customAttr = iface->mCustomAttributes->Get(mCompiler->mReflectAttributeTypeDef);
if (customAttr != NULL)
{
for (auto& prop : customAttr->mSetProperties)
{
auto propDef = prop.mPropertyRef.mTypeInstance->mTypeDef->mProperties[prop.mPropertyRef.mPropIdx];
if (propDef->mName == "ReflectImplementer")
{
if (prop.mParam.mValue.IsConst())
{
auto constant = iface->mConstHolder->GetConstant(prop.mParam.mValue);
reflectKind = (BfReflectKind)(reflectKind | (BfReflectKind)constant->mInt32);
}
}
}
}
}
}
checkTypeInstance = mContext->mUnreifiedModule->GetOuterType(checkTypeInstance); checkTypeInstance = mContext->mUnreifiedModule->GetOuterType(checkTypeInstance);
} }

View file

@ -1741,8 +1741,10 @@ int BfModule::GenerateTypeOptions(BfCustomAttributes* customAttributes, BfTypeIn
{ {
StringT<128> ifaceName = TypeToString(iface.mInterfaceType); StringT<128> ifaceName = TypeToString(iface.mInterfaceType);
if (BfCheckWildcard(checkFilter, ifaceName)) if (BfCheckWildcard(checkFilter, ifaceName))
{
matched = true; matched = true;
break; break;
}
} }
checkTypeInst = checkTypeInst->mBaseType; checkTypeInst = checkTypeInst->mBaseType;
} }