Improve documentation

This commit is contained in:
Martchus 2018-02-03 15:45:15 +01:00
parent 54d4a15d4f
commit 21e7f83995
4 changed files with 40 additions and 3 deletions

View File

@ -25,6 +25,10 @@ CodeFactory::ToolInvocation::ToolInvocation(CodeFactory &factory)
fileManager.Retain(); fileManager.Retain();
} }
/*!
* \brief Constructs a new instance.
* \remarks The specified arguments are not copied and must remain valid for the live-time of the code factory.
*/
CodeFactory::CodeFactory( CodeFactory::CodeFactory(
const char *applicationPath, const std::vector<const char *> &sourceFiles, const std::vector<string> &clangOptions, std::ostream &os) const char *applicationPath, const std::vector<const char *> &sourceFiles, const std::vector<string> &clangOptions, std::ostream &os)
: m_applicationPath(applicationPath) : m_applicationPath(applicationPath)

View File

@ -57,43 +57,73 @@ private:
clang::CompilerInstance *m_compilerInstance; clang::CompilerInstance *m_compilerInstance;
}; };
/*!
* \brief Instantiates a code generator of the specified type and adds it to the current instance.
* \remarks The specified \a args are forwarded to the generator's constructor.
*/
template <typename GeneratorType, typename... Args> void CodeFactory::addGenerator(Args &&... args) template <typename GeneratorType, typename... Args> void CodeFactory::addGenerator(Args &&... args)
{ {
m_generators.emplace_back(std::make_unique<GeneratorType>(*this, std::forward<Args>(args)...)); m_generators.emplace_back(std::make_unique<GeneratorType>(*this, std::forward<Args>(args)...));
} }
namespace Detail { namespace Detail {
/*!
* \brief Wraps const references using std::cref() for use with std::bind().
*/
template <typename T> std::reference_wrapper<const T> wrapReferences(const T &val) template <typename T> std::reference_wrapper<const T> wrapReferences(const T &val)
{ {
return std::cref(val); return std::cref(val);
} }
/*!
* \brief Wraps mutable references using std::ref() for use with std::bind().
*/
template <typename T> std::reference_wrapper<T> wrapReferences(T &val) template <typename T> std::reference_wrapper<T> wrapReferences(T &val)
{ {
return std::ref(val); return std::ref(val);
} }
/*!
* \brief Forwards non-references for use with std::bind().
*/
template <typename T> T &&wrapReferences(T &&val) template <typename T> T &&wrapReferences(T &&val)
{ {
return std::forward<T>(val); return std::forward<T>(val);
} }
} // namespace Detail } // namespace Detail
/*!
* \brief Returns a function which instantiates a code generator of the specified type and adds it to the current instance.
* \remarks
* - The specified \a args are forwarded to the generator's constructor.
* - No copy of \a args passed by reference is made.
*/
template <typename GeneratorType, typename... Args> auto CodeFactory::bindGenerator(Args &&... args) template <typename GeneratorType, typename... Args> auto CodeFactory::bindGenerator(Args &&... args)
{ {
return std::bind(&CodeFactory::addGenerator<GeneratorType, Args...>, this, Detail::wrapReferences(std::forward<Args>(args)...)); return std::bind(&CodeFactory::addGenerator<GeneratorType, Args...>, this, Detail::wrapReferences(std::forward<Args>(args)...));
} }
/*!
* \brief Returns the added generators.
*/
inline const std::vector<std::unique_ptr<CodeGenerator>> &CodeFactory::generators() const inline const std::vector<std::unique_ptr<CodeGenerator>> &CodeFactory::generators() const
{ {
return m_generators; return m_generators;
} }
/*!
* \brief Returns the compiler instance.
* \remarks The is nullptr for a newly constructed factory and should be assigned by the frontend action.
*/
inline clang::CompilerInstance *CodeFactory::compilerInstance() inline clang::CompilerInstance *CodeFactory::compilerInstance()
{ {
return m_compilerInstance; return m_compilerInstance;
} }
/*!
* \brief Assigns the compiler instance.
* \remarks The factory does *not* take ownership.
*/
inline void CodeFactory::setCompilerInstance(clang::CompilerInstance *compilerInstance) inline void CodeFactory::setCompilerInstance(clang::CompilerInstance *compilerInstance)
{ {
m_compilerInstance = compilerInstance; m_compilerInstance = compilerInstance;

View File

@ -57,7 +57,7 @@ void DiagConsumer::finish()
} }
/*! /*!
* \brief Turns most errors into warnings so it works despite issues when parsing libstdc++ headers. * \brief Turns most errors into warnings so the code generator can even work when parsing incomplete headers.
*/ */
void DiagConsumer::HandleDiagnostic(clang::DiagnosticsEngine::Level diagLevel, const clang::Diagnostic &info) void DiagConsumer::HandleDiagnostic(clang::DiagnosticsEngine::Level diagLevel, const clang::Diagnostic &info)
{ {

View File

@ -16,7 +16,7 @@ class CodeFactory;
/*! /*!
* \brief The Consumer class is passed to FrontendAction for handling occurrences of different elements of the file. * \brief The Consumer class is passed to FrontendAction for handling occurrences of different elements of the file.
* *
* These elements consist of top-level declarations, namespace definitions and most imporantly the whole translation unit. * These elements consist of top-level declarations, namespace definitions and most importantly the whole translation unit.
* If the translations unit has occurred, that means nested elements (eg. classes) have been read completely. * If the translations unit has occurred, that means nested elements (eg. classes) have been read completely.
* In this case, the Consumer class will trigger traversing the translation unit using a Visitor instance. * In this case, the Consumer class will trigger traversing the translation unit using a Visitor instance.
*/ */
@ -45,7 +45,7 @@ inline Consumer::Consumer(CodeFactory &factory, clang::CompilerInstance &compile
} }
/*! /*!
* \brief The DiagConsumer class changes most errors into warnings. * \brief The DiagConsumer class allows turning most errors into warnings.
* \remarks This class is based on MocDiagConsumer from https://github.com/woboq/moc-ng. * \remarks This class is based on MocDiagConsumer from https://github.com/woboq/moc-ng.
*/ */
class DiagConsumer : public clang::DiagnosticConsumer { class DiagConsumer : public clang::DiagnosticConsumer {
@ -70,6 +70,9 @@ inline DiagConsumer::DiagConsumer(std::unique_ptr<clang::DiagnosticConsumer> Pre
{ {
} }
/*!
* \brief Returns the number of errors which actually would have been occurred if we would not turn most errors into warnings.
*/
inline unsigned int DiagConsumer::realErrorCount() const inline unsigned int DiagConsumer::realErrorCount() const
{ {
return m_realErrorCount; return m_realErrorCount;