/*
 * 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_ASTFUNCTION
#define SKSL_ASTFUNCTION

#include "SkSLASTBlock.h"
#include "SkSLASTDeclaration.h"
#include "SkSLASTParameter.h"
#include "SkSLASTType.h"

namespace SkSL {

/**
 * A function declaration or definition. The fBody field will be null for declarations.
 */
struct ASTFunction : public ASTDeclaration {
    ASTFunction(int offset, Modifiers modifiers,  std::unique_ptr<ASTType> returnType,
                StringFragment name, std::vector<std::unique_ptr<ASTParameter>> parameters,
                std::unique_ptr<ASTBlock> body)
    : INHERITED(offset, kFunction_Kind)
    , fModifiers(modifiers)
    , fReturnType(std::move(returnType))
    , fName(name)
    , fParameters(std::move(parameters))
    , fBody(std::move(body)) {}

    String description() const override {
        String result = fReturnType->description() + " " + fName + "(";
        for (size_t i = 0; i < fParameters.size(); i++) {
            if (i > 0) {
                result += ", ";
            }
            result += fParameters[i]->description();
        }
        if (fBody) {
            result += ") " + fBody->description();
        } else {
            result += ");";
        }
        return result;
    }

    const Modifiers fModifiers;
    const std::unique_ptr<ASTType> fReturnType;
    const StringFragment fName;
    const std::vector<std::unique_ptr<ASTParameter>> fParameters;
    const std::unique_ptr<ASTBlock> fBody;

    typedef ASTDeclaration INHERITED;
};

} // namespace

#endif
