1/*
2 * Copyright 2021 Google LLC
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SkSLProgramWriter_DEFINED
9#define SkSLProgramWriter_DEFINED
10
11#include "src/sksl/analysis/SkSLProgramVisitor.h"
12
13namespace SkSL {
14
15struct ProgramWriterTypes {
16    using Program = SkSL::Program;
17    using Expression = SkSL::Expression;
18    using Statement = SkSL::Statement;
19    using ProgramElement = SkSL::ProgramElement;
20    using UniquePtrExpression = std::unique_ptr<SkSL::Expression>;
21    using UniquePtrStatement = std::unique_ptr<SkSL::Statement>;
22};
23
24// Squelch bogus Clang warning about template vtables: https://bugs.llvm.org/show_bug.cgi?id=18733
25#if defined(__clang__)
26#pragma clang diagnostic push
27#pragma clang diagnostic ignored "-Wweak-template-vtables"
28#endif
29extern template class TProgramVisitor<ProgramWriterTypes>;
30#if defined(__clang__)
31#pragma clang diagnostic pop
32#endif
33
34class ProgramWriter : public TProgramVisitor<ProgramWriterTypes> {
35public:
36    // Subclass these methods if you want access to the unique_ptrs of IRNodes in a program.
37    // This will allow statements or expressions to be replaced during a visit.
38    bool visitExpressionPtr(std::unique_ptr<Expression>& e) override {
39        return this->visitExpression(*e);
40    }
41    bool visitStatementPtr(std::unique_ptr<Statement>& s) override {
42        return this->visitStatement(*s);
43    }
44};
45
46} // namespace SkSL
47
48#endif
49