]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/reflect.cpp
Make function dependency collection its own visitor class
[libs/gl.git] / source / glsl / reflect.cpp
index a3e36be8448c57eba60bd4ae6a154525e95a4b59..688c99bf81b951ae288a23c9d5409e94fd7903c8 100644 (file)
@@ -1,5 +1,7 @@
 #include "reflect.h"
 
+using namespace std;
+
 namespace Msp {
 namespace GL {
 namespace SL {
@@ -41,6 +43,50 @@ void LocationCounter::visit(VariableDeclaration &var)
                                r_count *= literal->value.value<int>();
 }
 
+
+set<Node *> DependencyCollector::apply(FunctionDeclaration &func)
+{
+       func.visit(*this);
+       return dependencies;
+}
+
+void DependencyCollector::visit(VariableReference &var)
+{
+       if(var.declaration && !locals.count(var.declaration))
+       {
+               dependencies.insert(var.declaration);
+               var.declaration->visit(*this);
+       }
+}
+
+void DependencyCollector::visit(InterfaceBlockReference &iface)
+{
+       if(iface.declaration)
+       {
+               dependencies.insert(iface.declaration);
+               iface.declaration->visit(*this);
+       }
+}
+
+void DependencyCollector::visit(FunctionCall &call)
+{
+       if(call.declaration)
+               dependencies.insert(call.declaration);
+       TraversingVisitor::visit(call);
+}
+
+void DependencyCollector::visit(VariableDeclaration &var)
+{
+       locals.insert(&var);
+       if(var.type_declaration)
+       {
+               dependencies.insert(var.type_declaration);
+               var.type_declaration->visit(*this);
+       }
+
+       TraversingVisitor::visit(var);
+}
+
 } // namespace SL
 } // namespace GL
 } // namespace Msp