Avoid redundantly specifying Id::Kind. (#4911)

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.
This commit is contained in:
Richard Smith
2025-02-07 22:35:18 +00:00
committed by GitHub
parent d005ac034a
commit 1917ea223e
3 changed files with 162 additions and 242 deletions
+20
View File
@@ -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