builtins.h 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
  2. // Exceptions. See /LICENSE for license information.
  3. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. #ifndef CARBON_EXPLORER_INTERPRETER_BUILTINS_H_
  5. #define CARBON_EXPLORER_INTERPRETER_BUILTINS_H_
  6. #include <array>
  7. #include <optional>
  8. #include <string_view>
  9. #include "common/error.h"
  10. #include "explorer/ast/declaration.h"
  11. #include "explorer/ast/expression.h"
  12. #include "explorer/common/nonnull.h"
  13. #include "explorer/common/source_location.h"
  14. #include "explorer/interpreter/value.h"
  15. namespace Carbon {
  16. class Builtins {
  17. public:
  18. explicit Builtins() = default;
  19. enum class Builtin {
  20. // Conversions.
  21. As,
  22. ImplicitAs,
  23. // Comparison.
  24. EqWith,
  25. LessWith,
  26. LessEqWith,
  27. GreaterWith,
  28. GreaterEqWith,
  29. CompareWith,
  30. // Arithmetic.
  31. Negate,
  32. AddWith,
  33. SubWith,
  34. MulWith,
  35. DivWith,
  36. ModWith,
  37. // Bitwise and shift.
  38. BitComplement,
  39. BitAndWith,
  40. BitOrWith,
  41. BitXorWith,
  42. LeftShiftWith,
  43. RightShiftWith,
  44. // Simple assignment.
  45. AssignWith,
  46. // Compound assignment.
  47. AddAssignWith,
  48. SubAssignWith,
  49. MulAssignWith,
  50. DivAssignWith,
  51. ModAssignWith,
  52. BitAndAssignWith,
  53. BitOrAssignWith,
  54. BitXorAssignWith,
  55. LeftShiftAssignWith,
  56. RightShiftAssignWith,
  57. // Increment and decrement.
  58. Inc,
  59. Dec,
  60. Last = Dec
  61. };
  62. // TODO: In C++20, replace with `using enum Builtin;`.
  63. static constexpr Builtin As = Builtin::As;
  64. static constexpr Builtin ImplicitAs = Builtin::ImplicitAs;
  65. static constexpr Builtin EqWith = Builtin::EqWith;
  66. static constexpr Builtin LessWith = Builtin::LessWith;
  67. static constexpr Builtin LessEqWith = Builtin::LessEqWith;
  68. static constexpr Builtin GreaterWith = Builtin::GreaterWith;
  69. static constexpr Builtin GreaterEqWith = Builtin::GreaterEqWith;
  70. static constexpr Builtin CompareWith = Builtin::CompareWith;
  71. static constexpr Builtin Negate = Builtin::Negate;
  72. static constexpr Builtin AddWith = Builtin::AddWith;
  73. static constexpr Builtin SubWith = Builtin::SubWith;
  74. static constexpr Builtin MulWith = Builtin::MulWith;
  75. static constexpr Builtin DivWith = Builtin::DivWith;
  76. static constexpr Builtin ModWith = Builtin::ModWith;
  77. static constexpr Builtin BitComplement = Builtin::BitComplement;
  78. static constexpr Builtin BitAndWith = Builtin::BitAndWith;
  79. static constexpr Builtin BitOrWith = Builtin::BitOrWith;
  80. static constexpr Builtin BitXorWith = Builtin::BitXorWith;
  81. static constexpr Builtin LeftShiftWith = Builtin::LeftShiftWith;
  82. static constexpr Builtin RightShiftWith = Builtin::RightShiftWith;
  83. static constexpr Builtin AssignWith = Builtin::AssignWith;
  84. static constexpr Builtin AddAssignWith = Builtin::AddAssignWith;
  85. static constexpr Builtin SubAssignWith = Builtin::SubAssignWith;
  86. static constexpr Builtin MulAssignWith = Builtin::MulAssignWith;
  87. static constexpr Builtin DivAssignWith = Builtin::DivAssignWith;
  88. static constexpr Builtin ModAssignWith = Builtin::ModAssignWith;
  89. static constexpr Builtin BitAndAssignWith = Builtin::BitAndAssignWith;
  90. static constexpr Builtin BitOrAssignWith = Builtin::BitOrAssignWith;
  91. static constexpr Builtin BitXorAssignWith = Builtin::BitXorAssignWith;
  92. static constexpr Builtin LeftShiftAssignWith = Builtin::LeftShiftAssignWith;
  93. static constexpr Builtin RightShiftAssignWith = Builtin::RightShiftAssignWith;
  94. static constexpr Builtin Inc = Builtin::Inc;
  95. static constexpr Builtin Dec = Builtin::Dec;
  96. // Register a declaration that might be a builtin.
  97. void Register(Nonnull<const Declaration*> decl);
  98. // Get a registered builtin.
  99. auto Get(SourceLocation source_loc, Builtin builtin) const
  100. -> ErrorOr<Nonnull<const Declaration*>>;
  101. // Get the source name of a builtin.
  102. static constexpr auto GetName(Builtin builtin) -> std::string_view {
  103. return BuiltinNames[static_cast<int>(builtin)];
  104. }
  105. private:
  106. static constexpr int NumBuiltins = static_cast<int>(Builtin::Last) + 1;
  107. static constexpr const char* BuiltinNames[NumBuiltins] = {
  108. "As",
  109. "ImplicitAs",
  110. "EqWith",
  111. "LessWith",
  112. "LessEqWith",
  113. "GreaterWith",
  114. "GreaterEqWith",
  115. "CompareWith",
  116. "Negate",
  117. "AddWith",
  118. "SubWith",
  119. "MulWith",
  120. "DivWith",
  121. "ModWith",
  122. "BitComplement",
  123. "BitAndWith",
  124. "BitOrWith",
  125. "BitXorWith",
  126. "LeftShiftWith",
  127. "RightShiftWith",
  128. "AssignWith",
  129. "AddAssignWith",
  130. "SubAssignWith",
  131. "MulAssignWith",
  132. "DivAssignWith",
  133. "ModAssignWith",
  134. "BitAndAssignWith",
  135. "BitOrAssignWith",
  136. "BitXorAssignWith",
  137. "LeftShiftAssignWith",
  138. "RightShiftAssignWith",
  139. "Inc",
  140. "Dec"};
  141. std::optional<Nonnull<const Declaration*>> builtins_[NumBuiltins] = {};
  142. };
  143. } // namespace Carbon
  144. #endif // CARBON_EXPLORER_INTERPRETER_BUILTINS_H_