2020-03-02 20:47:43 +00:00
|
|
|
// 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_
|
|
|
|
|
2020-04-06 19:37:37 +00:00
|
|
|
#include <memory>
|
|
|
|
#include <vector>
|
|
|
|
|
2020-03-02 20:47:43 +00:00
|
|
|
#include "src/ast/node.h"
|
|
|
|
|
|
|
|
namespace tint {
|
|
|
|
namespace ast {
|
|
|
|
|
|
|
|
class AssignmentStatement;
|
|
|
|
class BreakStatement;
|
|
|
|
class CaseStatement;
|
|
|
|
class ContinueStatement;
|
|
|
|
class ElseStatement;
|
|
|
|
class FallthroughStatement;
|
|
|
|
class IfStatement;
|
|
|
|
class KillStatement;
|
|
|
|
class LoopStatement;
|
|
|
|
class NopStatement;
|
|
|
|
class RegardlessStatement;
|
|
|
|
class ReturnStatement;
|
|
|
|
class SwitchStatement;
|
|
|
|
class UnlessStatement;
|
2020-03-30 22:46:48 +00:00
|
|
|
class VariableDeclStatement;
|
2020-03-02 20:47:43 +00:00
|
|
|
|
|
|
|
/// Base statement class
|
|
|
|
class Statement : public Node {
|
|
|
|
public:
|
|
|
|
~Statement() override;
|
|
|
|
|
|
|
|
/// @returns true if this is an assign statement
|
|
|
|
virtual bool IsAssign() const { return false; }
|
|
|
|
/// @returns true if this is a break statement
|
|
|
|
virtual bool IsBreak() const { return false; }
|
|
|
|
/// @returns true if this is a case statement
|
|
|
|
virtual bool IsCase() const { return false; }
|
|
|
|
/// @returns true if this is a continue statement
|
|
|
|
virtual bool IsContinue() const { return false; }
|
|
|
|
/// @returns true if this is an else statement
|
|
|
|
virtual bool IsElse() const { return false; }
|
|
|
|
/// @returns true if this is a fallthrough statement
|
|
|
|
virtual bool IsFallthrough() const { return false; }
|
|
|
|
/// @returns true if this is an if statement
|
|
|
|
virtual bool IsIf() const { return false; }
|
|
|
|
/// @returns true if this is a kill statement
|
|
|
|
virtual bool IsKill() const { return false; }
|
|
|
|
/// @returns true if this is a loop statement
|
|
|
|
virtual bool IsLoop() const { return false; }
|
|
|
|
/// @returns true if this is a nop statement
|
|
|
|
virtual bool IsNop() const { return false; }
|
|
|
|
/// @returns true if this is an regardless statement
|
|
|
|
virtual bool IsRegardless() const { return false; }
|
|
|
|
/// @returns true if this is a return statement
|
|
|
|
virtual bool IsReturn() const { return false; }
|
|
|
|
/// @returns true if this is a switch statement
|
|
|
|
virtual bool IsSwitch() const { return false; }
|
|
|
|
/// @returns true if this is an unless statement
|
|
|
|
virtual bool IsUnless() const { return false; }
|
|
|
|
/// @returns true if this is an variable statement
|
2020-03-30 22:46:48 +00:00
|
|
|
virtual bool IsVariableDecl() const { return false; }
|
2020-03-02 20:47:43 +00:00
|
|
|
|
|
|
|
/// @returns the statement as an assign statement
|
|
|
|
AssignmentStatement* AsAssign();
|
|
|
|
/// @returns the statement as a break statement
|
|
|
|
BreakStatement* AsBreak();
|
|
|
|
/// @returns the statement as a case statement
|
|
|
|
CaseStatement* AsCase();
|
|
|
|
/// @returns the statement as a continue statement
|
|
|
|
ContinueStatement* AsContinue();
|
|
|
|
/// @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 kill statement
|
|
|
|
KillStatement* AsKill();
|
|
|
|
/// @returns the statement as a loop statement
|
|
|
|
LoopStatement* AsLoop();
|
|
|
|
/// @returns the statement as a nop statement
|
|
|
|
NopStatement* AsNop();
|
|
|
|
/// @returns the statement as an regardless statement
|
|
|
|
RegardlessStatement* AsRegardless();
|
|
|
|
/// @returns the statement as a return statement
|
|
|
|
ReturnStatement* AsReturn();
|
|
|
|
/// @returns the statement as a switch statement
|
|
|
|
SwitchStatement* AsSwitch();
|
|
|
|
/// @returns the statement as an unless statement
|
|
|
|
UnlessStatement* AsUnless();
|
|
|
|
/// @returns the statement as an variable statement
|
2020-03-30 22:46:48 +00:00
|
|
|
VariableDeclStatement* AsVariableDecl();
|
2020-03-02 20:47:43 +00:00
|
|
|
|
|
|
|
protected:
|
|
|
|
/// Constructor
|
|
|
|
Statement();
|
|
|
|
/// Constructor
|
|
|
|
/// @param source the source of the expression
|
|
|
|
explicit Statement(const Source& source);
|
|
|
|
/// Move constructor
|
|
|
|
Statement(Statement&&) = default;
|
|
|
|
|
|
|
|
private:
|
|
|
|
Statement(const Statement&) = delete;
|
|
|
|
};
|
|
|
|
|
2020-04-06 19:37:37 +00:00
|
|
|
/// A list of unique statements
|
|
|
|
using StatementList = std::vector<std::unique_ptr<Statement>>;
|
|
|
|
|
2020-03-02 20:47:43 +00:00
|
|
|
} // namespace ast
|
|
|
|
} // namespace tint
|
|
|
|
|
|
|
|
#endif // SRC_AST_STATEMENT_H_
|