diff --git a/IDEHelper/Compiler/BfAutoComplete.cpp b/IDEHelper/Compiler/BfAutoComplete.cpp index 82355381..cb5d1291 100644 --- a/IDEHelper/Compiler/BfAutoComplete.cpp +++ b/IDEHelper/Compiler/BfAutoComplete.cpp @@ -1653,6 +1653,60 @@ bool BfAutoComplete::CheckMemberReference(BfAstNode* target, BfAstNode* dotToken return false; } +bool BfAutoComplete::CheckExplicitInterface(BfTypeInstance* interfaceType, BfAstNode* dotToken, BfAstNode* memberName) +{ + bool isAutocompletingName = false; + if (memberName != NULL) + isAutocompletingName = IsAutocompleteNode(dotToken, memberName, 0, 1); + + if (isAutocompletingName) + { + // + } + else if (IsAutocompleteNode(dotToken, 0, 1)) + { + mInsertStartIdx = dotToken->GetSrcEnd(); + mInsertEndIdx = mInsertStartIdx; + } + else + return false; + + String filter; + if (isAutocompletingName) + filter = GetFilter(memberName); + + auto activeTypeDef = mModule->GetActiveTypeDef(); + + for (auto methodDef : interfaceType->mTypeDef->mMethods) + { + if (methodDef->mIsOverride) + continue; + if (methodDef->mIsNoShow) + continue; + if (methodDef->mName.IsEmpty()) + continue; + + if (methodDef->mExplicitInterface != NULL) + continue; + if ((!interfaceType->IsTypeMemberIncluded(methodDef->mDeclaringType, activeTypeDef, mModule)) || + (!interfaceType->IsTypeMemberAccessible(methodDef->mDeclaringType, activeTypeDef))) + continue; + + if (methodDef->mIsStatic) + continue; + + bool canUseMethod; + canUseMethod = (methodDef->mMethodType == BfMethodType_Normal); + if (canUseMethod) + { + AddMethod(methodDef->GetMethodDeclaration(), methodDef->mName, filter); + } + } + + + return false; +} + void BfAutoComplete::CheckTypeRef(BfTypeReference* typeRef, bool mayBeIdentifier, bool isInExpression, bool onlyAttribute) { if ((typeRef == NULL) || (typeRef->IsTemporary()) || (!IsAutocompleteNode(typeRef))) @@ -2045,6 +2099,18 @@ void BfAutoComplete::CheckProperty(BfPropertyDeclaration* propertyDeclaration) mInsertEndIdx = propertyDeclaration->mNameNode->GetSrcEnd(); } + if (propertyDeclaration->mExplicitInterface != NULL) + { + BfTypeInstance* typeInst = NULL; + + auto type = mModule->ResolveTypeRef(propertyDeclaration->mExplicitInterface, BfPopulateType_DataAndMethods); + if (type != NULL) + typeInst = type->ToTypeInstance(); + + if (typeInst != NULL) + CheckExplicitInterface(typeInst, propertyDeclaration->mExplicitInterfaceDotToken, propertyDeclaration->mNameNode); + } + if ((propertyDeclaration->mVirtualSpecifier != NULL) && (propertyDeclaration->mVirtualSpecifier->GetToken() == BfToken_Override)) {