+void ProgramCompiler::FunctionResolver::visit(FunctionCall &call)
+{
+ map<string, vector<FunctionDeclaration *> >::iterator i = functions.find(call.name);
+ if(i!=functions.end())
+ call.declaration = i->second.back();
+
+ TraversingVisitor::visit(call);
+}
+
+void ProgramCompiler::FunctionResolver::visit(FunctionDeclaration &func)
+{
+ vector<FunctionDeclaration *> &decls = functions[func.name];
+ if(func.definition)
+ {
+ for(vector<FunctionDeclaration *>::iterator i=decls.begin(); i!=decls.end(); ++i)
+ (*i)->definition = func.definition;
+ decls.clear();
+ decls.push_back(&func);
+ }
+ else if(!decls.empty() && decls.back()->definition)
+ func.definition = decls.back()->definition;
+ else
+ decls.push_back(&func);
+
+ TraversingVisitor::visit(func);
+}
+
+