|  | /* | 
|  | * 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_ASTINTERFACEBLOCK | 
|  | #define SKSL_ASTINTERFACEBLOCK | 
|  |  | 
|  | #include "SkSLASTVarDeclaration.h" | 
|  | #include "../ir/SkSLModifiers.h" | 
|  |  | 
|  | namespace SkSL { | 
|  |  | 
|  | /** | 
|  | * An interface block, as in: | 
|  | * | 
|  | * out sk_PerVertex { | 
|  | *   layout(builtin=0) float4 sk_Position; | 
|  | *   layout(builtin=1) float sk_PointSize; | 
|  | * }; | 
|  | */ | 
|  | struct ASTInterfaceBlock : public ASTDeclaration { | 
|  | // valueName is empty when it was not present in the source | 
|  | ASTInterfaceBlock(int offset, | 
|  | Modifiers modifiers, | 
|  | StringFragment typeName, | 
|  | std::vector<std::unique_ptr<ASTVarDeclarations>> declarations, | 
|  | StringFragment instanceName, | 
|  | std::vector<std::unique_ptr<ASTExpression>> sizes) | 
|  | : INHERITED(offset, kInterfaceBlock_Kind) | 
|  | , fModifiers(modifiers) | 
|  | , fTypeName(typeName) | 
|  | , fDeclarations(std::move(declarations)) | 
|  | , fInstanceName(instanceName) | 
|  | , fSizes(std::move(sizes)) {} | 
|  |  | 
|  | String description() const override { | 
|  | String result = fModifiers.description() + fTypeName + " {\n"; | 
|  | for (size_t i = 0; i < fDeclarations.size(); i++) { | 
|  | result += fDeclarations[i]->description() + "\n"; | 
|  | } | 
|  | result += "}"; | 
|  | if (fInstanceName.fLength) { | 
|  | result += " " + fInstanceName; | 
|  | for (const auto& size : fSizes) { | 
|  | result += "["; | 
|  | if (size) { | 
|  | result += size->description(); | 
|  | } | 
|  | result += "]"; | 
|  | } | 
|  | } | 
|  | return result + ";"; | 
|  | } | 
|  |  | 
|  | const Modifiers fModifiers; | 
|  | const StringFragment fTypeName; | 
|  | const std::vector<std::unique_ptr<ASTVarDeclarations>> fDeclarations; | 
|  | const StringFragment fInstanceName; | 
|  | const std::vector<std::unique_ptr<ASTExpression>> fSizes; | 
|  |  | 
|  | typedef ASTDeclaration INHERITED; | 
|  | }; | 
|  |  | 
|  | } // namespace | 
|  |  | 
|  | #endif |