/*
 * Copyright 2019 Google LLC.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "src/sksl/SkSLSectionAndParameterHelper.h"
#include "src/sksl/ir/SkSLBinaryExpression.h"
#include "src/sksl/ir/SkSLConstructor.h"
#include "src/sksl/ir/SkSLDoStatement.h"
#include "src/sksl/ir/SkSLExpressionStatement.h"
#include "src/sksl/ir/SkSLFieldAccess.h"
#include "src/sksl/ir/SkSLForStatement.h"
#include "src/sksl/ir/SkSLFunctionCall.h"
#include "src/sksl/ir/SkSLIfStatement.h"
#include "src/sksl/ir/SkSLIndexExpression.h"
#include "src/sksl/ir/SkSLPostfixExpression.h"
#include "src/sksl/ir/SkSLPrefixExpression.h"
#include "src/sksl/ir/SkSLReturnStatement.h"
#include "src/sksl/ir/SkSLSwitchStatement.h"
#include "src/sksl/ir/SkSLSwizzle.h"
#include "src/sksl/ir/SkSLTernaryExpression.h"

namespace SkSL {

SectionAndParameterHelper::SectionAndParameterHelper(const Program* program, ErrorReporter& errors)
    : fProgram(*program) {
    for (const ProgramElement* p : fProgram.elements()) {
        switch (p->kind()) {
            case ProgramElement::Kind::kGlobalVar: {
                const VarDeclaration& decl =
                                  p->as<GlobalVarDeclaration>().declaration()->as<VarDeclaration>();
                if (IsParameter(decl.var())) {
                    fParameters.push_back(&decl.var());
                }
                break;
            }
            case ProgramElement::Kind::kSection: {
                const Section& s = p->as<Section>();
                skstd::string_view name = s.name();
                skstd::string_view arg = s.argument();
                if (IsSupportedSection(name)) {
                    if (SectionRequiresArgument(name) && !arg.size()) {
                        errors.error(s.fOffset,
                                     ("section '@" + name +
                                      "' requires one parameter").c_str());
                    }
                    if (!SectionAcceptsArgument(name) && arg.size()) {
                        errors.error(s.fOffset,
                                     ("section '@" + name + "' has no parameters").c_str());
                    }
                } else {
                    errors.error(s.fOffset,
                                 ("unsupported section '@" + name + "'").c_str());
                }
                if (fSections.find(name) != fSections.end()) {
                    errors.error(s.fOffset, ("duplicate section '@" + name + "'").c_str());
                }
                fSections[name].push_back(&s);
                break;
            }
            default:
                break;
        }
    }
}

}  // namespace SkSL
