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 { ForStatementForStatement21 ForStatement(int offset, 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(offset, 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 cloneForStatement31 std::unique_ptr<Statement> clone() const override { 32 return std::unique_ptr<Statement>(new ForStatement(fOffset, fInitializer->clone(), 33 fTest->clone(), fNext->clone(), 34 fStatement->clone(), fSymbols)); 35 } 36 descriptionForStatement37 String description() const override { 38 String result("for ("); 39 if (fInitializer) { 40 result += fInitializer->description(); 41 } 42 result += " "; 43 if (fTest) { 44 result += fTest->description(); 45 } 46 result += "; "; 47 if (fNext) { 48 result += fNext->description(); 49 } 50 result += ") " + fStatement->description(); 51 return result; 52 } 53 54 // it's important to keep fSymbols defined first (and thus destroyed last) because destroying 55 // the other fields can update symbol reference counts 56 const std::shared_ptr<SymbolTable> fSymbols; 57 std::unique_ptr<Statement> fInitializer; 58 std::unique_ptr<Expression> fTest; 59 std::unique_ptr<Expression> fNext; 60 std::unique_ptr<Statement> fStatement; 61 62 typedef Statement INHERITED; 63 }; 64 65 } // namespace 66 67 #endif 68