Files
carbon-lang/toolchain/semantics/semantics_ir.h
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

53 lines
1.5 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
#ifndef CARBON_TOOLCHAIN_SEMANTICS_SEMANTICS_IR_H_
#define CARBON_TOOLCHAIN_SEMANTICS_SEMANTICS_IR_H_
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/SmallVector.h"
#include "toolchain/parser/parse_tree.h"
#include "toolchain/semantics/node_store.h"
namespace Carbon::Testing {
class SemanticsIRForTest;
} // namespace Carbon::Testing
namespace Carbon {
// Provides semantic analysis on a ParseTree.
class SemanticsIR {
public:
// File-level declarations.
auto root_block() const -> llvm::ArrayRef<Semantics::NodeRef> {
return root_block_;
}
// Prints the full IR.
auto Print(llvm::raw_ostream& out) const -> void;
auto PrintBlock(llvm::raw_ostream& out, int indent,
llvm::ArrayRef<Semantics::NodeRef> node_refs) const -> void;
// Prints the node information.
auto Print(llvm::raw_ostream& out, int indent,
Semantics::NodeRef node_ref) const -> void;
private:
friend class SemanticsIRFactory;
friend class Testing::SemanticsIRForTest;
explicit SemanticsIR(const ParseTree& parse_tree)
: parse_tree_(&parse_tree) {}
Semantics::NodeStore nodes_;
llvm::SmallVector<Semantics::NodeRef, 0> root_block_;
const ParseTree* parse_tree_;
};
} // namespace Carbon
#endif // CARBON_TOOLCHAIN_SEMANTICS_SEMANTICS_IR_H_