[ir] Stub remaining AST walk structure.

This CL adds commented out blocks for the various switches required to
walk the AST.

Bug: tint:1718
Change-Id: I70e7c4d0168621bf97006a782f2942df1173c393
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/110780
Reviewed-by: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
diff --git a/src/tint/ir/builder_impl.cc b/src/tint/ir/builder_impl.cc
index 423559d..f332052 100644
--- a/src/tint/ir/builder_impl.cc
+++ b/src/tint/ir/builder_impl.cc
@@ -22,11 +22,13 @@
 #include "src/tint/ast/for_loop_statement.h"
 #include "src/tint/ast/function.h"
 #include "src/tint/ast/if_statement.h"
+#include "src/tint/ast/literal_expression.h"
 #include "src/tint/ast/loop_statement.h"
 #include "src/tint/ast/return_statement.h"
 #include "src/tint/ast/statement.h"
 #include "src/tint/ast/static_assert.h"
 #include "src/tint/ast/switch_statement.h"
+#include "src/tint/ast/variable_decl_statement.h"
 #include "src/tint/ast/while_statement.h"
 #include "src/tint/ir/function.h"
 #include "src/tint/ir/if.h"
@@ -115,23 +117,14 @@
     for (auto* decl : sem->DependencyOrderedDeclarations()) {
         bool ok = tint::Switch(
             decl,  //
-            // [&](const ast::Struct* str) {
-            //   return false;
-            // },
+            // [&](const ast::Struct* str) { },
             [&](const ast::Alias*) {
                 // Folded away and doesn't appear in the IR.
                 return true;
             },
-            // [&](const ast::Const*) {
-            //   return false;
-            // },
-            // [&](const ast::Override*) {
-            //   return false;
-            // },
+            // [&](const ast::Variable* var) { },
             [&](const ast::Function* func) { return EmitFunction(func); },
-            // [&](const ast::Enable*) {
-            //   return false;
-            // },
+            // [&](const ast::Enable*) { },
             [&](const ast::StaticAssert*) {
                 // Evaluated by the resolver, drop from the IR.
                 return true;
@@ -202,20 +195,21 @@
 bool BuilderImpl::EmitStatement(const ast::Statement* stmt) {
     return tint::Switch(
         stmt,
-        //        [&](const ast::AssignmentStatement* a) { },
+        // [&](const ast::AssignmentStatement* a) { },
         [&](const ast::BlockStatement* b) { return EmitBlock(b); },
         [&](const ast::BreakStatement* b) { return EmitBreak(b); },
         [&](const ast::BreakIfStatement* b) { return EmitBreakIf(b); },
-        //        [&](const ast::CallStatement* c) { },
+        // [&](const ast::CallStatement* c) { },
+        // [&](const ast::CompoundAssignmentStatement* c) { },
         [&](const ast::ContinueStatement* c) { return EmitContinue(c); },
-        //        [&](const ast::DiscardStatement* d) { },
+        // [&](const ast::DiscardStatement* d) { },
         [&](const ast::IfStatement* i) { return EmitIf(i); },
         [&](const ast::LoopStatement* l) { return EmitLoop(l); },
         [&](const ast::ForLoopStatement* l) { return EmitForLoop(l); },
         [&](const ast::WhileStatement* l) { return EmitWhile(l); },
         [&](const ast::ReturnStatement* r) { return EmitReturn(r); },
         [&](const ast::SwitchStatement* s) { return EmitSwitch(s); },
-        //        [&](const ast::VariableDeclStatement* v) { },
+        [&](const ast::VariableDeclStatement* v) { return EmitVariable(v->variable); },
         [&](const ast::StaticAssert*) {
             return true;  // Not emitted
         },
@@ -499,4 +493,125 @@
     return true;
 }
 
+bool BuilderImpl::EmitExpression(const ast::Expression* expr) {
+    return tint::Switch(
+        expr,
+        // [&](const ast::IndexAccessorExpression* a) { return EmitIndexAccessor(a); },
+        // [&](const ast::BinaryExpression* b) { return EmitBinary(b); },
+        // [&](const ast::BitcastExpression* b) { return EmitBitcast(b); },
+        // [&](const ast::CallExpression* c) { return EmitCall(c); },
+        // [&](const ast::IdentifierExpression* i) { return EmitIdentifier(i); },
+        [&](const ast::LiteralExpression* l) { return EmitLiteral(l); },
+        // [&](const ast::MemberAccessorExpression* m) { return EmitMemberAccessor(m); },
+        // [&](const ast::PhonyExpression*) { return true; },
+        // [&](const ast::UnaryOpExpression* u) { return EmitUnaryOp(u); },
+        [&](Default) {
+            diagnostics_.add_warning(
+                tint::diag::System::IR,
+                "unknown expression type: " + std::string(expr->TypeInfo().name), expr->source);
+            return false;
+        });
+}
+
+bool BuilderImpl::EmitVariable(const ast::Variable* var) {
+    return tint::Switch(  //
+        var,
+        // [&](const ast::Var* var) {},
+        // [&](const ast::Let*) {},
+        // [&](const ast::Override*) { },
+        // [&](const ast::Const* c) { },
+        [&](Default) {
+            diagnostics_.add_warning(tint::diag::System::IR,
+                                     "unknown variable: " + std::string(var->TypeInfo().name),
+                                     var->source);
+            return false;
+        });
+}
+
+bool BuilderImpl::EmitLiteral(const ast::LiteralExpression* lit) {
+    return tint::Switch(  //
+        lit,
+        // [&](const ast::BoolLiteralExpression* l) { },
+        // [&](const ast::FloatLiteralExpression* l) { },
+        // [&](const ast::IntLiteralExpression* l) { },
+        [&](Default) {
+            diagnostics_.add_warning(tint::diag::System::IR,
+                                     "unknown literal type: " + std::string(lit->TypeInfo().name),
+                                     lit->source);
+            return false;
+        });
+}
+
+bool BuilderImpl::EmitType(const ast::Type* ty) {
+    return tint::Switch(
+        ty,
+        // [&](const ast::Array* ary) { },
+        // [&](const ast::Bool* b) { },
+        // [&](const ast::F32* f) { },
+        // [&](const ast::F16* f) { },
+        // [&](const ast::I32* i) { },
+        // [&](const ast::U32* u) { },
+        // [&](const ast::Vector* v) { },
+        // [&](const ast::Matrix* mat) { },
+        // [&](const ast::Pointer* ptr) { },'
+        // [&](const ast::Atomic* a) { },
+        // [&](const ast::Sampler* s) { },
+        // [&](const ast::ExternalTexture* t) { },
+        // [&](const ast::Texture* t) {
+        //      return tint::Switch(
+        //          t,
+        //          [&](const ast::DepthTexture*) { },
+        //          [&](const ast::DepthMultisampledTexture*) { },
+        //          [&](const ast::SampledTexture*) { },
+        //          [&](const ast::MultisampledTexture*) { },
+        //          [&](const ast::StorageTexture*) {  },
+        //          [&](Default) {
+        //              diagnostics_.add_warning(tint::diag::System::IR,
+        //                  "unknown texture: " + std::string(t->TypeInfo().name), t->source);
+        //              return false;
+        //          });
+        // },
+        // [&](const ast::Void* v) { },
+        // [&](const ast::TypeName* tn) { },
+        [&](Default) {
+            diagnostics_.add_warning(tint::diag::System::IR,
+                                     "unknown type: " + std::string(ty->TypeInfo().name),
+                                     ty->source);
+            return false;
+        });
+}
+
+bool BuilderImpl::EmitAttributes(utils::VectorRef<const ast::Attribute*> attrs) {
+    for (auto* attr : attrs) {
+        if (!EmitAttribute(attr)) {
+            return false;
+        }
+    }
+    return true;
+}
+
+bool BuilderImpl::EmitAttribute(const ast::Attribute* attr) {
+    return tint::Switch(  //
+        attr,
+        // [&](const ast::WorkgroupAttribute* wg) {},
+        // [&](const ast::StageAttribute* s) {},
+        // [&](const ast::BindingAttribute* b) {},
+        // [&](const ast::GroupAttribute* g) {},
+        // [&](const ast::LocationAttribute* l) {},
+        // [&](const ast::BuiltinAttribute* b) {},
+        // [&](const ast::InterpolateAttribute* i) {},
+        // [&](const ast::InvariantAttribute* i) {},
+        // [&](const ast::IdAttribute* i) {},
+        // [&](const ast::StructMemberSizeAttribute* s) {},
+        // [&](const ast::StructMemberAlignAttribute* a) {},
+        // [&](const ast::StrideAttribute* s) {}
+        // [&](const ast::InternalAttribute *i) {},
+        [&](Default) {
+            diagnostics_.add_warning(tint::diag::System::IR,
+                                     "unknown attribute: " + std::string(attr->TypeInfo().name),
+                                     attr->source);
+            return false;
+        });
+}
+
 }  // namespace tint::ir
diff --git a/src/tint/ir/builder_impl.h b/src/tint/ir/builder_impl.h
index 8f24dc6..186de64 100644
--- a/src/tint/ir/builder_impl.h
+++ b/src/tint/ir/builder_impl.h
@@ -38,6 +38,7 @@
 class Function;
 class IfStatement;
 class LoopStatement;
+class LiteralExpression;
 class ReturnStatement;
 class Statement;
 class WhileStatement;
@@ -134,6 +135,36 @@
     /// @returns true if successful, false otherwise.
     bool EmitBreakIf(const ast::BreakIfStatement* stmt);
 
+    /// Emits an expression
+    /// @param expr the expression to emit
+    /// @returns true if successful, false otherwise
+    bool EmitExpression(const ast::Expression* expr);
+
+    /// Emits a variable
+    /// @param var the variable to emit
+    /// @returns true if successful, false otherwise
+    bool EmitVariable(const ast::Variable* var);
+
+    /// Emits a literal expression
+    /// @param lit the literal to emit
+    /// @returns true if successful, false otherwise
+    bool EmitLiteral(const ast::LiteralExpression* lit);
+
+    /// Emits a type
+    /// @param ty the type to emit
+    /// @returns true if successful, false otherwise
+    bool EmitType(const ast::Type* ty);
+
+    /// Emits a set of attributes
+    /// @param attrs the attributes to emit
+    /// @returns true if successful, false otherwise
+    bool EmitAttributes(utils::VectorRef<const ast::Attribute*> attrs);
+
+    /// Emits an attribute
+    /// @param attr the attribute to emit
+    /// @returns true if successful, false otherwise
+    bool EmitAttribute(const ast::Attribute* attr);
+
     /// Retrieve the IR Flow node for a given AST node.
     /// @param n the node to lookup
     /// @returns the FlowNode for the given ast::Node or nullptr if it doesn't exist.