From 6c66d27ff48604e62577794657fda8c1d505f2cd Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Wed, 30 Oct 2024 13:31:16 -0400 Subject: [PATCH] Fixed `Self` renaming issue --- IDEHelper/Compiler/BfCompiler.cpp | 22 +++++++++++++-------- IDEHelper/Compiler/BfExprEvaluator.cpp | 9 +++++---- IDEHelper/Compiler/BfModule.cpp | 4 ++++ IDEHelper/Compiler/BfModule.h | 7 +++++-- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 25 ++++++++++++++++++------ 5 files changed, 47 insertions(+), 20 deletions(-) diff --git a/IDEHelper/Compiler/BfCompiler.cpp b/IDEHelper/Compiler/BfCompiler.cpp index 822fe11c..9281d354 100644 --- a/IDEHelper/Compiler/BfCompiler.cpp +++ b/IDEHelper/Compiler/BfCompiler.cpp @@ -4666,10 +4666,12 @@ void BfCompiler::ProcessAutocompleteTempType() if ((typeInst->IsUnspecializedType()) || (!typeInst->IsGenericTypeInstance())) { auto autoComplete = mResolvePassData->mAutoComplete; - if (autoComplete->IsAutocompleteNode(tempTypeDef->mTypeDeclaration->mNameNode)) - { - BfIdentifierNode* nameNode; - nameNode = tempTypeDef->mTypeDeclaration->mNameNode; + BfAstNode* nameNode = tempTypeDef->mTypeDeclaration->mNameNode; + BfAstNode* refNode = nameNode; + if (refNode == NULL) + refNode = tempTypeDef->mTypeDeclaration->mStaticSpecifier; + if (autoComplete->IsAutocompleteNode(refNode)) + { if ((actualTypeDef->mIsCombinedPartial) && (tempTypeDef->mTypeCode == BfTypeCode_Extension)) { autoComplete->AddTopLevelNamespaces(tempTypeDef->mTypeDeclaration->mNameNode); @@ -4677,15 +4679,19 @@ void BfCompiler::ProcessAutocompleteTempType() autoComplete->SetDefinitionLocation(actualTypeDef->mTypeDeclaration->mNameNode); } else - autoComplete->SetDefinitionLocation(nameNode); + autoComplete->SetDefinitionLocation(refNode); autoComplete->mDefType = actualTypeDef; - autoComplete->mInsertStartIdx = nameNode->GetSrcStart(); - autoComplete->mInsertEndIdx = nameNode->GetSrcEnd(); + + if (nameNode != NULL) + { + autoComplete->mInsertStartIdx = nameNode->GetSrcStart(); + autoComplete->mInsertEndIdx = nameNode->GetSrcEnd(); + } if (autoComplete->mResolveType == BfResolveType_GetResultString) { autoComplete->mResultString = ":"; - autoComplete->mResultString += module->TypeToString(typeInst, (BfTypeNameFlags)(BfTypeNameFlag_ExtendedInfo | BfTypeNameFlag_ResolveGenericParamNames)); + autoComplete->mResultString += module->TypeToString(typeInst, (BfTypeNameFlags)(BfTypeNameFlag_ExtendedInfo | BfTypeNameFlag_ResolveGenericParamNames)); } } } diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 18920d72..a5a7c7f1 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -10012,6 +10012,7 @@ BfTypedValue BfExprEvaluator::MatchMethod(BfAstNode* targetSrc, BfMethodBoundExp if ((methodGenericArguments != NULL) && (methodGenericArguments->size() > 0)) wantNumGenericArgs = (int)methodGenericArguments->size(); BfTypeInstance* resolvedTypeInstance = NULL; + BfResolveTypeRefFlags resolveFlags = BfResolveTypeRefFlag_None; if (wantCtor) { resolvedTypeInstance = targetTypeInst; @@ -10020,7 +10021,7 @@ BfTypedValue BfExprEvaluator::MatchMethod(BfAstNode* targetSrc, BfMethodBoundExp { if (auto invocationExpr = BfNodeDynCast(methodBoundExpr)) { - auto resolvedType = mModule->ResolveTypeRef(invocationExpr->mTarget, methodGenericArguments); + auto resolvedType = mModule->ResolveTypeRef_Ref(invocationExpr->mTarget, methodGenericArguments, BfPopulateType_Data, resolveFlags); if (resolvedType != NULL) resolvedTypeInstance = resolvedType->ToTypeInstance(); @@ -10036,10 +10037,10 @@ BfTypedValue BfExprEvaluator::MatchMethod(BfAstNode* targetSrc, BfMethodBoundExp BfType* refType; if (methodGenericArguments != NULL) { - refType = mModule->ResolveTypeRef(identifierNode, methodGenericArguments); + refType = mModule->ResolveTypeRef_Ref(identifierNode, methodGenericArguments, BfPopulateType_Data, resolveFlags); } else - refType = mModule->ResolveTypeRef(identifierNode, NULL); + refType = mModule->ResolveTypeRef_Ref(identifierNode, NULL, BfPopulateType_Data, resolveFlags); prevIgnoreErrors.Restore(); if ((refType != NULL) && (refType->IsPrimitiveType())) @@ -10104,7 +10105,7 @@ BfTypedValue BfExprEvaluator::MatchMethod(BfAstNode* targetSrc, BfMethodBoundExp if (mModule->mCompiler->mResolvePassData != NULL) { - if (!BfNodeIsA(targetSrc)) + if ((!BfNodeIsA(targetSrc)) && ((resolveFlags & BfResolveTypeRefFlag_FromIndirectSource) == 0)) mModule->mCompiler->mResolvePassData->HandleTypeReference(targetSrc, resolvedTypeInstance->mTypeDef); } diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index ad8cb1fc..d6687bb7 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -2859,7 +2859,11 @@ bool BfModule::CheckProtection(BfProtectionCheckFlags& flags, BfTypeInstance* me } bool allowPrivate = (curCheckType != NULL) && (memberOwner->IsInstanceOf(curCheckType->mTypeDef)); if (curCheckType != NULL) + { allowPrivate |= IsInnerType(curCheckType->mTypeDef, memberOwner->mTypeDef); + if (memberOwner->mTypeDef->IsGlobalsContainer()) + allowPrivate |= curCheckType->mTypeDef->mNamespace.StartsWith(memberOwner->mTypeDef->mNamespace); + } if (allowPrivate) flags = (BfProtectionCheckFlags)(flags | BfProtectionCheckFlag_AllowPrivate | BfProtectionCheckFlag_CheckedPrivate); else diff --git a/IDEHelper/Compiler/BfModule.h b/IDEHelper/Compiler/BfModule.h index 4b97c07e..78c29be4 100644 --- a/IDEHelper/Compiler/BfModule.h +++ b/IDEHelper/Compiler/BfModule.h @@ -1959,7 +1959,7 @@ public: void HandleTypeGenericParamRef(BfAstNode* refNode, BfTypeDef* typeDef, int typeGenericParamIdx); void HandleMethodGenericParamRef(BfAstNode* refNode, BfTypeDef* typeDef, BfMethodDef* methodDef, int typeGenericParamIdx); BfType* SafeResolveAliasType(BfTypeAliasType* aliasType); - bool ResolveTypeResult_Validate(BfAstNode* typeRef, BfType* resolvedTypeRef); + bool ResolveTypeResult_Validate(BfAstNode* typeRef, BfType* resolvedTypeRef); BfType* ResolveTypeResult(BfTypeReference* typeRef, BfType* resolvedTypeRef, BfPopulateType populateType, BfResolveTypeRefFlags resolveFlags); void ShowAmbiguousTypeError(BfAstNode* refNode, BfTypeDef* typeDef, BfTypeDef* otherTypeDef); void ShowGenericArgCountError(BfAstNode* typeRef, int wantedGenericParams); @@ -1974,10 +1974,13 @@ public: void TypeRefNotFound(BfTypeReference* typeRef, const char* appendName = NULL); bool ValidateTypeWildcard(BfAstNode* typeRef, bool isAttributeRef); void GetDelegateTypeRefAttributes(BfDelegateTypeRef* delegateTypeRef, BfCallingConvention& callingConvention); + BfType* ResolveTypeRef_Ref(BfTypeReference* typeRef, BfPopulateType populateType, BfResolveTypeRefFlags& resolveFlags, int numGenericArgs); BfType* ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType populateType = BfPopulateType_Data, BfResolveTypeRefFlags resolveFlags = (BfResolveTypeRefFlags)0, int numGenericArgs = 0); BfType* ResolveTypeRefAllowUnboundGenerics(BfTypeReference* typeRef, BfPopulateType populateType = BfPopulateType_Data, BfResolveTypeRefFlags resolveFlags = (BfResolveTypeRefFlags)0, bool resolveGenericParam = true); - BfType* ResolveTypeRef_Type(BfAstNode* astNode, const BfSizedArray* genericArgs, BfPopulateType populateType = BfPopulateType_Data, BfResolveTypeRefFlags resolveFlags = (BfResolveTypeRefFlags)0); + BfType* ResolveTypeRef_Type(BfAstNode* astNode, const BfSizedArray* genericArgs, BfPopulateType populateType, BfResolveTypeRefFlags& resolveFlags); + BfType* ResolveTypeRef_Ref(BfAstNode* astNode, const BfSizedArray* genericArgs, BfPopulateType populateType, BfResolveTypeRefFlags& resolveFlags); BfType* ResolveTypeRef(BfAstNode* astNode, const BfSizedArray* genericArgs, BfPopulateType populateType = BfPopulateType_Data, BfResolveTypeRefFlags resolveFlags = (BfResolveTypeRefFlags)0); + BfType* ResolveTypeDef(BfTypeDef* typeDef, BfPopulateType populateType = BfPopulateType_Data, BfResolveTypeRefFlags resolveFlags = BfResolveTypeRefFlag_None); BfType* ResolveTypeDef(BfTypeDef* typeDef, const BfTypeVector& genericArgs, BfPopulateType populateType = BfPopulateType_Data, BfResolveTypeRefFlags resolveFlags = BfResolveTypeRefFlag_None); BfType* ResolveInnerType(BfType* outerType, BfAstNode* typeRef, BfPopulateType populateType = BfPopulateType_Data, bool ignoreErrors = false, int numGenericArgs = 0, BfResolveTypeRefFlags resolveFlags = BfResolveTypeRefFlag_None); diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index f9234ae8..e6884f80 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -10863,6 +10863,11 @@ void BfModule::GetDelegateTypeRefAttributes(BfDelegateTypeRef* delegateTypeRef, } BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType populateType, BfResolveTypeRefFlags resolveFlags, int numGenericArgs) +{ + return ResolveTypeRef_Ref(typeRef, populateType, resolveFlags, numGenericArgs); +} + +BfType* BfModule::ResolveTypeRef_Ref(BfTypeReference* typeRef, BfPopulateType populateType, BfResolveTypeRefFlags& resolveFlags, int numGenericArgs) { //BP_ZONE("BfModule::ResolveTypeRef"); @@ -12769,7 +12774,7 @@ BfTypeInstance* BfModule::GetUnspecializedTypeInstance(BfTypeInstance* typeInst) return result->ToTypeInstance(); } -BfType* BfModule::ResolveTypeRef_Type(BfAstNode* astNode, const BfSizedArray* genericArgs, BfPopulateType populateType, BfResolveTypeRefFlags resolveFlags) +BfType* BfModule::ResolveTypeRef_Type(BfAstNode* astNode, const BfSizedArray* genericArgs, BfPopulateType populateType, BfResolveTypeRefFlags& resolveFlags) { if ((genericArgs == NULL) || (genericArgs->size() == 0)) { @@ -12779,7 +12784,7 @@ BfType* BfModule::ResolveTypeRef_Type(BfAstNode* astNode, const BfSizedArray* genericArgs, BfPopulateType populateType, BfResolveTypeRefFlags resolveFlags) +{ + return ResolveTypeRef_Ref(astNode, genericArgs, populateType, resolveFlags); +} + +BfType* BfModule::ResolveTypeRef_Ref(BfAstNode* astNode, const BfSizedArray* genericArgs, BfPopulateType populateType, BfResolveTypeRefFlags& resolveFlags) { if (astNode == NULL) { @@ -12858,13 +12868,14 @@ BfType* BfModule::ResolveTypeRef(BfAstNode* astNode, const BfSizedArray(astNode)) - return ResolveTypeRef(typeRef, populateType, resolveFlags); + return ResolveTypeRef_Ref(typeRef, populateType, resolveFlags, 0); if ((resolveFlags & BfResolveTypeRefFlag_AllowImplicitConstExpr) != 0) { if (auto expr = BfNodeDynCast(astNode)) { - auto checkType = ResolveTypeRef_Type(astNode, genericArgs, populateType, (BfResolveTypeRefFlags)(resolveFlags | BfResolveTypeRefFlag_IgnoreLookupError)); + resolveFlags = (BfResolveTypeRefFlags)(resolveFlags | BfResolveTypeRefFlag_IgnoreLookupError); + auto checkType = ResolveTypeRef_Type(astNode, genericArgs, populateType, resolveFlags); if (checkType != NULL) return checkType; @@ -15883,7 +15894,9 @@ void BfModule::DoTypeToString(StringImpl& str, BfType* resolvedType, BfTypeNameF if ((typeNameFlags & BfTypeNameFlag_ExtendedInfo) != 0) { - if (typeInstance->mTypeDef->mIsDelegate) + if (typeInstance->mTypeDef->IsGlobalsContainer()) + str += "static "; + else if (typeInstance->mTypeDef->mIsDelegate) str += "delegate "; else if (typeInstance->mTypeDef->mIsFunction) str += "function ";