1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 19:48:20 +02:00
Beef/IDEHelper/Compiler/BfNamespaceVisitor.cpp

92 lines
2.5 KiB
C++
Raw Normal View History

2020-05-31 07:12:17 -07:00
#include "BfNamespaceVisitor.h"
#include "BfResolvePass.h"
#include "BfAutoComplete.h"
USING_NS_BF;
//////////////////////////////////////////////////////////////////////////
void BfNamespaceVisitor::Visit(BfUsingDirective* usingDirective)
{
if (usingDirective->mNamespace == NULL)
{
return;
}
String usingString = usingDirective->mNamespace->ToString();
BfAtomComposite usingComposite;
2020-05-31 09:43:15 -07:00
mSystem->ParseAtomComposite(usingString, usingComposite);
2020-05-31 07:12:17 -07:00
if (mResolvePassData->mAutoComplete != NULL)
mResolvePassData->mAutoComplete->CheckNamespace(usingDirective->mNamespace, usingComposite);
mResolvePassData->HandleNamespaceReference(usingDirective->mNamespace, usingComposite);
}
void BfNamespaceVisitor::Visit(BfUsingModDirective* usingDirective)
2020-05-31 07:12:17 -07:00
{
BfAstNode* useNode = usingDirective->mTypeRef;
BfAstNode* checkNode = usingDirective->mTypeRef;
while (true)
{
if (auto qualifiedTypeRef = BfNodeDynCast<BfQualifiedTypeReference>(checkNode))
checkNode = qualifiedTypeRef->mLeft;
else if (auto elementedTypeRef = BfNodeDynCast<BfElementedTypeRef>(checkNode))
{
checkNode = elementedTypeRef->mElementType;
useNode = checkNode;
}
else
break;
}
2020-07-05 09:37:27 -07:00
if (useNode == NULL)
return;
2020-05-31 07:12:17 -07:00
String usingString = useNode->ToString();
BfAtomComposite usingComposite;
2020-05-31 09:43:15 -07:00
if (mSystem->ParseAtomComposite(usingString, usingComposite))
2020-05-31 07:12:17 -07:00
mResolvePassData->HandleNamespaceReference(useNode, usingComposite);
}
void BfNamespaceVisitor::Visit(BfNamespaceDeclaration* namespaceDeclaration)
{
BfAtomComposite prevNamespace = mNamespace;
if (namespaceDeclaration->mNameNode == NULL)
return;
String namespaceLeft = namespaceDeclaration->mNameNode->ToString();
while (true)
{
int dotIdx = (int)namespaceLeft.IndexOf('.');
if (dotIdx == -1)
{
2020-05-31 09:43:15 -07:00
BfAtom* namespaceAtom = mSystem->FindAtom(namespaceLeft);
mNamespace.Set(mNamespace.mParts, mNamespace.mSize, &namespaceAtom, 1);
2020-05-31 07:12:17 -07:00
break;
}
2020-05-31 09:43:15 -07:00
BfAtom* namespaceAtom = mSystem->FindAtom(namespaceLeft.Substring(0, dotIdx));
2020-05-31 07:12:17 -07:00
mNamespace.Set(mNamespace.mParts, mNamespace.mSize, &namespaceAtom, 1);
namespaceLeft = namespaceLeft.Substring(dotIdx + 1);
}
if (mResolvePassData->mAutoComplete != NULL)
mResolvePassData->mAutoComplete->CheckNamespace(namespaceDeclaration->mNameNode, mNamespace);
mResolvePassData->HandleNamespaceReference(namespaceDeclaration->mNameNode, mNamespace);
VisitChild(namespaceDeclaration->mBlock);
mNamespace = prevNamespace;
}
void BfNamespaceVisitor::Visit(BfBlock* block)
{
VisitMembers(block);
}
void BfNamespaceVisitor::Visit(BfRootNode* rootNode)
{
VisitMembers(rootNode);
}