]> git.tdb.fi Git - builder.git/blobdiff - source/compilecommandsgenerator.cpp
Refactor InternalTask to take a functor
[builder.git] / source / compilecommandsgenerator.cpp
index 07ee15e779245f1f9f901ad063b317c20a9be005..855a80a3307db63e3e4f24222e8c092c1ba33f00 100644 (file)
@@ -4,17 +4,14 @@
 #include "builder.h"
 #include "compilecommandsgenerator.h"
 #include "compilecommandsjson.h"
+#include "internaltask.h"
 #include "objectfile.h"
 #include "sourcefile.h"
 
 using namespace std;
 using namespace Msp;
 
-CompileCommandsGenerator::CompileCommandsGenerator(Builder &b):
-       Tool(b, "CCJG")
-{ }
-
-Target *CompileCommandsGenerator::create_target(const list<Target *> &, const string &)
+Target *CompileCommandsGenerator::create_target(const vector<Target *> &, const string &)
 {
        throw logic_error("Not implemented");
 }
@@ -22,32 +19,25 @@ Target *CompileCommandsGenerator::create_target(const list<Target *> &, const st
 Task *CompileCommandsGenerator::run(const Target &target) const
 {
        const CompileCommandsJson &cmds = dynamic_cast<const CompileCommandsJson &>(target);
-       Worker *worker = new Worker(cmds);
-       return new InternalTask(worker);
+       return new InternalTask([&cmds]{ return _run(cmds); });
 }
 
-
-CompileCommandsGenerator::Worker::Worker(const CompileCommandsJson &t):
-       target(t)
-{ }
-
-void CompileCommandsGenerator::Worker::main()
+bool CompileCommandsGenerator::_run(const CompileCommandsJson &cmds)
 {
-       Builder &builder = target.get_package()->get_builder();
-       const SourcePackage &spkg = *target.get_package();
+       Builder &builder = cmds.get_package()->get_builder();
+       const SourcePackage &spkg = *cmds.get_package();
        string work_dir = c_escape(spkg.get_source_directory().str());
 
-       IO::BufferedFile out(target.get_path().str(), IO::M_WRITE);
+       IO::BufferedFile out(cmds.get_path().str(), IO::M_WRITE);
        IO::print(out, "[");
 
        bool first = true;
-       const BuildGraph::TargetMap &targets = builder.get_build_graph().get_targets();
-       for(BuildGraph::TargetMap::const_iterator i=targets.begin(); i!=targets.end(); ++i)
-               if(i->second->is_buildable() && i->second->get_package()==&spkg)
-                       if(ObjectFile *obj = dynamic_cast<ObjectFile *>(i->second))
+       for(const auto &kvp: builder.get_build_graph().get_targets())
+               if(kvp.second->is_buildable() && kvp.second->get_package()==&spkg)
+                       if(ObjectFile *obj = dynamic_cast<ObjectFile *>(kvp.second))
                        {
                                FS::Path src_path = obj->get_source().get_path();
-                               Task *task = i->second->build();
+                               Task *task = kvp.second->build();
                                if(!first)
                                        out.put(',');
                                IO::print(out, "\n\t{\n");
@@ -61,5 +51,5 @@ void CompileCommandsGenerator::Worker::main()
 
        IO::print(out, "\n]\n");
 
-       status = Task::SUCCESS;
+       return true;
 }