+ if(!compiled)
+ throw invalid_operation("Compiler::get_vertex_attributes");
+ for(list<Stage>::const_iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
+ if(i->type==Stage::VERTEX)
+ return i->locations;
+ throw invalid_operation("Compiler::get_vertex_attributes");
+}
+
+const map<string, unsigned> &Compiler::get_fragment_outputs() const
+{
+ if(!compiled)
+ throw invalid_operation("Compiler::get_fragment_outputs");
+ for(list<Stage>::const_iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
+ if(i->type==Stage::FRAGMENT)
+ return i->locations;
+ throw invalid_operation("Compiler::get_fragment_outputs");
+}
+
+const map<string, unsigned> &Compiler::get_texture_bindings() const
+{
+ if(!compiled)
+ throw invalid_operation("Compiler::get_texture_bindings");
+ return module->shared.texture_bindings;
+}
+
+const map<string, unsigned> &Compiler::get_uniform_block_bindings() const
+{
+ if(!compiled)
+ throw invalid_operation("Compiler::get_uniform_block_bindings");
+ return module->shared.uniform_block_bindings;
+}
+
+const SourceMap &Compiler::get_source_map() const
+{
+ return module->source_map;
+}
+
+string Compiler::get_stage_debug(Stage::Type stage_type) const
+{
+ for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
+ if(i->type==stage_type)
+ return DumpTree().apply(*i);
+ throw key_error(Stage::get_stage_name(stage_type));
+}
+
+string Compiler::get_diagnostics() const
+{
+ string combined;
+ for(list<Stage>::const_iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
+ for(vector<Diagnostic>::const_iterator j=i->diagnostics.begin(); j!=i->diagnostics.end(); ++j)
+ if(j->source!=INTERNAL_SOURCE)
+ append(combined, "\n", format("%s:%d: %s", module->source_map.get_name(j->source), j->line, j->message));
+ return combined;
+}
+
+void Compiler::append_module(Module &mod, DataFile::Collection *res)
+{
+ module->source_map.merge_from(mod.source_map);
+
+ vector<Import *> imports;
+ for(NodeList<Statement>::const_iterator i=mod.shared.content.body.begin(); i!=mod.shared.content.body.end(); ++i)
+ if(Import *imp = dynamic_cast<Import *>(i->get()))
+ imports.push_back(imp);