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:
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;
|
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);
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -352,8 +352,9 @@ class BfContext
|
||||||
public:
|
public:
|
||||||
CritSect mCritSect;
|
CritSect mCritSect;
|
||||||
bool mDeleting;
|
bool mDeleting;
|
||||||
|
|
||||||
BfTypeState* mCurTypeState;
|
BfTypeState* mCurTypeState;
|
||||||
|
BfSizedArray<BfNamespaceDeclaration*>* mCurNamespaceNodes;
|
||||||
BfConstraintState* mCurConstraintState;
|
BfConstraintState* mCurConstraintState;
|
||||||
bool mResolvingVarField;
|
bool mResolvingVarField;
|
||||||
int mMappedObjectRevision;
|
int mMappedObjectRevision;
|
||||||
|
|
|
@ -8967,9 +8967,31 @@ BfTypeDef* BfModule::FindTypeDef(const BfAtomComposite& findName, int numGeneric
|
||||||
if ((mCompiler->mResolvePassData != NULL) && (mCompiler->mResolvePassData->mParser != NULL))
|
if ((mCompiler->mResolvePassData != NULL) && (mCompiler->mResolvePassData->mParser != NULL))
|
||||||
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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue