Implement textureSample builtins

Handle wsgl parsing and spirv writing of:
  textureSample(), textureSampleBias(), textureSampleLevel(),
  textureSampleGrad(), textureSampleCompare()

Handle the different signature for array texture types.
Includes offset overloads.

Change-Id: I6802d97cd9a7083f12439b32725b9a4b666b8c63
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/32985
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: David Neto <dneto@google.com>
Reviewed-by: Ryan Harrison <rharrison@chromium.org>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/ast/identifier_expression.h b/src/ast/identifier_expression.h
index af08b69..4c6ac31 100644
--- a/src/ast/identifier_expression.h
+++ b/src/ast/identifier_expression.h
@@ -15,7 +15,9 @@
 #ifndef SRC_AST_IDENTIFIER_EXPRESSION_H_
 #define SRC_AST_IDENTIFIER_EXPRESSION_H_
 
+#include <memory>
 #include <string>
+#include <utility>
 
 #include "src/ast/expression.h"
 #include "src/ast/intrinsic.h"
@@ -45,6 +47,17 @@
   void set_intrinsic(Intrinsic i) { intrinsic_ = i; }
   /// @returns the intrinsic this identifier represents
   Intrinsic intrinsic() const { return intrinsic_; }
+
+  /// Sets the intrinsic signature
+  /// @param s the intrinsic signature to set
+  void set_intrinsic_signature(std::unique_ptr<intrinsic::Signature> s) {
+    intrinsic_sig_ = std::move(s);
+  }
+  /// @returns the intrinsic signature for this identifier.
+  const intrinsic::Signature* intrinsic_signature() const {
+    return intrinsic_sig_.get();
+  }
+
   /// @returns true if this identifier is for an intrinsic
   bool IsIntrinsic() const { return intrinsic_ != Intrinsic::kNone; }
 
@@ -63,6 +76,7 @@
   IdentifierExpression(const IdentifierExpression&) = delete;
 
   Intrinsic intrinsic_ = Intrinsic::kNone;
+  std::unique_ptr<intrinsic::Signature> intrinsic_sig_;
   std::string name_;
 };