ソースを参照

Explicit interface autocomplete

Brian Fiete 5 年 前
コミット
d6a9f4c9ca
1 ファイル変更66 行追加0 行削除
  1. 66 0
      IDEHelper/Compiler/BfAutoComplete.cpp

+ 66 - 0
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))
 	{