mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-09 03:52:19 +02:00
Restricted global container lookup
This commit is contained in:
parent
1a7900c564
commit
534dc7fb22
4 changed files with 19 additions and 16 deletions
|
@ -16250,14 +16250,14 @@ void BfExprEvaluator::DoInvocation(BfAstNode* target, BfMethodBoundExpression* m
|
||||||
BfType* type;
|
BfType* type;
|
||||||
{
|
{
|
||||||
//SetAndRestoreValue<bool> prevIgnoreErrors(mModule->mIgnoreErrors, true);
|
//SetAndRestoreValue<bool> prevIgnoreErrors(mModule->mIgnoreErrors, true);
|
||||||
type = mModule->ResolveTypeRef(qualifiedName->mLeft, NULL, BfPopulateType_DataAndMethods, (BfResolveTypeRefFlags)(BfResolveTypeRefFlag_NoResolveGenericParam | BfResolveTypeRefFlag_IgnoreLookupError));
|
type = mModule->ResolveTypeRef(qualifiedName->mLeft, NULL, BfPopulateType_DataAndMethods, (BfResolveTypeRefFlags)(BfResolveTypeRefFlag_NoResolveGenericParam | BfResolveTypeRefFlag_AllowGlobalContainer | BfResolveTypeRefFlag_IgnoreLookupError));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type == NULL)
|
if (type == NULL)
|
||||||
{
|
{
|
||||||
//SetAndRestoreValue<bool> prevIgnoreErrors(mModule->mIgnoreErrors, true);
|
//SetAndRestoreValue<bool> prevIgnoreErrors(mModule->mIgnoreErrors, true);
|
||||||
|
|
||||||
type = mModule->ResolveTypeRef(qualifiedName, methodGenericArguments, BfPopulateType_DataAndMethods, (BfResolveTypeRefFlags)(BfResolveTypeRefFlag_NoResolveGenericParam | BfResolveTypeRefFlag_IgnoreLookupError));
|
type = mModule->ResolveTypeRef(qualifiedName, methodGenericArguments, BfPopulateType_DataAndMethods, (BfResolveTypeRefFlags)(BfResolveTypeRefFlag_NoResolveGenericParam | BfResolveTypeRefFlag_AllowGlobalContainer | BfResolveTypeRefFlag_IgnoreLookupError));
|
||||||
if (type != NULL)
|
if (type != NULL)
|
||||||
{
|
{
|
||||||
// This is a CTOR call, treat it as such
|
// This is a CTOR call, treat it as such
|
||||||
|
|
|
@ -1825,9 +1825,9 @@ public:
|
||||||
void ShowAmbiguousTypeError(BfAstNode* refNode, BfTypeDef* typeDef, BfTypeDef* otherTypeDef);
|
void ShowAmbiguousTypeError(BfAstNode* refNode, BfTypeDef* typeDef, BfTypeDef* otherTypeDef);
|
||||||
void ShowGenericArgCountError(BfAstNode* typeRef, int wantedGenericParams);
|
void ShowGenericArgCountError(BfAstNode* typeRef, int wantedGenericParams);
|
||||||
BfTypeDef* GetActiveTypeDef(BfTypeInstance* typeInstanceOverride = NULL, bool useMixinDecl = false); // useMixinDecl is useful for type lookup, but we don't want the decl project to limit what methods the user can call
|
BfTypeDef* GetActiveTypeDef(BfTypeInstance* typeInstanceOverride = NULL, bool useMixinDecl = false); // useMixinDecl is useful for type lookup, but we don't want the decl project to limit what methods the user can call
|
||||||
BfTypeDef* FindTypeDefRaw(const BfAtomComposite& findName, int numGenericArgs, BfTypeInstance* typeInstance, BfTypeDef* useTypeDef, BfTypeLookupError* error, BfTypeLookupResultCtx* lookupResultCtx = NULL);
|
BfTypeDef* FindTypeDefRaw(const BfAtomComposite& findName, int numGenericArgs, BfTypeInstance* typeInstance, BfTypeDef* useTypeDef, BfTypeLookupError* error, BfTypeLookupResultCtx* lookupResultCtx = NULL, BfResolveTypeRefFlags resolveFlags = (BfResolveTypeRefFlags)0);
|
||||||
BfTypeDef* FindTypeDef(const BfAtomComposite& findName, int numGenericArgs = 0, BfTypeInstance* typeInstanceOverride = NULL, BfTypeLookupError* error = NULL);
|
BfTypeDef* FindTypeDef(const BfAtomComposite& findName, int numGenericArgs = 0, BfTypeInstance* typeInstanceOverride = NULL, BfTypeLookupError* error = NULL, BfResolveTypeRefFlags resolveFlags = (BfResolveTypeRefFlags)0);
|
||||||
BfTypeDef* FindTypeDef(const StringImpl& typeName, int numGenericArgs = 0, BfTypeInstance* typeInstanceOverride = NULL, BfTypeLookupError* error = NULL);
|
BfTypeDef* FindTypeDef(const StringImpl& typeName, int numGenericArgs = 0, BfTypeInstance* typeInstanceOverride = NULL, BfTypeLookupError* error = NULL, BfResolveTypeRefFlags resolveFlags = (BfResolveTypeRefFlags)0);
|
||||||
BfTypeDef* FindTypeDef(BfTypeReference* typeRef, BfTypeInstance* typeInstanceOverride = NULL, BfTypeLookupError* error = NULL, int numGenericParams = 0, BfResolveTypeRefFlags resolveFlags = (BfResolveTypeRefFlags)0);
|
BfTypeDef* FindTypeDef(BfTypeReference* typeRef, BfTypeInstance* typeInstanceOverride = NULL, BfTypeLookupError* error = NULL, int numGenericParams = 0, BfResolveTypeRefFlags resolveFlags = (BfResolveTypeRefFlags)0);
|
||||||
BfTypedValue TryLookupGenericConstVaue(BfIdentifierNode* identifierNode, BfType* expectingType);
|
BfTypedValue TryLookupGenericConstVaue(BfIdentifierNode* identifierNode, BfType* expectingType);
|
||||||
void CheckTypeRefFixit(BfAstNode* typeRef, const char* appendName = NULL);
|
void CheckTypeRefFixit(BfAstNode* typeRef, const char* appendName = NULL);
|
||||||
|
|
|
@ -8418,7 +8418,7 @@ BfTypeDef* BfModule::GetActiveTypeDef(BfTypeInstance* typeInstanceOverride, bool
|
||||||
return useTypeDef;
|
return useTypeDef;
|
||||||
}
|
}
|
||||||
|
|
||||||
BfTypeDef* BfModule::FindTypeDefRaw(const BfAtomComposite& findName, int numGenericArgs, BfTypeInstance* typeInstance, BfTypeDef* useTypeDef, BfTypeLookupError* error, BfTypeLookupResultCtx* lookupResultCtx)
|
BfTypeDef* BfModule::FindTypeDefRaw(const BfAtomComposite& findName, int numGenericArgs, BfTypeInstance* typeInstance, BfTypeDef* useTypeDef, BfTypeLookupError* error, BfTypeLookupResultCtx* lookupResultCtx, BfResolveTypeRefFlags resolveFlags)
|
||||||
{
|
{
|
||||||
if ((findName.mSize == 1) && (findName.mParts[0]->mIsSystemType))
|
if ((findName.mSize == 1) && (findName.mParts[0]->mIsSystemType))
|
||||||
{
|
{
|
||||||
|
@ -8566,10 +8566,13 @@ BfTypeDef* BfModule::FindTypeDefRaw(const BfAtomComposite& findName, int numGene
|
||||||
if ((lookupResultCtx != NULL) && (lookupResultCtx->mResult != NULL) && (!lookupResultCtx->mIsVerify) && (foundInnerType != NULL) && (foundInnerType == lookupCtx.mBestTypeDef))
|
if ((lookupResultCtx != NULL) && (lookupResultCtx->mResult != NULL) && (!lookupResultCtx->mIsVerify) && (foundInnerType != NULL) && (foundInnerType == lookupCtx.mBestTypeDef))
|
||||||
lookupResultCtx->mResult->mFoundInnerType = true;
|
lookupResultCtx->mResult->mFoundInnerType = true;
|
||||||
|
|
||||||
|
if (((resolveFlags & BfResolveTypeRefFlag_AllowGlobalContainer) == 0) && (lookupCtx.mBestTypeDef != NULL) && (lookupCtx.mBestTypeDef->IsGlobalsContainer()))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
return lookupCtx.mBestTypeDef;
|
return lookupCtx.mBestTypeDef;
|
||||||
}
|
}
|
||||||
|
|
||||||
BfTypeDef* BfModule::FindTypeDef(const BfAtomComposite& findName, int numGenericArgs, BfTypeInstance* typeInstanceOverride, BfTypeLookupError* error)
|
BfTypeDef* BfModule::FindTypeDef(const BfAtomComposite& findName, int numGenericArgs, BfTypeInstance* typeInstanceOverride, BfTypeLookupError* error, BfResolveTypeRefFlags resolveFlags)
|
||||||
{
|
{
|
||||||
BP_ZONE("BfModule::FindTypeDef_1");
|
BP_ZONE("BfModule::FindTypeDef_1");
|
||||||
|
|
||||||
|
@ -8599,7 +8602,7 @@ BfTypeDef* BfModule::FindTypeDef(const BfAtomComposite& findName, int numGeneric
|
||||||
if ((mCompiler->mResolvePassData != NULL) && (mCompiler->mResolvePassData->mAutoComplete != NULL) && (typeInstance != NULL))
|
if ((mCompiler->mResolvePassData != NULL) && (mCompiler->mResolvePassData->mAutoComplete != NULL) && (typeInstance != NULL))
|
||||||
{
|
{
|
||||||
if (mCompiler->mResolvePassData->mAutoCompleteTempTypes.Contains(useTypeDef))
|
if (mCompiler->mResolvePassData->mAutoCompleteTempTypes.Contains(useTypeDef))
|
||||||
return FindTypeDefRaw(findName, numGenericArgs, typeInstance, useTypeDef, error);
|
return FindTypeDefRaw(findName, numGenericArgs, typeInstance, useTypeDef, error, NULL, resolveFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
BfTypeLookupEntry typeLookupEntry;
|
BfTypeLookupEntry typeLookupEntry;
|
||||||
|
@ -8623,7 +8626,7 @@ BfTypeDef* BfModule::FindTypeDef(const BfAtomComposite& findName, int numGeneric
|
||||||
|
|
||||||
BfTypeLookupResultCtx lookupResultCtx;
|
BfTypeLookupResultCtx lookupResultCtx;
|
||||||
lookupResultCtx.mResult = resultPtr;
|
lookupResultCtx.mResult = resultPtr;
|
||||||
auto typeDef = FindTypeDefRaw(findName, numGenericArgs, typeInstance, useTypeDef, errorPtr, &lookupResultCtx);
|
auto typeDef = FindTypeDefRaw(findName, numGenericArgs, typeInstance, useTypeDef, errorPtr, &lookupResultCtx, resolveFlags);
|
||||||
|
|
||||||
if (prevAllocSize != typeInstance->mLookupResults.size())
|
if (prevAllocSize != typeInstance->mLookupResults.size())
|
||||||
{
|
{
|
||||||
|
@ -8639,21 +8642,20 @@ BfTypeDef* BfModule::FindTypeDef(const BfAtomComposite& findName, int numGeneric
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ((resultPtr == NULL) || (resultPtr->mForceLookup))
|
if ((resultPtr == NULL) || (resultPtr->mForceLookup))
|
||||||
return FindTypeDefRaw(findName, numGenericArgs, typeInstance, useTypeDef, error);
|
return FindTypeDefRaw(findName, numGenericArgs, typeInstance, useTypeDef, error, NULL, resolveFlags);
|
||||||
else
|
else
|
||||||
return resultPtr->mTypeDef;
|
return resultPtr->mTypeDef;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BfTypeDef* BfModule::FindTypeDef(const StringImpl& typeName, int numGenericArgs, BfTypeInstance* typeInstanceOverride, BfTypeLookupError* error)
|
BfTypeDef* BfModule::FindTypeDef(const StringImpl& typeName, int numGenericArgs, BfTypeInstance* typeInstanceOverride, BfTypeLookupError* error, BfResolveTypeRefFlags resolveFlags)
|
||||||
{
|
{
|
||||||
BP_ZONE("BfModule::FindTypeDef_4");
|
BP_ZONE("BfModule::FindTypeDef_4");
|
||||||
|
|
||||||
BfSizedAtomComposite findName;
|
BfSizedAtomComposite findName;
|
||||||
if (!mSystem->ParseAtomComposite(typeName, findName))
|
if (!mSystem->ParseAtomComposite(typeName, findName))
|
||||||
return NULL;
|
return NULL;
|
||||||
auto result = FindTypeDef(findName, numGenericArgs, typeInstanceOverride, error);
|
auto result = FindTypeDef(findName, numGenericArgs, typeInstanceOverride, error, resolveFlags);
|
||||||
// Don't allow just finding extensions here. This can happen in some 'using static' cases but generally shouldn't happen
|
// Don't allow just finding extensions here. This can happen in some 'using static' cases but generally shouldn't happen
|
||||||
if ((result != NULL) && (result->mTypeCode == BfTypeCode_Extension))
|
if ((result != NULL) && (result->mTypeCode == BfTypeCode_Extension))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -8727,7 +8729,7 @@ BfTypeDef* BfModule::FindTypeDef(BfTypeReference* typeRef, BfTypeInstance* typeI
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
auto typeDef = FindTypeDef(findName, numGenericParams, typeInstanceOverride, error);
|
auto typeDef = FindTypeDef(findName, numGenericParams, typeInstanceOverride, error, resolveFlags);
|
||||||
//TYPEDEF if (namedTypeRef != NULL)
|
//TYPEDEF if (namedTypeRef != NULL)
|
||||||
// namedTypeRef->mTypeDef = typeDef;
|
// namedTypeRef->mTypeDef = typeDef;
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,8 @@ enum BfResolveTypeRefFlags
|
||||||
BfResolveTypeRefFlag_NoCreate = 0x400,
|
BfResolveTypeRefFlag_NoCreate = 0x400,
|
||||||
BfResolveTypeRefFlag_NoWarnOnMut = 0x800,
|
BfResolveTypeRefFlag_NoWarnOnMut = 0x800,
|
||||||
BfResolveTypeRefFlag_DisallowComptime = 0x1000,
|
BfResolveTypeRefFlag_DisallowComptime = 0x1000,
|
||||||
BfResolveTypeRefFlag_AllowDotDotDot = 0x2000
|
BfResolveTypeRefFlag_AllowDotDotDot = 0x2000,
|
||||||
|
BfResolveTypeRefFlag_AllowGlobalContainer = 0x4000
|
||||||
};
|
};
|
||||||
|
|
||||||
enum BfTypeNameFlags : uint16
|
enum BfTypeNameFlags : uint16
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue