Scope.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #include "Scope.h"
  2. #include "Semantic.h"
  3. #include "Builtin.h"
  4. using namespace qlow;
  5. sem::Scope::~Scope(void)
  6. {
  7. }
  8. sem::Variable* sem::GlobalScope::getVariable(const std::string& name)
  9. {
  10. return nullptr;
  11. }
  12. sem::Method* sem::GlobalScope::getMethod(const std::string& name)
  13. {
  14. if (const auto& f = functions.find(name); f != functions.end()) {
  15. return f->second.get();
  16. }
  17. return nullptr;
  18. }
  19. std::optional<sem::Type> sem::GlobalScope::getType(const std::string& name)
  20. {
  21. auto native = NativeScope::getInstance().getType(name);
  22. if (native) {
  23. return native;
  24. }
  25. auto t = classes.find(name);
  26. if (t != classes.end())
  27. return std::make_optional(Type(t->second.get()));
  28. return std::nullopt;
  29. }
  30. std::optional<sem::Type> sem::GlobalScope::getReturnableType(void)
  31. {
  32. return std::nullopt;
  33. }
  34. std::string sem::GlobalScope::toString(void)
  35. {
  36. std::string ret;
  37. ret += "Classes:\n";
  38. for (auto& [name, c] : classes) {
  39. ret += "\t";
  40. ret += c->toString() + "\n";
  41. }
  42. return ret;
  43. }
  44. std::optional<sem::Type> sem::NativeScope::getType(const std::string& name)
  45. {
  46. auto t = types.find(name);
  47. if (t != types.end())
  48. return *t->second;
  49. return std::nullopt;
  50. }
  51. sem::NativeScope sem::NativeScope::instance = sem::generateNativeScope();
  52. sem::NativeScope& sem::NativeScope::getInstance(void)
  53. {
  54. return instance;
  55. }
  56. std::string sem::NativeScope::toString(void)
  57. {
  58. return "NativeScope";
  59. }
  60. sem::Variable* sem::ClassScope::getVariable(const std::string& name)
  61. {
  62. if (class_ref == nullptr)
  63. return parentScope.getVariable(name);
  64. auto m = class_ref->fields.find(name);
  65. if (m != class_ref->fields.end())
  66. return (*m).second.get();
  67. return parentScope.getVariable(name);
  68. }
  69. sem::Method * sem::ClassScope::getMethod(const std::string& name)
  70. {
  71. if (class_ref == nullptr)
  72. return parentScope.getMethod(name);
  73. auto m = class_ref->methods.find(name);
  74. if (m != class_ref->methods.end())
  75. return (*m).second.get();
  76. return parentScope.getMethod(name);
  77. }
  78. std::string sem::ClassScope::toString(void)
  79. {
  80. std::string ret;
  81. for (auto& [name, m] : class_ref->methods) {
  82. ret += "\t";
  83. ret += m->toString() + "\n";
  84. }
  85. for (auto& [name, f] : class_ref->fields) {
  86. ret += "\t";
  87. ret += f->toString() + "\n";
  88. }
  89. return ret + "\nParent:\n" + parentScope.toString();
  90. }
  91. std::optional<sem::Type> sem::ClassScope::getType(const std::string& name)
  92. {
  93. return parentScope.getType(name);
  94. }
  95. std::optional<sem::Type> sem::ClassScope::getReturnableType(void)
  96. {
  97. return std::nullopt;
  98. }
  99. void sem::LocalScope::putVariable(const std::string& name, std::unique_ptr<Variable> v)
  100. {
  101. localVariables.insert({name, std::move(v)});
  102. }
  103. sem::SymbolTable<sem::Variable>& sem::LocalScope::getLocals(void)
  104. {
  105. return localVariables;
  106. }
  107. sem::Variable* sem::LocalScope::getVariable(const std::string& name)
  108. {
  109. auto m = localVariables.find(name);
  110. if (m != localVariables.end())
  111. return (*m).second.get();
  112. return parentScope.getVariable(name);
  113. }
  114. sem::Method* sem::LocalScope::getMethod(const std::string& name)
  115. {
  116. return parentScope.getMethod(name);
  117. }
  118. std::optional<sem::Type> sem::LocalScope::getType(const std::string& name)
  119. {
  120. return parentScope.getType(name);
  121. }
  122. std::optional<sem::Type> sem::LocalScope::getReturnableType(void)
  123. {
  124. return returnType;
  125. }
  126. std::string sem::LocalScope::toString(void)
  127. {
  128. std::string ret;
  129. for (auto& [name, v] : localVariables) {
  130. ret += "\t";
  131. ret += v->toString() + "\n";
  132. }
  133. return ret + "\nParent:\n" + parentScope.toString();
  134. }