blob: 9312396bd0cc2e6336c5141612990d979cf24330 [file] [log] [blame]
/*
* Copyright 2016 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SKSL_BLOCK
#define SKSL_BLOCK
#include "src/sksl/ir/SkSLStatement.h"
#include "src/sksl/ir/SkSLSymbolTable.h"
namespace SkSL {
/**
* A block of multiple statements functioning as a single statement.
*/
class Block : public Statement {
public:
static constexpr Kind kStatementKind = Kind::kBlock;
Block(int offset, StatementArray statements,
const std::shared_ptr<SymbolTable> symbols = nullptr, bool isScope = true)
: INHERITED(offset, kStatementKind, BlockData{std::move(symbols), isScope},
std::move(statements)) {}
const StatementArray& children() const {
return fStatementChildren;
}
StatementArray& children() {
return fStatementChildren;
}
bool isScope() const {
return this->blockData().fIsScope;
}
void setIsScope(bool isScope) {
this->blockData().fIsScope = isScope;
}
std::shared_ptr<SymbolTable> symbolTable() const {
return this->blockData().fSymbolTable;
}
bool isEmpty() const override {
for (const std::unique_ptr<Statement>& stmt : this->children()) {
if (!stmt->isEmpty()) {
return false;
}
}
return true;
}
std::unique_ptr<Statement> clone() const override {
StatementArray cloned;
cloned.reserve_back(this->children().size());
for (const std::unique_ptr<Statement>& stmt : this->children()) {
cloned.push_back(stmt->clone());
}
const BlockData& data = this->blockData();
return std::make_unique<Block>(fOffset, std::move(cloned), data.fSymbolTable,
data.fIsScope);
}
String description() const override {
String result("{");
for (const std::unique_ptr<Statement>& stmt : this->children()) {
result += "\n";
result += stmt->description();
}
result += "\n}\n";
return result;
}
private:
using INHERITED = Statement;
};
} // namespace SkSL
#endif