+ virtual void visit(ProgramSyntax::VariableDeclaration &);
+ virtual void visit(ProgramSyntax::InterfaceBlock &);
+ virtual void visit(ProgramSyntax::FunctionDeclaration &);
+ void merge_down_variables();
+ virtual void visit(ProgramSyntax::Conditional &);
+ virtual void visit(ProgramSyntax::Iteration &);
+ };
+
+ struct UnusedFunctionLocator: Visitor
+ {
+ typedef std::set<ProgramSyntax::Node *> ResultType;
+
+ std::set<ProgramSyntax::Node *> unused_nodes;
+ std::set<ProgramSyntax::FunctionDeclaration *> used_definitions;
+
+ const ResultType &get_result() const { return unused_nodes; }
+ using Visitor::visit;
+ virtual void visit(ProgramSyntax::FunctionCall &);
+ virtual void visit(ProgramSyntax::FunctionDeclaration &);
+ };
+
+ struct NodeRemover: Visitor
+ {
+ std::set<ProgramSyntax::Node *> to_remove;
+
+ NodeRemover() { }
+ NodeRemover(const std::set<ProgramSyntax::Node *> &);
+
+ using Visitor::visit;
+ virtual void visit(ProgramSyntax::Block &);
+ virtual void visit(ProgramSyntax::VariableDeclaration &);
+ virtual void visit(ProgramSyntax::Iteration &);
+ };
+
+ struct PrecisionRemover: BlockModifier
+ {
+ using Visitor::visit;
+ virtual void visit(ProgramSyntax::Precision &);
+ virtual void visit(ProgramSyntax::VariableDeclaration &);
+ };
+
+ struct DefaultPrecisionGenerator: BlockModifier
+ {
+ bool toplevel;
+ std::set<std::string> have_default;
+
+ DefaultPrecisionGenerator();
+
+ using Visitor::visit;
+ virtual void visit(ProgramSyntax::Block &);
+ virtual void visit(ProgramSyntax::Precision &);
+ virtual void visit(ProgramSyntax::VariableDeclaration &);
+ };
+
+ struct LegacyConverter: BlockModifier
+ {
+ GLApi target_api;
+ Version target_version;
+ std::string type;
+ ProgramSyntax::VariableDeclaration *frag_out;
+
+ LegacyConverter();
+ LegacyConverter(const Version &);
+
+ bool check_version(const Version &) const;
+ bool check_extension(const Extension &) const;
+ using Visitor::visit;
+ bool supports_unified_interface_syntax() const;
+ virtual void visit(ProgramSyntax::VariableReference &);
+ virtual void visit(ProgramSyntax::Assignment &);
+ bool supports_unified_sampling_functions() const;
+ virtual void visit(ProgramSyntax::FunctionCall &);
+ bool supports_interface_layouts() const;
+ bool supports_centroid_sampling() const;
+ bool supports_sample_sampling() const;
+ virtual void visit(ProgramSyntax::VariableDeclaration &);
+ bool supports_interface_blocks(const std::string &) const;