BfNamespaceVisitor.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include "BfNamespaceVisitor.h"
  2. #include "BfResolvePass.h"
  3. #include "BfAutoComplete.h"
  4. USING_NS_BF;
  5. //////////////////////////////////////////////////////////////////////////
  6. void BfNamespaceVisitor::Visit(BfUsingDirective* usingDirective)
  7. {
  8. if (usingDirective->mNamespace == NULL)
  9. {
  10. return;
  11. }
  12. String usingString = usingDirective->mNamespace->ToString();
  13. BfAtomCompositeT<16> usingComposite;
  14. mSystem->ParseAtomComposite(usingString, usingComposite);
  15. if (mResolvePassData->mAutoComplete != NULL)
  16. mResolvePassData->mAutoComplete->CheckNamespace(usingDirective->mNamespace, usingComposite);
  17. mResolvePassData->HandleNamespaceReference(usingDirective->mNamespace, usingComposite);
  18. }
  19. void BfNamespaceVisitor::Visit(BfUsingModDirective* usingDirective)
  20. {
  21. BfAstNode* useNode = usingDirective->mTypeRef;
  22. BfAstNode* checkNode = usingDirective->mTypeRef;
  23. while (true)
  24. {
  25. if (auto qualifiedTypeRef = BfNodeDynCast<BfQualifiedTypeReference>(checkNode))
  26. checkNode = qualifiedTypeRef->mLeft;
  27. else if (auto elementedTypeRef = BfNodeDynCast<BfElementedTypeRef>(checkNode))
  28. {
  29. checkNode = elementedTypeRef->mElementType;
  30. useNode = checkNode;
  31. }
  32. else
  33. break;
  34. }
  35. if (useNode == NULL)
  36. return;
  37. String usingString = useNode->ToString();
  38. BfAtomCompositeT<16> usingComposite;
  39. if (mSystem->ParseAtomComposite(usingString, usingComposite))
  40. mResolvePassData->HandleNamespaceReference(useNode, usingComposite);
  41. }
  42. void BfNamespaceVisitor::Visit(BfNamespaceDeclaration* namespaceDeclaration)
  43. {
  44. BfAtomCompositeT<16> prevNamespace = mNamespace;
  45. if (namespaceDeclaration->mNameNode == NULL)
  46. return;
  47. String namespaceLeft = namespaceDeclaration->mNameNode->ToString();
  48. while (true)
  49. {
  50. int dotIdx = (int)namespaceLeft.IndexOf('.');
  51. if (dotIdx == -1)
  52. {
  53. BfAtom* namespaceAtom = mSystem->FindAtom(namespaceLeft);
  54. mNamespace.Set(mNamespace.mParts, mNamespace.mSize, &namespaceAtom, 1);
  55. break;
  56. }
  57. BfAtom* namespaceAtom = mSystem->FindAtom(namespaceLeft.Substring(0, dotIdx));
  58. mNamespace.Set(mNamespace.mParts, mNamespace.mSize, &namespaceAtom, 1);
  59. namespaceLeft = namespaceLeft.Substring(dotIdx + 1);
  60. }
  61. if (mResolvePassData->mAutoComplete != NULL)
  62. mResolvePassData->mAutoComplete->CheckNamespace(namespaceDeclaration->mNameNode, mNamespace);
  63. mResolvePassData->HandleNamespaceReference(namespaceDeclaration->mNameNode, mNamespace);
  64. VisitChild(namespaceDeclaration->mBody);
  65. mNamespace = prevNamespace;
  66. }
  67. void BfNamespaceVisitor::Visit(BfBlock* block)
  68. {
  69. VisitMembers(block);
  70. }
  71. void BfNamespaceVisitor::Visit(BfRootNode* rootNode)
  72. {
  73. VisitMembers(rootNode);
  74. }