Skip to content

Commit 616773e

Browse files
committed
move Corpus::build to CorpusImpl::build
1 parent e9015a2 commit 616773e

10 files changed

+178
-170
lines changed

include/mrdox/Corpus.hpp

-13
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
#include <mrdox/Config.hpp>
1717
#include <mrdox/MetadataFwd.hpp>
1818
#include <mrdox/Metadata/Symbols.hpp>
19-
#include <clang/Tooling/Execution.h>
2019
#include <cassert>
2120
#include <memory>
2221
#include <string>
@@ -129,18 +128,6 @@ class MRDOX_VISIBLE
129128

130129
//--------------------------------------------
131130

132-
/** Build metadata for a set of translation units.
133-
134-
@param config A shared pointer to the configuration.
135-
*/
136-
MRDOX_DECL
137-
[[nodiscard]]
138-
static
139-
Expected<std::unique_ptr<Corpus>>
140-
build(
141-
tooling::ToolExecutor& ex,
142-
std::shared_ptr<Config const> config);
143-
144131
// KRYSTIAN NOTE: temporary
145132
MRDOX_DECL
146133
std::string&

source/AST/Bitcode.hpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
#include <mrdox/Platform.hpp>
1616
#include <mrdox/MetadataFwd.hpp>
17+
#include <mrdox/Support/Expected.hpp>
1718
#include <clang/Tooling/Execution.h>
1819
#include <llvm/ADT/SmallVector.h>
1920
#include <llvm/ADT/StringMap.h>
@@ -78,7 +79,7 @@ writeBitcode(
7879

7980
/** Return an array of Info read from a bitstream.
8081
*/
81-
Expected<std::vector<std::unique_ptr<Info>>>
82+
mrdox::Expected<std::vector<std::unique_ptr<Info>>>
8283
readBitcode(llvm::StringRef bitcode);
8384

8485
/** Store a key/value pair in the tool results.

source/AST/BitcodeReader.cpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,13 @@
1414
#include "DecodeRecord.hpp"
1515
#include "Support/Debug.hpp"
1616
#include "Support/Error.hpp"
17+
#include <mrdox/Support/Expected.hpp>
1718

1819
namespace clang {
1920
namespace mrdox {
2021

2122
// Entry point
22-
Expected<std::vector<std::unique_ptr<Info>>>
23+
mrdox::Expected<std::vector<std::unique_ptr<Info>>>
2324
BitcodeReader::
2425
getInfos()
2526
{
@@ -173,7 +174,7 @@ readBlockInfoBlock()
173174
//------------------------------------------------
174175

175176
template<class T>
176-
Expected<std::unique_ptr<Info>>
177+
mrdox::Expected<std::unique_ptr<Info>>
177178
BitcodeReader::
178179
readInfo(
179180
unsigned ID)
@@ -298,7 +299,7 @@ skipUntilRecordOrBlock(
298299
//------------------------------------------------
299300

300301
// Calls readBlock to read each block in the given bitcode.
301-
Expected<std::vector<std::unique_ptr<Info>>>
302+
mrdox::Expected<std::vector<std::unique_ptr<Info>>>
302303
readBitcode(llvm::StringRef bitcode)
303304
{
304305
llvm::BitstreamCursor Stream(bitcode);

source/AST/BitcodeReader.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class BitcodeReader
4646
// Main entry point, calls readBlock to read each block in the given stream.
4747
auto
4848
getInfos() ->
49-
Expected<std::vector<std::unique_ptr<Info>>>;
49+
mrdox::Expected<std::vector<std::unique_ptr<Info>>>;
5050
public:
5151
struct AnyBlock;
5252

@@ -64,7 +64,7 @@ class BitcodeReader
6464
/** Return the next decoded Info from the stream.
6565
*/
6666
template<class T>
67-
Expected<std::unique_ptr<Info>>
67+
mrdox::Expected<std::unique_ptr<Info>>
6868
readInfo(unsigned ID);
6969

7070
/** Read a single block.

source/Corpus.cpp

+1-148
Original file line numberDiff line numberDiff line change
@@ -9,55 +9,15 @@
99
// Official repository: https://github.com/cppalliance/mrdox
1010
//
1111

12-
#include "CorpusImpl.hpp"
1312
#include "ConfigImpl.hpp"
14-
#include "AST/Bitcode.hpp"
15-
#include "AST/FrontendAction.hpp"
16-
#include "Metadata/Reduce.hpp"
17-
#include "Support/Error.hpp"
13+
#include <mrdox/Corpus.hpp>
1814
#include <mrdox/Support/Report.hpp>
1915
#include <mrdox/Metadata.hpp>
20-
#include <clang/Tooling/ArgumentsAdjusters.h>
21-
#include <clang/Tooling/CommonOptionsParser.h>
22-
#include <llvm/Bitstream/BitstreamReader.h>
23-
#include <llvm/Support/Mutex.h>
2416
#include <cassert>
2517

2618
namespace clang {
2719
namespace mrdox {
2820

29-
// A standalone function to call to merge a vector of infos into one.
30-
// This assumes that all infos in the vector are of the same type, and will fail
31-
// if they are different.
32-
// Dispatch function.
33-
llvm::Expected<std::unique_ptr<Info>>
34-
mergeInfos(std::vector<std::unique_ptr<Info>>& Values)
35-
{
36-
if (Values.empty() || !Values[0])
37-
return llvm::createStringError(llvm::inconvertibleErrorCode(),
38-
"no info values to merge");
39-
40-
switch (Values[0]->Kind) {
41-
case InfoKind::Namespace:
42-
return reduce<NamespaceInfo>(Values);
43-
case InfoKind::Record:
44-
return reduce<RecordInfo>(Values);
45-
case InfoKind::Enum:
46-
return reduce<EnumInfo>(Values);
47-
case InfoKind::Function:
48-
return reduce<FunctionInfo>(Values);
49-
case InfoKind::Typedef:
50-
return reduce<TypedefInfo>(Values);
51-
case InfoKind::Variable:
52-
return reduce<VarInfo>(Values);
53-
case InfoKind::Field:
54-
return reduce<FieldInfo>(Values);
55-
default:
56-
return llvm::createStringError(llvm::inconvertibleErrorCode(),
57-
"unexpected info type");
58-
}
59-
}
60-
6121
//------------------------------------------------
6222

6323
Corpus::~Corpus() noexcept = default;
@@ -285,113 +245,6 @@ traverse(
285245
//
286246
//------------------------------------------------
287247

288-
Expected<std::unique_ptr<Corpus>>
289-
Corpus::
290-
build(
291-
tooling::ToolExecutor& ex,
292-
std::shared_ptr<Config const> config_)
293-
{
294-
auto config = std::dynamic_pointer_cast<ConfigImpl const>(config_);
295-
auto corpus = std::make_unique<CorpusImpl>(config);
296-
297-
// Build arguments adjuster
298-
tooling::ArgumentsAdjuster ArgAdjuster;
299-
{
300-
for(auto const& define : config->additionalDefines_)
301-
{
302-
std::string s;
303-
llvm::raw_string_ostream os(s);
304-
os << "-D" << define;
305-
ArgAdjuster = tooling::combineAdjusters(
306-
tooling::getInsertArgumentAdjuster(
307-
s.c_str(), tooling::ArgumentInsertPosition::END),
308-
ArgAdjuster);
309-
}
310-
}
311-
312-
// Traverse the AST for all translation units
313-
// and emit serializd bitcode into tool results.
314-
// This operation happens ona thread pool.
315-
if(corpus->config.verboseOutput)
316-
reportInfo("Mapping declarations");
317-
if(auto err = ex.execute(
318-
makeFrontendActionFactory(
319-
*ex.getExecutionContext(), *config), ArgAdjuster))
320-
{
321-
if(! corpus->config.ignoreFailures)
322-
return toError(std::move(err));
323-
reportWarning("warning: mapping failed because ", toString(std::move(err)));
324-
}
325-
326-
// Inject the global namespace
327-
{
328-
// default-constructed NamespaceInfo
329-
// describes the global namespace
330-
NamespaceInfo I;
331-
insertBitcode(
332-
*ex.getExecutionContext(),
333-
writeBitcode(I));
334-
}
335-
336-
// Collect the symbols. Each symbol will have
337-
// a vector of one or more bitcodes. These will
338-
// be merged later.
339-
if(corpus->config.verboseOutput)
340-
reportInfo("Collecting symbols");
341-
auto bitcodes = collectBitcodes(ex);
342-
343-
// First reducing phase (reduce all decls into one info per decl).
344-
if(corpus->config.verboseOutput)
345-
reportInfo("Reducing {} declarations", bitcodes.size());
346-
std::atomic<bool> GotFailure;
347-
GotFailure = false;
348-
corpus->config.parallelForEach(
349-
bitcodes,
350-
[&](auto& Group)
351-
{
352-
// One or more Info for the same symbol ID
353-
std::vector<std::unique_ptr<Info>> Infos;
354-
355-
// Each Bitcode can have multiple Infos
356-
for (auto& bitcode : Group.getValue())
357-
{
358-
auto infos = readBitcode(bitcode);
359-
if(! infos)
360-
{
361-
reportError(infos.getError(), "read bitcode");
362-
GotFailure = true;
363-
return;
364-
}
365-
std::move(
366-
infos->begin(),
367-
infos->end(),
368-
std::back_inserter(Infos));
369-
}
370-
371-
auto merged = mergeInfos(Infos);
372-
if(! merged)
373-
{
374-
reportError(toError(merged.takeError()), "merge metadata");
375-
GotFailure = true;
376-
return;
377-
}
378-
379-
std::unique_ptr<Info> I(merged.get().release());
380-
Assert(Group.getKey() == I->id);
381-
corpus->insert(std::move(I));
382-
});
383-
384-
if(corpus->config.verboseOutput)
385-
llvm::outs() << "Collected " << corpus->InfoMap.size() << " symbols.\n";
386-
387-
if(GotFailure)
388-
return Error("multiple errors occurred");
389-
390-
corpus->canonicalize();
391-
392-
return corpus;
393-
}
394-
395248
// KRYSTIAN NOTE: temporary
396249
std::string&
397250
Corpus::

0 commit comments

Comments
 (0)