mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-29 19:44:57 +01:00
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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user