[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}
   }
 )");
 }