Skip to content

Commit

Permalink
Avoid redundantly specifying Id::Kind. (#4911)
Browse files Browse the repository at this point in the history
When a node kind's Id::Kind is determined from its category, don't also
require it to be listed in the switch over all node kinds. This was both
redundant and also error prone -- and in practice for several node
kinds, the Id::Kind computed in the two different ways was different.

Instead, have the switch over node kinds handle only special cases that
can't be handled by their category, and enforce that each node kind has
an Id::Kind specified in exactly one way via checks in the .cpp file.

This refines the previous change in #4280 -- we still get the improved
errors for missing updates, but now also don't require redundant
additions to the switch.
  • Loading branch information
zygoloid authored Feb 7, 2025
1 parent d005ac0 commit 1917ea2
Show file tree
Hide file tree
Showing 3 changed files with 162 additions and 242 deletions.
20 changes: 20 additions & 0 deletions toolchain/check/node_stack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,24 @@ auto NodeStack::PrintForStackDump(int indent, llvm::raw_ostream& output) const
}
}

// NOLINTNEXTLINE(readability-function-size)
auto NodeStack::CheckIdKindTable() -> void {
#define CARBON_PARSE_NODE_KIND(Name) \
{ \
constexpr auto from_category = \
NodeCategoryToIdKind(Parse::Name::Kind.category(), true); \
constexpr auto from_kind = \
NodeKindToIdKindSpecialCases(Parse::Name::Kind); \
static_assert(from_category || from_kind, \
"Id::Kind not specified for " #Name \
"; add to NodeStack::NodeKindToIdKindSpecialCases or " \
"specify a node category in typed_nodes.h"); \
static_assert(!from_category || !from_kind, \
"Special case Id::Kind specified for " #Name \
", but node category has an Id::Kind; remove from " \
"NodeStack::NodeKindToIdKindSpecialCases"); \
}
#include "toolchain/parse/node_kind.def"
}

} // namespace Carbon::Check
Loading

0 comments on commit 1917ea2

Please sign in to comment.