+
+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);
+}
+