builtins.h 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  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, Last = ImplicitAs };
  18. // TODO: In C++20, replace with `using enum Builtin;`.
  19. static constexpr Builtin ImplicitAs = Builtin::ImplicitAs;
  20. // Register a declaration that might be a builtin.
  21. void Register(Nonnull<const Declaration*> decl);
  22. // Get a registered builtin.
  23. auto Get(SourceLocation source_loc, Builtin builtin) const
  24. -> ErrorOr<Nonnull<const Declaration*>>;
  25. // Get the source name of a builtin.
  26. static constexpr auto GetName(Builtin builtin) -> const char* {
  27. return BuiltinNames[static_cast<int>(builtin)];
  28. }
  29. private:
  30. static constexpr int NumBuiltins = static_cast<int>(Builtin::Last) + 1;
  31. static constexpr const char* BuiltinNames[NumBuiltins] = {"ImplicitAs"};
  32. std::optional<Nonnull<const Declaration*>> builtins_[NumBuiltins] = {};
  33. };
  34. } // namespace Carbon
  35. #endif // CARBON_EXPLORER_INTERPRETER_BUILTINS_H_