member.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. #include "explorer/ast/member.h"
  5. #include "common/check.h"
  6. #include "explorer/ast/declaration.h"
  7. namespace Carbon {
  8. Member::Member(Nonnull<const Declaration*> declaration)
  9. : member_(declaration) {}
  10. Member::Member(Nonnull<const NamedValue*> struct_member)
  11. : member_(struct_member) {}
  12. Member::Member(Nonnull<const IndexedValue*> tuple_member)
  13. : member_(tuple_member) {}
  14. auto Member::IsNamed(std::string_view other_name) const -> bool {
  15. return HasName() && name() == other_name;
  16. }
  17. auto Member::name() const -> std::string_view {
  18. CARBON_CHECK(HasName()) << "Unnamed member does not have a name()";
  19. if (const auto* decl = member_.dyn_cast<const Declaration*>()) {
  20. return GetName(*decl).value();
  21. } else if (const auto* named_valued = member_.dyn_cast<const NamedValue*>()) {
  22. return named_valued->name;
  23. } else {
  24. CARBON_FATAL() << "Unreachable";
  25. }
  26. }
  27. auto Member::HasPosition() const -> bool {
  28. return member_.dyn_cast<const IndexedValue*>() != nullptr;
  29. }
  30. auto Member::HasName() const -> bool {
  31. // Both are currently mutually exclusive
  32. return !HasPosition();
  33. }
  34. auto Member::index() const -> int {
  35. CARBON_CHECK(HasPosition())
  36. << "Non-positional member does not have an index()";
  37. return member_.dyn_cast<const IndexedValue*>()->index;
  38. }
  39. auto Member::type() const -> const Value& {
  40. if (const auto* decl = member_.dyn_cast<const Declaration*>()) {
  41. return decl->static_type();
  42. } else if (const auto* named_valued = member_.dyn_cast<const NamedValue*>()) {
  43. return *named_valued->value;
  44. } else {
  45. return *member_.get<const IndexedValue*>()->value;
  46. }
  47. }
  48. auto Member::declaration() const -> std::optional<Nonnull<const Declaration*>> {
  49. if (const auto* decl = member_.dyn_cast<const Declaration*>()) {
  50. return decl;
  51. }
  52. return std::nullopt;
  53. }
  54. void Member::Print(llvm::raw_ostream& out) const {
  55. if (HasName()) {
  56. out << name();
  57. } else if (const auto* value = member_.dyn_cast<const IndexedValue*>()) {
  58. out << "element #" << member_.get<const IndexedValue*>()->index;
  59. } else {
  60. CARBON_FATAL() << "Unhandled member type";
  61. }
  62. }
  63. } // namespace Carbon