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