BfFixits.h 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #pragma once
  2. #include "BfSystem.h"
  3. #include "BfAst.h"
  4. #include "BfParser.h"
  5. NS_BF_BEGIN
  6. class BfFixitFinder : public BfElementVisitor
  7. {
  8. public:
  9. static int FindLineStartAfter(BfSourceData* source, int idx)
  10. {
  11. bool hadBr = false;
  12. while (idx < source->mSrcLength)
  13. {
  14. char c = source->mSrc[idx];
  15. if (c == '\n')
  16. {
  17. idx++;
  18. break;
  19. }
  20. idx++;
  21. }
  22. return idx;
  23. }
  24. static int FindLineStartAfter(BfAstNode* node)
  25. {
  26. return FindLineStartAfter(node->GetSourceData(), node->GetSrcEnd());
  27. }
  28. static int FindLineStartBefore(BfSourceData* source, int idx)
  29. {
  30. bool hadBr = false;
  31. while (idx >= 0)
  32. {
  33. char c = source->mSrc[idx];
  34. if (c == '\n')
  35. {
  36. idx++;
  37. break;
  38. }
  39. idx--;
  40. }
  41. return idx;
  42. }
  43. static int FindLineStartBefore(BfAstNode* node)
  44. {
  45. return FindLineStartBefore(node->GetSourceData(), node->GetSrcStart());
  46. }
  47. };
  48. class BfUsingFinder : public BfFixitFinder
  49. {
  50. public:
  51. int mFromIdx;
  52. int mLastIdx;
  53. public:
  54. BfUsingFinder()
  55. {
  56. mLastIdx = 0;
  57. mFromIdx = -1;
  58. }
  59. virtual void Visit(BfUsingDirective* usingDirective) override
  60. {
  61. mLastIdx = FindLineStartAfter(usingDirective->GetSourceData(), usingDirective->GetSrcEnd());
  62. }
  63. virtual void Visit(BfNamespaceDeclaration* namespaceDecl) override
  64. {
  65. if (mFromIdx != -1)
  66. {
  67. if ((mFromIdx < namespaceDecl->mSrcStart) || (mFromIdx >= namespaceDecl->mSrcEnd))
  68. {
  69. // Not inside
  70. return;
  71. }
  72. }
  73. BfFixitFinder::Visit(namespaceDecl);
  74. }
  75. };
  76. NS_BF_END