1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 20:42:21 +02:00

Fix for 'using static' namespace search inside namespace declarations

This commit is contained in:
Brian Fiete 2022-01-07 08:58:19 -05:00
parent 723f17f139
commit f0bafae177
8 changed files with 53 additions and 11 deletions

View file

@ -1528,6 +1528,12 @@ T* BfNodeDynCastExact(BfAstNode* node)
return canCast ? (T*)node : NULL;
}
struct BfExteriorNode
{
BfSizedArray<BfNamespaceDeclaration*> mNamespaceNodes;
BfAstNode* mNode;
};
BfIdentifierNode* BfIdentifierCast(BfAstNode* node);
BfAstNode* BfNodeToNonTemporary(BfAstNode* node);

View file

@ -3808,16 +3808,20 @@ void BfCompiler::VisitSourceExteriorNodes()
return;
bool failed = false;
for (auto node : parser->mParserData->mExteriorNodes)
{
if (auto usingDirective = BfNodeDynCast<BfUsingDirective>(node))
for (auto& node : parser->mParserData->mExteriorNodes)
{
SetAndRestoreValue<BfSizedArray<BfNamespaceDeclaration*>*> prevCurNamespaceNodes(mContext->mCurNamespaceNodes, &node.mNamespaceNodes);
auto exteriorAstNode = node.mNode;
if (auto usingDirective = BfNodeDynCast<BfUsingDirective>(exteriorAstNode))
{
srcNodes.Clear();
namespaceParts.Clear();
bool success = _AddName(usingDirective->mNamespace, true);
_CheckNamespace(parser, true, failed);
}
else if (auto usingDirective = BfNodeDynCast<BfUsingModDirective>(node))
else if (auto usingDirective = BfNodeDynCast<BfUsingModDirective>(exteriorAstNode))
{
if (usingDirective->mTypeRef != NULL)
{

View file

@ -50,6 +50,7 @@ BfContext::BfContext(BfCompiler* compiler) :
mAllowLockYield = true;
mCurTypeState = NULL;
mCurNamespaceNodes = NULL;
mCurConstraintState = NULL;
mResolvingVarField = false;
mAssertOnPopulateType = false;

View file

@ -352,8 +352,9 @@ class BfContext
public:
CritSect mCritSect;
bool mDeleting;
BfTypeState* mCurTypeState;
BfSizedArray<BfNamespaceDeclaration*>* mCurNamespaceNodes;
BfConstraintState* mCurConstraintState;
bool mResolvingVarField;
int mMappedObjectRevision;

View file

@ -8967,9 +8967,31 @@ BfTypeDef* BfModule::FindTypeDef(const BfAtomComposite& findName, int numGeneric
if ((mCompiler->mResolvePassData != NULL) && (mCompiler->mResolvePassData->mParser != NULL))
project = mCompiler->mResolvePassData->mParser->mProject;
BP_ZONE("System.FindTypeDef_2");
BP_ZONE("System.FindTypeDef_2");
Array<BfAtomComposite> namespaceSearch;
if (mContext->mCurNamespaceNodes != NULL)
{
String checkNamespace;
for (auto namespaceNode : *mContext->mCurNamespaceNodes)
{
if (namespaceNode->mNameNode != NULL)
{
if (!checkNamespace.IsEmpty())
checkNamespace += ".";
namespaceNode->mNameNode->ToString(checkNamespace);
}
}
if (!checkNamespace.IsEmpty())
{
BfAtomComposite atomComposite;
if (mSystem->ParseAtomComposite(checkNamespace, atomComposite))
namespaceSearch.Add(atomComposite);
}
}
BfTypeDef* ambiguousTypeDef = NULL;
BfTypeDef *result = mSystem->FindTypeDef(findName, numGenericArgs, project, Array<BfAtomComposite>(), &ambiguousTypeDef);
BfTypeDef *result = mSystem->FindTypeDef(findName, numGenericArgs, project, namespaceSearch, &ambiguousTypeDef);
if ((ambiguousTypeDef != NULL) && (error != NULL))
{
error->mErrorKind = BfTypeLookupError::BfErrorKind_Ambiguous;

View file

@ -8252,7 +8252,10 @@ BfAstNode* BfReducer::CreateTopLevelObject(BfTokenNode* tokenNode, BfAttributeDi
if (tokenNode != NULL)
MEMBER_SET(usingDirective, mTrailingSemicolon, tokenNode);
mExteriorNodes.Add(usingDirective);
BfExteriorNode exteriorNode;
exteriorNode.mNode = usingDirective;
BfSizedArrayInitIndirect(exteriorNode.mNamespaceNodes, mCurNamespaceStack, mAlloc);
mExteriorNodes.Add(exteriorNode);
return usingDirective;
}
}
@ -8292,7 +8295,9 @@ BfAstNode* BfReducer::CreateTopLevelObject(BfTokenNode* tokenNode, BfAttributeDi
}
}
mExteriorNodes.Add(usingDirective);
BfExteriorNode exteriorNode;
exteriorNode.mNode = usingDirective;
mExteriorNodes.Add(exteriorNode);
return usingDirective;
}
break;
@ -8316,7 +8321,9 @@ BfAstNode* BfReducer::CreateTopLevelObject(BfTokenNode* tokenNode, BfAttributeDi
MoveNode(blockNode, namespaceDeclaration);
namespaceDeclaration->mBlock = blockNode;
mCurNamespaceStack.Add(namespaceDeclaration);
HandleTopLevel(namespaceDeclaration->mBlock);
mCurNamespaceStack.pop_back();
return namespaceDeclaration;
}
break;

View file

@ -149,7 +149,8 @@ public:
bool mSkipCurrentNodeAssert;
BfVisitorPos mVisitorPos;
int mDocumentCheckIdx;
SizedArray<BfAstNode*, 4> mExteriorNodes;
SizedArray<BfNamespaceDeclaration*, 4> mCurNamespaceStack;
SizedArray<BfExteriorNode, 4> mExteriorNodes;
int mAssertCurrentNodeIdx;

View file

@ -31,7 +31,7 @@ public:
BfRootNode* mRootNode;
BfRootNode* mErrorRootNode;
BfSizedArray<BfAstNode*> mExteriorNodes;
BfSizedArray<BfExteriorNode> mExteriorNodes;
int mExteriorNodesCheckIdx; // 0 = unchecked, -1 = failed, >0 means success and equals the BfSystem.mTypesIdx
BfSourceData()