/*
 * 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_INTERFACEBLOCK
#define SKSL_INTERFACEBLOCK

#include "SkSLProgramElement.h"
#include "SkSLVarDeclaration.h"

namespace SkSL {

/**
 * An interface block, as in:
 *
 * out gl_PerVertex {
 *   layout(builtin=0) vec4 gl_Position;
 *   layout(builtin=1) float gl_PointSize;
 * };
 *
 * At the IR level, this is represented by a single variable of struct type.
 */
struct InterfaceBlock : public ProgramElement {
    InterfaceBlock(Position position, const Variable& var, std::shared_ptr<SymbolTable> typeOwner)
    : INHERITED(position, kInterfaceBlock_Kind) 
    , fVariable(std::move(var))
    , fTypeOwner(typeOwner) {
        ASSERT(fVariable.fType.kind() == Type::kStruct_Kind);
    }

    std::string description() const override {
        std::string result = fVariable.fModifiers.description() + fVariable.fName + " {\n";
        for (size_t i = 0; i < fVariable.fType.fields().size(); i++) {
            result += fVariable.fType.fields()[i].description() + "\n";
        }
        result += "};";
        return result;
    }

    const Variable& fVariable;
    const std::shared_ptr<SymbolTable> fTypeOwner;

    typedef ProgramElement INHERITED;
};

} // namespace

#endif
