#include "iindexer.h" #include "indexer.h" namespace { struct ClangIndexer : IIndexer { ~ClangIndexer() override = default; std::vector> Index( Config* config, FileConsumerSharedState* file_consumer_shared, std::string file, const std::vector& args, const std::vector& file_contents, PerformanceImportFile* perf) override { bool dump_ast = false; for (const std::string& pattern : config->dumpAST) if (file.find(pattern) != std::string::npos) { dump_ast = true; break; } return Parse(config, file_consumer_shared, file, args, file_contents, perf, &index, dump_ast); } // Note: constructing this acquires a global lock ClangIndex index; }; struct TestIndexer : IIndexer { static std::unique_ptr FromEntries( const std::vector& entries) { auto result = MakeUnique(); for (const TestEntry& entry : entries) { std::vector> indexes; if (entry.num_indexes > 0) indexes.push_back(MakeUnique(entry.path, nullopt)); for (int i = 1; i < entry.num_indexes; ++i) { indexes.push_back(MakeUnique( entry.path + "_extra_" + std::to_string(i) + ".h", nullopt)); } result->indexes.insert(std::make_pair(entry.path, std::move(indexes))); } return result; } ~TestIndexer() override = default; std::vector> Index( Config* config, FileConsumerSharedState* file_consumer_shared, std::string file, const std::vector& args, const std::vector& file_contents, PerformanceImportFile* perf) override { auto it = indexes.find(file); if (it == indexes.end()) { // Don't return any indexes for unexpected data. assert(false && "no indexes"); return {}; } // FIXME: allow user to control how many times we return the index for a // specific file (atm it is always 1) auto result = std::move(it->second); indexes.erase(it); return result; } std::unordered_map>> indexes; }; } // namespace IIndexer::TestEntry::TestEntry(const std::string& path, int num_indexes) : path(path), num_indexes(num_indexes) {} // static std::unique_ptr IIndexer::MakeClangIndexer() { return MakeUnique(); } // static std::unique_ptr IIndexer::MakeTestIndexer( std::initializer_list entries) { return TestIndexer::FromEntries(entries); }