diff options
author | Ethan Nicholas <ethannicholas@google.com> | 2017-02-27 13:26:45 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-02-27 19:01:55 +0000 |
commit | af19769831f1c4c3b90c85aa9f8851cd8bbf86d5 (patch) | |
tree | 5dd063830d41aff45eefcb524c868ac210016467 /src/sksl/ast | |
parent | 578f064a60b63ddfb00831e9e59a47060bfcefe0 (diff) |
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>
Diffstat (limited to 'src/sksl/ast')
-rw-r--r-- | src/sksl/ast/SkSLASTStatement.h | 1 | ||||
-rw-r--r-- | src/sksl/ast/SkSLASTSwitchCase.h | 48 | ||||
-rw-r--r-- | src/sksl/ast/SkSLASTSwitchStatement.h | 43 |
3 files changed, 92 insertions, 0 deletions
diff --git a/src/sksl/ast/SkSLASTStatement.h b/src/sksl/ast/SkSLASTStatement.h index 9ddde063ea..6ce320e343 100644 --- a/src/sksl/ast/SkSLASTStatement.h +++ b/src/sksl/ast/SkSLASTStatement.h @@ -26,6 +26,7 @@ struct ASTStatement : public ASTPositionNode { kFor_Kind, kWhile_Kind, kDo_Kind, + kSwitch_Kind, kReturn_Kind, kBreak_Kind, kContinue_Kind, diff --git a/src/sksl/ast/SkSLASTSwitchCase.h b/src/sksl/ast/SkSLASTSwitchCase.h new file mode 100644 index 0000000000..2c0a01c7fa --- /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 diff --git a/src/sksl/ast/SkSLASTSwitchStatement.h b/src/sksl/ast/SkSLASTSwitchStatement.h new file mode 100644 index 0000000000..3031a7d2b1 --- /dev/null +++ b/src/sksl/ast/SkSLASTSwitchStatement.h @@ -0,0 +1,43 @@ +/* + * 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_ASTSWITCHSTATEMENT +#define SKSL_ASTSWITCHSTATEMENT + +#include "SkSLASTStatement.h" +#include "SkSLASTSwitchCase.h" + +namespace SkSL { + +/** + * A 'switch' statement. + */ +struct ASTSwitchStatement : public ASTStatement { + ASTSwitchStatement(Position position, std::unique_ptr<ASTExpression> value, + std::vector<std::unique_ptr<ASTSwitchCase>> cases) + : INHERITED(position, kSwitch_Kind) + , fValue(std::move(value)) + , fCases(std::move(cases)) {} + + SkString description() const override { + SkString result = SkStringPrintf("switch (%s) {\n", + fValue->description().c_str()); + for (const auto& c : fCases) { + result += c->description(); + } + result += "}"; + return result; + } + + const std::unique_ptr<ASTExpression> fValue; + const std::vector<std::unique_ptr<ASTSwitchCase>> fCases; + + typedef ASTStatement INHERITED; +}; + +} // namespace + +#endif |