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

#ifndef SkSLAnalysis_DEFINED
#define SkSLAnalysis_DEFINED

#include "include/private/SkSLSampleMatrix.h"
#include "src/sksl/SkSLDefines.h"

namespace SkSL {

struct Expression;
struct Program;
struct ProgramElement;
struct Statement;
struct Variable;

/**
 * Provides utilities for analyzing SkSL statically before it's composed into a full program.
 */
struct Analysis {
    static SampleMatrix GetSampleMatrix(const Program& program, const Variable& fp);

    static bool IsExplicitlySampled(const Program& program, const Variable& fp);

    static bool ReferencesSampleCoords(const Program& program);
};

/**
 * Utility class to visit every element, statement, and expression in an SkSL program IR.
 * This is intended for simple analysis and accumulation, where custom visitation behavior is only
 * needed for a limited set of expression kinds.
 *
 * Subclasses should override visitExpression/visitStatement/visitProgramElement as needed and
 * intercept elements of interest. They can then invoke the base class's function to visit all
 * sub expressions. They can also choose not to call the base function to arrest recursion, or
 * implement custom recursion.
 *
 * The visit functions return a bool that determines how the default implementation recurses. Once
 * any visit call returns true, the default behavior stops recursing and propagates true up the
 * stack.
 */

class ProgramVisitor {
public:
    virtual ~ProgramVisitor() { SkASSERT(!fProgram); }

    bool visit(const Program&);

protected:
    const Program& program() const {
        SkASSERT(fProgram);
        return *fProgram;
    }

    virtual bool visitExpression(const Expression&);
    virtual bool visitStatement(const Statement&);
    virtual bool visitProgramElement(const ProgramElement&);

private:
    const Program* fProgram;
};

}

#endif
