1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 04:22:20 +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; return canCast ? (T*)node : NULL;
} }
struct BfExteriorNode
{
BfSizedArray<BfNamespaceDeclaration*> mNamespaceNodes;
BfAstNode* mNode;
};
BfIdentifierNode* BfIdentifierCast(BfAstNode* node); BfIdentifierNode* BfIdentifierCast(BfAstNode* node);
BfAstNode* BfNodeToNonTemporary(BfAstNode* node); BfAstNode* BfNodeToNonTemporary(BfAstNode* node);

View file

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

View file

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

View file

@ -354,6 +354,7 @@ public:
bool mDeleting; bool mDeleting;
BfTypeState* mCurTypeState; BfTypeState* mCurTypeState;
BfSizedArray<BfNamespaceDeclaration*>* mCurNamespaceNodes;
BfConstraintState* mCurConstraintState; BfConstraintState* mCurConstraintState;
bool mResolvingVarField; bool mResolvingVarField;
int mMappedObjectRevision; int mMappedObjectRevision;

View file

@ -8968,8 +8968,30 @@ BfTypeDef* BfModule::FindTypeDef(const BfAtomComposite& findName, int numGeneric
project = mCompiler->mResolvePassData->mParser->mProject; 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* 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)) if ((ambiguousTypeDef != NULL) && (error != NULL))
{ {
error->mErrorKind = BfTypeLookupError::BfErrorKind_Ambiguous; error->mErrorKind = BfTypeLookupError::BfErrorKind_Ambiguous;

View file

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

View file

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

View file

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