builtins.h 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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 <optional>
  7. #include "common/error.h"
  8. #include "explorer/ast/declaration.h"
  9. #include "explorer/ast/expression.h"
  10. #include "explorer/common/nonnull.h"
  11. #include "explorer/common/source_location.h"
  12. #include "explorer/interpreter/value.h"
  13. namespace Carbon {
  14. class Builtins {
  15. public:
  16. explicit Builtins() {}
  17. enum class Builtin { ImplicitAs, As, Last = As };
  18. // TODO: In C++20, replace with `using enum Builtin;`.
  19. static constexpr Builtin ImplicitAs = Builtin::ImplicitAs;
  20. static constexpr Builtin As = Builtin::As;
  21. // Register a declaration that might be a builtin.
  22. void Register(Nonnull<const Declaration*> decl);
  23. // Get a registered builtin.
  24. auto Get(SourceLocation source_loc, Builtin builtin) const
  25. -> ErrorOr<Nonnull<const Declaration*>>;
  26. // Get the source name of a builtin.
  27. static constexpr auto GetName(Builtin builtin) -> const char* {
  28. return BuiltinNames[static_cast<int>(builtin)];
  29. }
  30. private:
  31. static constexpr int NumBuiltins = static_cast<int>(Builtin::Last) + 1;
  32. static constexpr const char* BuiltinNames[NumBuiltins] = {"ImplicitAs", "As"};
  33. std::optional<Nonnull<const Declaration*>> builtins_[NumBuiltins] = {};
  34. };
  35. } // namespace Carbon
  36. #endif // CARBON_EXPLORER_INTERPRETER_BUILTINS_H_