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

Added ability to rename namespaces

This commit is contained in:
Brian Fiete 2020-05-31 07:12:17 -07:00
parent 91e0d10128
commit 014263c3a7
16 changed files with 373 additions and 78 deletions

View file

@ -105,38 +105,70 @@ void BfResolvePassData::HandleLocalReference(BfIdentifierNode* identifier, BfIde
}
}
BfAstNode* BfResolvePassData::FindBaseNode(BfAstNode* node)
{
BfAstNode* baseNode = node;
while (true)
{
if (auto qualifiedTypeRef = BfNodeDynCast<BfQualifiedTypeReference>(baseNode))
{
baseNode = qualifiedTypeRef->mRight;
}
else if (auto elementedTypeRef = BfNodeDynCast<BfElementedTypeRef>(baseNode))
{
baseNode = elementedTypeRef->mElementType;
}
else if (auto namedTypeRef = BfNodeDynCast<BfNamedTypeReference>(baseNode))
{
baseNode = namedTypeRef->mNameNode;
}
else if (auto qualifiedNameNode = BfNodeDynCast<BfQualifiedNameNode>(baseNode))
{
baseNode = qualifiedNameNode->mRight;
}
else if (auto declTypeRef = BfNodeDynCast<BfDeclTypeRef>(baseNode))
{
baseNode = NULL;
break;
}
else
break;
}
return baseNode;
}
void BfResolvePassData::HandleTypeReference(BfAstNode* node, BfTypeDef* typeDef)
{
if ((mGetSymbolReferenceKind == BfGetSymbolReferenceKind_Type) && (mSymbolReferenceTypeDef == typeDef))
{
BfAstNode* baseNode = node;
while (true)
{
if (auto qualifiedTypeRef = BfNodeDynCast<BfQualifiedTypeReference>(baseNode))
{
baseNode = qualifiedTypeRef->mRight;
}
else if (auto elementedTypeRef = BfNodeDynCast<BfElementedTypeRef>(baseNode))
{
baseNode = elementedTypeRef->mElementType;
}
else if (auto namedTypeRef = BfNodeDynCast<BfNamedTypeReference>(baseNode))
{
baseNode = namedTypeRef->mNameNode;
}
else if (auto qualifiedNameNode = BfNodeDynCast<BfQualifiedNameNode>(baseNode))
{
baseNode = qualifiedNameNode->mRight;
}
else if (auto declTypeRef = BfNodeDynCast<BfDeclTypeRef>(baseNode))
{
baseNode = NULL;
break;
}
else
break;
}
auto baseNode = FindBaseNode(node);
if (baseNode != NULL)
RecordReplaceNode(baseNode);
}
}
void BfResolvePassData::HandleNamespaceReference(BfAstNode* node, const BfAtomComposite& namespaceName)
{
if ((mGetSymbolReferenceKind == BfGetSymbolReferenceKind_Namespace) && (namespaceName.StartsWith(mSymbolReferenceNamespace)))
{
BfAstNode* recordNode = node;
int leftCount = namespaceName.mSize - mSymbolReferenceNamespace.mSize;
for (int i = 0; i < leftCount; i++)
{
if (auto qualifiedTypeRef = BfNodeDynCast<BfQualifiedTypeReference>(recordNode))
{
recordNode = qualifiedTypeRef->mLeft;
}
else if (auto qualifiedNameNode = BfNodeDynCast<BfQualifiedNameNode>(recordNode))
{
recordNode = qualifiedNameNode->mLeft;
}
else
return;
}
auto baseNode = FindBaseNode(recordNode);
if (baseNode != NULL)
RecordReplaceNode(baseNode);
}