/*
 * 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_FORSTATEMENT
#define SKSL_FORSTATEMENT

#include "src/sksl/ir/SkSLExpression.h"
#include "src/sksl/ir/SkSLStatement.h"
#include "src/sksl/ir/SkSLSymbolTable.h"

namespace SkSL {

/**
 * A 'for' statement.
 */
struct ForStatement : public Statement {
    ForStatement(int offset, std::unique_ptr<Statement> initializer,
                 std::unique_ptr<Expression> test, std::unique_ptr<Expression> next,
                 std::unique_ptr<Statement> statement, std::shared_ptr<SymbolTable> symbols)
    : INHERITED(offset, kFor_Kind)
    , fSymbols(symbols)
    , fInitializer(std::move(initializer))
    , fTest(std::move(test))
    , fNext(std::move(next))
    , fStatement(std::move(statement)) {}

    int nodeCount() const override {
        int result = 1;
        if (fInitializer) {
            result += fInitializer->nodeCount();
        }
        if (fTest) {
            result += fTest->nodeCount();
        }
        if (fNext) {
            result += fNext->nodeCount();
        }
        result += fStatement->nodeCount();
        return result;
    }

    std::unique_ptr<Statement> clone() const override {
        return std::unique_ptr<Statement>(new ForStatement(fOffset,
                                                     fInitializer ? fInitializer->clone() : nullptr,
                                                     fTest ? fTest->clone() : nullptr,
                                                     fNext ? fNext->clone() : nullptr,
                                                     fStatement->clone(),
                                                     fSymbols));
    }

    String description() const override {
        String result("for (");
        if (fInitializer) {
            result += fInitializer->description();
        } else {
            result += ";";
        }
        result += " ";
        if (fTest) {
            result += fTest->description();
        }
        result += "; ";
        if (fNext) {
            result += fNext->description();
        }
        result += ") " + fStatement->description();
        return result;
    }

    // it's important to keep fSymbols defined first (and thus destroyed last) because destroying
    // the other fields can update symbol reference counts
    const std::shared_ptr<SymbolTable> fSymbols;
    std::unique_ptr<Statement> fInitializer;
    std::unique_ptr<Expression> fTest;
    std::unique_ptr<Expression> fNext;
    std::unique_ptr<Statement> fStatement;

    typedef Statement INHERITED;
};

} // namespace

#endif
