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:
parent
723f17f139
commit
f0bafae177
8 changed files with 53 additions and 11 deletions
|
@ -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);
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -50,6 +50,7 @@ BfContext::BfContext(BfCompiler* compiler) :
|
|||
mAllowLockYield = true;
|
||||
|
||||
mCurTypeState = NULL;
|
||||
mCurNamespaceNodes = NULL;
|
||||
mCurConstraintState = NULL;
|
||||
mResolvingVarField = false;
|
||||
mAssertOnPopulateType = false;
|
||||
|
|
|
@ -352,8 +352,9 @@ class BfContext
|
|||
public:
|
||||
CritSect mCritSect;
|
||||
bool mDeleting;
|
||||
|
||||
|
||||
BfTypeState* mCurTypeState;
|
||||
BfSizedArray<BfNamespaceDeclaration*>* mCurNamespaceNodes;
|
||||
BfConstraintState* mCurConstraintState;
|
||||
bool mResolvingVarField;
|
||||
int mMappedObjectRevision;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue