Re-land of skslc switch support

This reverts commit 7d975fc200bbbea991ec4c04c08f3a5ea7b847af.

BUG=skia:

Change-Id: I57521f7a291a35cfed58d623ea4f8da29582d2c5
Reviewed-on: https://skia-review.googlesource.com/8993
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
diff --git a/src/sksl/ast/SkSLASTSwitchCase.h b/src/sksl/ast/SkSLASTSwitchCase.h
new file mode 100644
index 0000000..2c0a01c
--- /dev/null
+++ b/src/sksl/ast/SkSLASTSwitchCase.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef SKSL_ASTSWITCHCASE
+#define SKSL_ASTSWITCHCASE
+
+#include "SkSLASTStatement.h"
+
+namespace SkSL {
+
+/**
+ * A single case of a 'switch' statement.
+ */
+struct ASTSwitchCase : public ASTStatement {
+    // a null value means "default:"
+    ASTSwitchCase(Position position, std::unique_ptr<ASTExpression> value,
+                  std::vector<std::unique_ptr<ASTStatement>> statements)
+    : INHERITED(position, kSwitch_Kind)
+    , fValue(std::move(value))
+    , fStatements(std::move(statements)) {}
+
+    SkString description() const override {
+        SkString result;
+        if (fValue) {
+            result.appendf("case %s:\n", fValue->description().c_str());
+        } else {
+            result += "default:\n";
+        }
+        for (const auto& s : fStatements) {
+            result += s->description() + "\n";
+        }
+        return result;
+    }
+
+    // null value implies "default" case
+    const std::unique_ptr<ASTExpression> fValue;
+    const std::vector<std::unique_ptr<ASTStatement>> fStatements;
+
+    typedef ASTStatement INHERITED;
+};
+
+} // namespace
+
+#endif