[ast] Add the result_type into the AST dump
This CL adds the result_type type_name into the AST dump if available.
Bug: tint:310, tint:308
Change-Id: Iea678fd4f7a2dadbfca86f29043c75459c421cb3
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/32780
Reviewed-by: Sarah Mashayekhi <sarahmashay@google.com>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/src/ast/array_accessor_expression.cc b/src/ast/array_accessor_expression.cc
index 4fcb5e0..9fa112f 100644
--- a/src/ast/array_accessor_expression.cc
+++ b/src/ast/array_accessor_expression.cc
@@ -52,7 +52,7 @@
void ArrayAccessorExpression::to_str(std::ostream& out, size_t indent) const {
make_indent(out, indent);
- out << "ArrayAccessor{" << std::endl;
+ out << "ArrayAccessor[" << result_type_str() << "]{" << std::endl;
array_->to_str(out, indent + 2);
idx_expr_->to_str(out, indent + 2);
make_indent(out, indent);
diff --git a/src/ast/array_accessor_expression_test.cc b/src/ast/array_accessor_expression_test.cc
index 1b1f3bd..b9b95fa 100644
--- a/src/ast/array_accessor_expression_test.cc
+++ b/src/ast/array_accessor_expression_test.cc
@@ -96,9 +96,9 @@
std::ostringstream out;
exp.to_str(out, 2);
- EXPECT_EQ(out.str(), R"( ArrayAccessor{
- Identifier{ary}
- Identifier{idx}
+ EXPECT_EQ(out.str(), R"( ArrayAccessor[not set]{
+ Identifier[not set]{ary}
+ Identifier[not set]{idx}
}
)");
}
diff --git a/src/ast/assignment_statement_test.cc b/src/ast/assignment_statement_test.cc
index 10c9542..fffe29a 100644
--- a/src/ast/assignment_statement_test.cc
+++ b/src/ast/assignment_statement_test.cc
@@ -101,8 +101,8 @@
stmt.to_str(out, 2);
EXPECT_EQ(out.str(), R"( Assignment{
- Identifier{lhs}
- Identifier{rhs}
+ Identifier[not set]{lhs}
+ Identifier[not set]{rhs}
}
)");
}
diff --git a/src/ast/binary_expression.cc b/src/ast/binary_expression.cc
index 47d600d..0b9e5a3 100644
--- a/src/ast/binary_expression.cc
+++ b/src/ast/binary_expression.cc
@@ -50,7 +50,7 @@
void BinaryExpression::to_str(std::ostream& out, size_t indent) const {
make_indent(out, indent);
- out << "Binary{" << std::endl;
+ out << "Binary[" << result_type_str() << "]{" << std::endl;
lhs_->to_str(out, indent + 2);
make_indent(out, indent + 2);
diff --git a/src/ast/binary_expression_test.cc b/src/ast/binary_expression_test.cc
index 395c844..c6e0d04 100644
--- a/src/ast/binary_expression_test.cc
+++ b/src/ast/binary_expression_test.cc
@@ -111,10 +111,10 @@
BinaryExpression r(BinaryOp::kEqual, std::move(lhs), std::move(rhs));
std::ostringstream out;
r.to_str(out, 2);
- EXPECT_EQ(out.str(), R"( Binary{
- Identifier{lhs}
+ EXPECT_EQ(out.str(), R"( Binary[not set]{
+ Identifier[not set]{lhs}
equal
- Identifier{rhs}
+ Identifier[not set]{rhs}
}
)");
}
diff --git a/src/ast/bitcast_expression.cc b/src/ast/bitcast_expression.cc
index 8f83477..6bd378e 100644
--- a/src/ast/bitcast_expression.cc
+++ b/src/ast/bitcast_expression.cc
@@ -43,7 +43,8 @@
void BitcastExpression::to_str(std::ostream& out, size_t indent) const {
make_indent(out, indent);
- out << "Bitcast<" << type_->type_name() << ">{" << std::endl;
+ out << "Bitcast[" << result_type_str() << "]<" << type_->type_name() << ">{"
+ << std::endl;
expr_->to_str(out, indent + 2);
make_indent(out, indent);
out << "}" << std::endl;
diff --git a/src/ast/bitcast_expression_test.cc b/src/ast/bitcast_expression_test.cc
index 071ad89..baee3d2 100644
--- a/src/ast/bitcast_expression_test.cc
+++ b/src/ast/bitcast_expression_test.cc
@@ -89,8 +89,8 @@
std::ostringstream out;
exp.to_str(out, 2);
- EXPECT_EQ(out.str(), R"( Bitcast<__f32>{
- Identifier{expr}
+ EXPECT_EQ(out.str(), R"( Bitcast[not set]<__f32>{
+ Identifier[not set]{expr}
}
)");
}
diff --git a/src/ast/call_expression.cc b/src/ast/call_expression.cc
index f7d71c7..74ea7f4 100644
--- a/src/ast/call_expression.cc
+++ b/src/ast/call_expression.cc
@@ -50,7 +50,7 @@
void CallExpression::to_str(std::ostream& out, size_t indent) const {
make_indent(out, indent);
- out << "Call{" << std::endl;
+ out << "Call[" << result_type_str() << "]{" << std::endl;
func_->to_str(out, indent + 2);
make_indent(out, indent + 2);
diff --git a/src/ast/call_expression_test.cc b/src/ast/call_expression_test.cc
index 6cdcbcb..e03fd9f 100644
--- a/src/ast/call_expression_test.cc
+++ b/src/ast/call_expression_test.cc
@@ -101,8 +101,8 @@
CallExpression stmt(std::move(func), {});
std::ostringstream out;
stmt.to_str(out, 2);
- EXPECT_EQ(out.str(), R"( Call{
- Identifier{func}
+ EXPECT_EQ(out.str(), R"( Call[not set]{
+ Identifier[not set]{func}
(
)
}
@@ -118,11 +118,11 @@
CallExpression stmt(std::move(func), std::move(params));
std::ostringstream out;
stmt.to_str(out, 2);
- EXPECT_EQ(out.str(), R"( Call{
- Identifier{func}
+ EXPECT_EQ(out.str(), R"( Call[not set]{
+ Identifier[not set]{func}
(
- Identifier{param1}
- Identifier{param2}
+ Identifier[not set]{param1}
+ Identifier[not set]{param2}
)
}
)");
diff --git a/src/ast/call_statement_test.cc b/src/ast/call_statement_test.cc
index b9df302..b186606 100644
--- a/src/ast/call_statement_test.cc
+++ b/src/ast/call_statement_test.cc
@@ -60,8 +60,8 @@
std::ostringstream out;
c.to_str(out, 2);
- EXPECT_EQ(out.str(), R"( Call{
- Identifier{func}
+ EXPECT_EQ(out.str(), R"( Call[not set]{
+ Identifier[not set]{func}
(
)
}
diff --git a/src/ast/decorated_variable_test.cc b/src/ast/decorated_variable_test.cc
index 7c82d78..706a509 100644
--- a/src/ast/decorated_variable_test.cc
+++ b/src/ast/decorated_variable_test.cc
@@ -133,7 +133,7 @@
function
__f32
{
- Identifier{expr}
+ Identifier[not set]{expr}
}
}
)");
diff --git a/src/ast/else_statement_test.cc b/src/ast/else_statement_test.cc
index 826648e..b61c02a 100644
--- a/src/ast/else_statement_test.cc
+++ b/src/ast/else_statement_test.cc
@@ -116,7 +116,7 @@
e.to_str(out, 2);
EXPECT_EQ(out.str(), R"( Else{
(
- ScalarConstructor{true}
+ ScalarConstructor[not set]{true}
)
{
Discard{}
diff --git a/src/ast/expression.h b/src/ast/expression.h
index be2c0f6..603ae92 100644
--- a/src/ast/expression.h
+++ b/src/ast/expression.h
@@ -16,6 +16,7 @@
#define SRC_AST_EXPRESSION_H_
#include <memory>
+#include <string>
#include <vector>
#include "src/ast/node.h"
@@ -44,6 +45,12 @@
/// @returns the resulting type from this expression
type::Type* result_type() const { return result_type_; }
+ /// @returns a string representation of the result type or 'not set' if no
+ /// result type present
+ std::string result_type_str() const {
+ return result_type_ ? result_type_->type_name() : "not set";
+ }
+
/// @returns true if this is an array accessor expression
virtual bool IsArrayAccessor() const;
/// @returns true if this is a bitcast expression
diff --git a/src/ast/identifier_expression.cc b/src/ast/identifier_expression.cc
index 375387e..76f92a2 100644
--- a/src/ast/identifier_expression.cc
+++ b/src/ast/identifier_expression.cc
@@ -38,7 +38,8 @@
void IdentifierExpression::to_str(std::ostream& out, size_t indent) const {
make_indent(out, indent);
- out << "Identifier{" << name_ << "}" << std::endl;
+ out << "Identifier[" << result_type_str() << "]{" << name_ << "}"
+ << std::endl;
}
} // namespace ast
diff --git a/src/ast/identifier_expression_test.cc b/src/ast/identifier_expression_test.cc
index 7262fae..c4c6539 100644
--- a/src/ast/identifier_expression_test.cc
+++ b/src/ast/identifier_expression_test.cc
@@ -55,7 +55,7 @@
IdentifierExpression i("ident");
std::ostringstream out;
i.to_str(out, 2);
- EXPECT_EQ(out.str(), R"( Identifier{ident}
+ EXPECT_EQ(out.str(), R"( Identifier[not set]{ident}
)");
}
diff --git a/src/ast/if_statement_test.cc b/src/ast/if_statement_test.cc
index 20141ad..c9458ba 100644
--- a/src/ast/if_statement_test.cc
+++ b/src/ast/if_statement_test.cc
@@ -186,7 +186,7 @@
stmt.to_str(out, 2);
EXPECT_EQ(out.str(), R"( If{
(
- Identifier{cond}
+ Identifier[not set]{cond}
)
{
Discard{}
@@ -221,7 +221,7 @@
stmt.to_str(out, 2);
EXPECT_EQ(out.str(), R"( If{
(
- Identifier{cond}
+ Identifier[not set]{cond}
)
{
Discard{}
@@ -229,7 +229,7 @@
}
Else{
(
- Identifier{ident}
+ Identifier[not set]{ident}
)
{
Discard{}
diff --git a/src/ast/member_accessor_expression.cc b/src/ast/member_accessor_expression.cc
index c88b604..d10eb06 100644
--- a/src/ast/member_accessor_expression.cc
+++ b/src/ast/member_accessor_expression.cc
@@ -53,7 +53,7 @@
void MemberAccessorExpression::to_str(std::ostream& out, size_t indent) const {
make_indent(out, indent);
- out << "MemberAccessor{" << std::endl;
+ out << "MemberAccessor[" << result_type_str() << "]{" << std::endl;
struct_->to_str(out, indent + 2);
member_->to_str(out, indent + 2);
make_indent(out, indent);
diff --git a/src/ast/member_accessor_expression_test.cc b/src/ast/member_accessor_expression_test.cc
index 6dc2a9e..42be3d1 100644
--- a/src/ast/member_accessor_expression_test.cc
+++ b/src/ast/member_accessor_expression_test.cc
@@ -100,9 +100,9 @@
MemberAccessorExpression stmt(std::move(str), std::move(mem));
std::ostringstream out;
stmt.to_str(out, 2);
- EXPECT_EQ(out.str(), R"( MemberAccessor{
- Identifier{structure}
- Identifier{member}
+ EXPECT_EQ(out.str(), R"( MemberAccessor[not set]{
+ Identifier[not set]{structure}
+ Identifier[not set]{member}
}
)");
}
diff --git a/src/ast/node.h b/src/ast/node.h
index 38adf7f..9ab4db6 100644
--- a/src/ast/node.h
+++ b/src/ast/node.h
@@ -40,9 +40,7 @@
/// Writes a representation of the node to the output stream
/// @param out the stream to write to
/// @param indent number of spaces to indent the node when writing
- //! @cond Doxygen_Suppress
virtual void to_str(std::ostream& out, size_t indent) const = 0;
- //! @endcond
/// Convenience wrapper around the |to_str| method.
/// @returns the node as a string
diff --git a/src/ast/return_statement_test.cc b/src/ast/return_statement_test.cc
index 02bf3d2..59c01e5 100644
--- a/src/ast/return_statement_test.cc
+++ b/src/ast/return_statement_test.cc
@@ -80,7 +80,7 @@
r.to_str(out, 2);
EXPECT_EQ(out.str(), R"( Return{
{
- Identifier{expr}
+ Identifier[not set]{expr}
}
}
)");
diff --git a/src/ast/scalar_constructor_expression.cc b/src/ast/scalar_constructor_expression.cc
index 287cb36..52b3ed2 100644
--- a/src/ast/scalar_constructor_expression.cc
+++ b/src/ast/scalar_constructor_expression.cc
@@ -45,7 +45,8 @@
void ScalarConstructorExpression::to_str(std::ostream& out,
size_t indent) const {
make_indent(out, indent);
- out << "ScalarConstructor{" << literal_->to_str() << "}" << std::endl;
+ out << "ScalarConstructor[" << result_type_str() << "]{" << literal_->to_str()
+ << "}" << std::endl;
}
} // namespace ast
diff --git a/src/ast/scalar_constructor_expression_test.cc b/src/ast/scalar_constructor_expression_test.cc
index 9ca57a7..e465113 100644
--- a/src/ast/scalar_constructor_expression_test.cc
+++ b/src/ast/scalar_constructor_expression_test.cc
@@ -59,7 +59,7 @@
ScalarConstructorExpression c(std::move(b));
std::ostringstream out;
c.to_str(out, 2);
- EXPECT_EQ(out.str(), R"( ScalarConstructor{true}
+ EXPECT_EQ(out.str(), R"( ScalarConstructor[not set]{true}
)");
}
diff --git a/src/ast/switch_statement_test.cc b/src/ast/switch_statement_test.cc
index 8bf21b7..9e27d4a 100644
--- a/src/ast/switch_statement_test.cc
+++ b/src/ast/switch_statement_test.cc
@@ -145,7 +145,7 @@
std::ostringstream out;
stmt.to_str(out, 2);
EXPECT_EQ(out.str(), R"( Switch{
- Identifier{ident}
+ Identifier[not set]{ident}
{
}
}
@@ -167,7 +167,7 @@
std::ostringstream out;
stmt.to_str(out, 2);
EXPECT_EQ(out.str(), R"( Switch{
- Identifier{ident}
+ Identifier[not set]{ident}
{
Case 2{
}
diff --git a/src/ast/type_constructor_expression.cc b/src/ast/type_constructor_expression.cc
index e29e620..e68ddba 100644
--- a/src/ast/type_constructor_expression.cc
+++ b/src/ast/type_constructor_expression.cc
@@ -55,7 +55,7 @@
void TypeConstructorExpression::to_str(std::ostream& out, size_t indent) const {
make_indent(out, indent);
- out << "TypeConstructor{" << std::endl;
+ out << "TypeConstructor[" << result_type_str() << "]{" << std::endl;
make_indent(out, indent + 2);
out << type_->type_name() << std::endl;
diff --git a/src/ast/type_constructor_expression_test.cc b/src/ast/type_constructor_expression_test.cc
index 8a30a62..ba2a88f 100644
--- a/src/ast/type_constructor_expression_test.cc
+++ b/src/ast/type_constructor_expression_test.cc
@@ -114,11 +114,11 @@
TypeConstructorExpression t(&vec, std::move(expr));
std::ostringstream out;
t.to_str(out, 2);
- EXPECT_EQ(out.str(), R"( TypeConstructor{
+ EXPECT_EQ(out.str(), R"( TypeConstructor[not set]{
__vec_3__f32
- Identifier{expr_1}
- Identifier{expr_2}
- Identifier{expr_3}
+ Identifier[not set]{expr_1}
+ Identifier[not set]{expr_2}
+ Identifier[not set]{expr_3}
}
)");
}
diff --git a/src/ast/unary_op_expression.cc b/src/ast/unary_op_expression.cc
index 2439601..10d73b4 100644
--- a/src/ast/unary_op_expression.cc
+++ b/src/ast/unary_op_expression.cc
@@ -42,7 +42,7 @@
void UnaryOpExpression::to_str(std::ostream& out, size_t indent) const {
make_indent(out, indent);
- out << "UnaryOp{" << std::endl;
+ out << "UnaryOp[" << result_type_str() << "]{" << std::endl;
make_indent(out, indent + 2);
out << op_ << std::endl;
expr_->to_str(out, indent + 2);
diff --git a/src/ast/unary_op_expression_test.cc b/src/ast/unary_op_expression_test.cc
index 4adc29d..271f8b9 100644
--- a/src/ast/unary_op_expression_test.cc
+++ b/src/ast/unary_op_expression_test.cc
@@ -71,9 +71,9 @@
UnaryOpExpression u(UnaryOp::kNot, std::move(ident));
std::ostringstream out;
u.to_str(out, 2);
- EXPECT_EQ(out.str(), R"( UnaryOp{
+ EXPECT_EQ(out.str(), R"( UnaryOp[not set]{
not
- Identifier{ident}
+ Identifier[not set]{ident}
}
)");
}