Files
carbon-lang/toolchain/semantics/semantics_ir.cpp
T
Jon Ross-Perkins c198dafbe8 Switch semantics-ir tests to lit (#2224)
This builds on semantics-ir lit support added by #2222
 
The googletest setup was feeling cumbersome, especially as I'm thinking about how to add more testing: I feel like I'm wrestling with the infrastructure.

The `[[ID1]]` and so on in tests is one advantage of switching: it's easier to do matching of IDs for verification. This is also more agnostic about the numbers than before, something which I'm concerned will be important as I think about builtins.

To explain my builtins thought, I think that needs to be another SemanticsIR with basically names pointing at builtin things. But this (a) creates multiple SemanticsIRs, which would confuse the current singleton approach and (b) starts creating more fluctuation for IDs, potentially impacting the numbers used (also, chandlerc's suggested pointers for some use-cases).

Overall it felt like I was heading towards a situation with googletest where writing the tests would be really difficult, and it was adding to my hesitance to write more code in the toolchain. I'm hoping this acts as a simplification.

Note, the "cp" commit has some incremental changes to googletest that I'd considered for making it easier to add matchers, but ultimately I ended up with this outcome.
2022-10-03 13:09:04 -07:00

60 lines
1.9 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/semantics/semantics_ir.h"
#include "common/check.h"
#include "llvm/Support/FormatVariadic.h"
#include "toolchain/lexer/tokenized_buffer.h"
namespace Carbon {
auto SemanticsIR::Print(llvm::raw_ostream& out) const -> void {
PrintBlock(out, 0, root_block());
out << "\n";
}
auto SemanticsIR::PrintBlock(llvm::raw_ostream& out, int indent,
llvm::ArrayRef<Semantics::NodeRef> node_refs) const
-> void {
out << "{\n";
int child_indent = indent + 2;
for (const auto& node_ref : node_refs) {
out.indent(child_indent);
Print(out, child_indent, node_ref);
out << ",\n";
}
out.indent(indent);
out << "}";
}
auto SemanticsIR::Print(llvm::raw_ostream& out, int indent,
Semantics::NodeRef node_ref) const -> void {
switch (node_ref.kind()) {
case Semantics::NodeKind::BinaryOperator:
nodes_.Get<Semantics::BinaryOperator>(node_ref).Print(out);
return;
case Semantics::NodeKind::Function:
nodes_.Get<Semantics::Function>(node_ref).Print(
out, indent,
[&](int block_indent, llvm::ArrayRef<Semantics::NodeRef> block) {
PrintBlock(out, block_indent, block);
});
return;
case Semantics::NodeKind::IntegerLiteral:
nodes_.Get<Semantics::IntegerLiteral>(node_ref).Print(out);
return;
case Semantics::NodeKind::Return:
nodes_.Get<Semantics::Return>(node_ref).Print(out);
return;
case Semantics::NodeKind::SetName:
nodes_.Get<Semantics::SetName>(node_ref).Print(out);
return;
case Semantics::NodeKind::Invalid:
CARBON_FATAL() << "Invalid NodeRef kind";
}
}
} // namespace Carbon