// Copyright 2020 The Tint Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SRC_AST_STATEMENT_H_ #define SRC_AST_STATEMENT_H_ #include #include #include "src/ast/node.h" namespace tint { namespace ast { class AssignmentStatement; class BlockStatement; class BreakStatement; class CallStatement; class CaseStatement; class ContinueStatement; class DiscardStatement; class ElseStatement; class FallthroughStatement; class IfStatement; class LoopStatement; class ReturnStatement; class SwitchStatement; class VariableDeclStatement; /// Base statement class class Statement : public Node { public: ~Statement() override; /// @returns true if this is an assign statement virtual bool IsAssign() const; /// @returns true if this is a block statement virtual bool IsBlock() const; /// @returns true if this is a break statement virtual bool IsBreak() const; /// @returns true if this is a call statement virtual bool IsCall() const; /// @returns true if this is a case statement virtual bool IsCase() const; /// @returns true if this is a continue statement virtual bool IsContinue() const; /// @returns true if this is a discard statement virtual bool IsDiscard() const; /// @returns true if this is an else statement virtual bool IsElse() const; /// @returns true if this is a fallthrough statement virtual bool IsFallthrough() const; /// @returns true if this is an if statement virtual bool IsIf() const; /// @returns true if this is a loop statement virtual bool IsLoop() const; /// @returns true if this is a return statement virtual bool IsReturn() const; /// @returns true if this is a switch statement virtual bool IsSwitch() const; /// @returns true if this is an variable statement virtual bool IsVariableDecl() const; /// @returns the statement as a const assign statement const AssignmentStatement* AsAssign() const; /// @returns the statement as a const block statement const BlockStatement* AsBlock() const; /// @returns the statement as a const break statement const BreakStatement* AsBreak() const; /// @returns the statement as a const call statement const CallStatement* AsCall() const; /// @returns the statement as a const case statement const CaseStatement* AsCase() const; /// @returns the statement as a const continue statement const ContinueStatement* AsContinue() const; /// @returns the statement as a const discard statement const DiscardStatement* AsDiscard() const; /// @returns the statement as a const else statement const ElseStatement* AsElse() const; /// @returns the statement as a const fallthrough statement const FallthroughStatement* AsFallthrough() const; /// @returns the statement as a const if statement const IfStatement* AsIf() const; /// @returns the statement as a const loop statement const LoopStatement* AsLoop() const; /// @returns the statement as a const return statement const ReturnStatement* AsReturn() const; /// @returns the statement as a const switch statement const SwitchStatement* AsSwitch() const; /// @returns the statement as a const variable statement const VariableDeclStatement* AsVariableDecl() const; /// @returns the statement as an assign statement AssignmentStatement* AsAssign(); /// @returns the statement as a block statement BlockStatement* AsBlock(); /// @returns the statement as a break statement BreakStatement* AsBreak(); /// @returns the statement as a call statement CallStatement* AsCall(); /// @returns the statement as a case statement CaseStatement* AsCase(); /// @returns the statement as a continue statement ContinueStatement* AsContinue(); /// @returns the statement as a discard statement DiscardStatement* AsDiscard(); /// @returns the statement as a else statement ElseStatement* AsElse(); /// @returns the statement as a fallthrough statement FallthroughStatement* AsFallthrough(); /// @returns the statement as a if statement IfStatement* AsIf(); /// @returns the statement as a loop statement LoopStatement* AsLoop(); /// @returns the statement as a return statement ReturnStatement* AsReturn(); /// @returns the statement as a switch statement SwitchStatement* AsSwitch(); /// @returns the statement as an variable statement VariableDeclStatement* AsVariableDecl(); protected: /// Constructor Statement(); /// Constructor /// @param source the source of the expression explicit Statement(const Source& source); /// Move constructor Statement(Statement&&); private: Statement(const Statement&) = delete; }; } // namespace ast } // namespace tint #endif // SRC_AST_STATEMENT_H_