/* * 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_ASTVARDECLARATIONS #define SKSL_ASTVARDECLARATIONS #include "SkSLASTDeclaration.h" #include "SkSLASTStatement.h" #include "SkSLASTType.h" #include "../SkSLUtil.h" #include "../ir/SkSLModifiers.h" namespace SkSL { /** * A single variable declaration within a var declaration statement. For instance, the statement * 'int x = 2, y[3];' is an ASTVarDeclarations statement containing two individual ASTVarDeclaration * instances. */ struct ASTVarDeclaration { ASTVarDeclaration(StringFragment name, std::vector<std::unique_ptr<ASTExpression>> sizes, std::unique_ptr<ASTExpression> value) : fName(name) , fSizes(std::move(sizes)) , fValue(std::move(value)) {} String description() const { String result(fName); for (const auto& size : fSizes) { if (size) { result += "[" + size->description() + "]"; } else { result += "[]"; } } if (fValue) { result += " = " + fValue->description(); } return result; } StringFragment fName; // array sizes, if any. e.g. 'foo[3][]' has sizes [3, null] std::vector<std::unique_ptr<ASTExpression>> fSizes; // initial value, may be null std::unique_ptr<ASTExpression> fValue; }; /** * A variable declaration statement, which may consist of one or more individual variables. */ struct ASTVarDeclarations : public ASTDeclaration { ASTVarDeclarations(Modifiers modifiers, std::unique_ptr<ASTType> type, std::vector<ASTVarDeclaration> vars) : INHERITED(type->fOffset, kVar_Kind) , fModifiers(modifiers) , fType(std::move(type)) , fVars(std::move(vars)) {} String description() const override { String result = fModifiers.description() + fType->description() + " "; String separator; for (const auto& var : fVars) { result += separator; separator = ", "; result += var.description(); } return result; } const Modifiers fModifiers; const std::unique_ptr<ASTType> fType; const std::vector<ASTVarDeclaration> fVars; typedef ASTDeclaration INHERITED; }; } // namespace #endif