]> git.tdb.fi Git - libs/gl.git/blobdiff - source/programcompiler.h
Add getter for animation duration
[libs/gl.git] / source / programcompiler.h
index fea7a73fb78c3e8a0b68d12c7a9aa25f73018840..7e8d3373a53e4ffcf028a218d99e420d1a9cd5a7 100644 (file)
@@ -29,7 +29,7 @@ private:
        struct BlockModifier: Visitor
        {
                bool remove_node;
-               std::list<RefPtr<ProgramSyntax::Node> > insert_nodes;
+               std::vector<RefPtr<ProgramSyntax::Node> > insert_nodes;
 
                BlockModifier();
 
@@ -81,9 +81,9 @@ private:
        template<typename T>
        struct NodeGatherer: Visitor
        {
-               typedef std::list<T *> ResultType;
+               typedef std::vector<T *> ResultType;
 
-               std::list<T *> nodes;
+               std::vector<T *> nodes;
 
                const ResultType &get_result() const { return nodes; }
                using Visitor::visit;
@@ -158,13 +158,6 @@ private:
                virtual void visit(ProgramSyntax::Passthrough &);
        };
 
-       struct VariableRenamer: Visitor
-       {
-               using Visitor::visit;
-               virtual void visit(ProgramSyntax::VariableReference &);
-               virtual void visit(ProgramSyntax::VariableDeclaration &);
-       };
-
        struct DeclarationReorderer: Visitor
        {
                enum DeclarationKind
@@ -176,17 +169,21 @@ private:
                        FUNCTION
                };
 
+               unsigned scope_level;
                DeclarationKind kind;
+               std::set<ProgramSyntax::Node *> ordered_funcs;
+               std::set<ProgramSyntax::Node *> needed_funcs;
 
                DeclarationReorderer();
 
                using Visitor::visit;
                virtual void visit(ProgramSyntax::Block &);
+               virtual void visit(ProgramSyntax::FunctionCall &);
                virtual void visit(ProgramSyntax::InterfaceLayout &) { kind = LAYOUT; }
                virtual void visit(ProgramSyntax::StructDeclaration &) { kind = STRUCT; }
-               virtual void visit(ProgramSyntax::VariableDeclaration &) { kind = VARIABLE; }
+               virtual void visit(ProgramSyntax::VariableDeclaration &);
                virtual void visit(ProgramSyntax::InterfaceBlock &) { kind = VARIABLE; }
-               virtual void visit(ProgramSyntax::FunctionDeclaration &) { kind = FUNCTION; }
+               virtual void visit(ProgramSyntax::FunctionDeclaration &);
        };
 
        struct InlineableFunctionLocator: Visitor
@@ -370,11 +367,12 @@ private:
        };
 
        Resources *resources;
-       ProgramParser parser;
        ProgramSyntax::Module *module;
+       std::set<std::string> imported_names;
 
 public:
        ProgramCompiler();
+       ~ProgramCompiler();
 
        void compile(const std::string &, const std::string & = "<string>");
        void compile(IO::Base &, Resources * = 0, const std::string & = "<file>");
@@ -385,6 +383,8 @@ private:
        static ProgramSyntax::Module *create_builtins_module();
        static ProgramSyntax::Module &get_builtins_module();
        static ProgramSyntax::Stage *get_builtins(ProgramSyntax::StageType);
+       void append_module(ProgramSyntax::Module &);
+       void append_stage(ProgramSyntax::Stage &);
        void process();
        void import(const std::string &);
        void generate(ProgramSyntax::Stage &);