diff --git a/BeefLibs/corlib/src/Attribute.bf b/BeefLibs/corlib/src/Attribute.bf index 6cd01199..51e50def 100644 --- a/BeefLibs/corlib/src/Attribute.bf +++ b/BeefLibs/corlib/src/Attribute.bf @@ -30,6 +30,9 @@ namespace System Alias = 0x100000, Block = 0x200000, + Types = .Struct | .Enum | .Function | .Class | .Interface, + ValueTypes = .Struct | .Enum | .Function, + All = Assembly | Module | Class | Struct | Enum | Constructor | Method | Property | Field | StaticField | Interface | Parameter | Delegate | Function | ReturnValue | GenericParameter | Invocation | MemberAccess | @@ -51,7 +54,7 @@ namespace System AllMembers = 0x7F, All = 0xFF, // Doesn't include dynamic boxing - ApplyToInnerTypes = 0x200, + ApplyToInnerTypes = 0x200 } public enum AttributeFlags @@ -107,6 +110,11 @@ namespace System public this(ReflectKind reflectKind = .AllMembers) { } + + public ReflectKind ReflectImplementer + { + set mut { } + } } [AttributeUsage(.Method | .Constructor | .Invocation)] diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 3204f68b..9baeb142 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -13565,7 +13565,7 @@ BfReflectKind BfModule::GetUserReflectKind(BfTypeInstance* attrType) } BfReflectKind BfModule::GetReflectKind(BfReflectKind reflectKind, BfTypeInstance* typeInstance) -{ +{ auto checkTypeInstance = typeInstance; while (checkTypeInstance != NULL) { @@ -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); } diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index e949097e..b872014d 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -1741,8 +1741,10 @@ int BfModule::GenerateTypeOptions(BfCustomAttributes* customAttributes, BfTypeIn { StringT<128> ifaceName = TypeToString(iface.mInterfaceType); if (BfCheckWildcard(checkFilter, ifaceName)) + { matched = true; - break; + break; + } } checkTypeInst = checkTypeInst->mBaseType; }