1b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas/*
2b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * Copyright 2016 Google Inc.
3b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas *
4b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * Use of this source code is governed by a BSD-style license that can be
5b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * found in the LICENSE file.
6b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas */
70df1b04db87c3d86ee0b0bd6aa2cb5b6be32cac2Ethan Nicholas
8b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#ifndef SKSL_FORSTATEMENT
9b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#define SKSL_FORSTATEMENT
10b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas
11b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#include "SkSLExpression.h"
12b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#include "SkSLStatement.h"
13d598f7981f34811e6f2a949207dc13638852f3f7ethannicholas#include "SkSLSymbolTable.h"
14b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas
15b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasnamespace SkSL {
16b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas
17b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas/**
18b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * A 'for' statement.
19b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas */
20b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ForStatement : public Statement {
210df1b04db87c3d86ee0b0bd6aa2cb5b6be32cac2Ethan Nicholas    ForStatement(Position position, std::unique_ptr<Statement> initializer,
220df1b04db87c3d86ee0b0bd6aa2cb5b6be32cac2Ethan Nicholas                 std::unique_ptr<Expression> test, std::unique_ptr<Expression> next,
23d598f7981f34811e6f2a949207dc13638852f3f7ethannicholas                 std::unique_ptr<Statement> statement, std::shared_ptr<SymbolTable> symbols)
24b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas    : INHERITED(position, kFor_Kind)
2586a43405fb3f83f6d45581959df5f7321487ae7eEthan Nicholas    , fSymbols(symbols)
26b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas    , fInitializer(std::move(initializer))
27b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas    , fTest(std::move(test))
28b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas    , fNext(std::move(next))
2986a43405fb3f83f6d45581959df5f7321487ae7eEthan Nicholas    , fStatement(std::move(statement)) {}
30b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas
310df1b04db87c3d86ee0b0bd6aa2cb5b6be32cac2Ethan Nicholas    String description() const override {
320df1b04db87c3d86ee0b0bd6aa2cb5b6be32cac2Ethan Nicholas        String result("for (");
33b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas        if (fInitializer) {
34b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas            result += fInitializer->description();
350df1b04db87c3d86ee0b0bd6aa2cb5b6be32cac2Ethan Nicholas        }
36b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas        result += " ";
37b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas        if (fTest) {
38b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas            result += fTest->description();
390df1b04db87c3d86ee0b0bd6aa2cb5b6be32cac2Ethan Nicholas        }
40b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas        result += "; ";
41b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas        if (fNext) {
42b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas            result += fNext->description();
43b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas        }
44b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas        result += ") " + fStatement->description();
45b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas        return result;
46b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas    }
47b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas
4886a43405fb3f83f6d45581959df5f7321487ae7eEthan Nicholas    // it's important to keep fSymbols defined first (and thus destroyed last) because destroying
4986a43405fb3f83f6d45581959df5f7321487ae7eEthan Nicholas    // the other fields can update symbol reference counts
5086a43405fb3f83f6d45581959df5f7321487ae7eEthan Nicholas    const std::shared_ptr<SymbolTable> fSymbols;
51cb67096b61f699b047fe8635984db1ac708a7b99Ethan Nicholas    std::unique_ptr<Statement> fInitializer;
5286a43405fb3f83f6d45581959df5f7321487ae7eEthan Nicholas    std::unique_ptr<Expression> fTest;
5386a43405fb3f83f6d45581959df5f7321487ae7eEthan Nicholas    std::unique_ptr<Expression> fNext;
54cb67096b61f699b047fe8635984db1ac708a7b99Ethan Nicholas    std::unique_ptr<Statement> fStatement;
55b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas
56b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas    typedef Statement INHERITED;
57b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas};
58b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas
59b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas} // namespace
60b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas
61b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#endif
62