Files
carbon-lang/toolchain/check/node_stack.cpp
T
Jon Ross-Perkins 138ecf108f Remove verbose formatting of instructions on crash messages. (#4495)
Undoes a chunk of #4125 because nobody's really in favor of keeping the
formatting, and it's occasionally caused a crash in Formatter to
dominate output (and even when working, it can be verbose; the source
location in (5) is often more helpful).

Basically goes back to:

```
4.	Check::Context
          NodeStack:
            0. LetIntroducer: no value
            1. BindingPattern: inst+15
            2. LetInitializer: no value
            3. StructLiteralStart: no value
          inst_block_stack_:
            0.	block<invalid>	{inst+0, inst+1, inst+6, inst+7, inst+8, inst+9, inst+10, inst+11, inst+12}
            1.	global_init	{}
          pattern_block_stack_:
            0.	block<invalid>	{}
          param_and_arg_refs_stack:
            0.	block<invalid>	{}
          args_type_info_stack_:
            0.	block<invalid>	{}
5.	alias_of_alias.carbon:15:12: checking StructLiteral
          let d: c = {};
                     ^~
```

Fixes #4145
2024-11-07 16:22:36 +00:00

41 lines
1.3 KiB
C++

// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#include "toolchain/check/node_stack.h"
#include "llvm/ADT/STLExtras.h"
namespace Carbon::Check {
auto NodeStack::PrintForStackDump(int indent, llvm::raw_ostream& output) const
-> void {
auto print_id = [&]<Id::Kind Kind>(Id id) {
if constexpr (Kind == Id::Kind::None) {
output << "no value";
} else if constexpr (Kind == Id::Kind::Invalid) {
CARBON_FATAL("Should not be in node stack");
} else {
output << id.As<Kind>();
}
};
output.indent(indent);
output << "NodeStack:\n";
for (auto [i, entry] : llvm::enumerate(stack_)) {
auto node_kind = parse_tree_->node_kind(entry.node_id);
output.indent(indent + 2);
output << i << ". " << node_kind << ": ";
switch (node_kind) {
#define CARBON_PARSE_NODE_KIND(Kind) \
case Parse::NodeKind::Kind: \
print_id.operator()<NodeKindToIdKind(Parse::NodeKind::Kind)>(entry.id); \
break;
#include "toolchain/parse/node_kind.def"
}
output << "\n";
}
}
} // namespace Carbon::Check