Silently ignore multiple registration of files
This commit is contained in:
parent
d14965b24e
commit
6dd85cb7a7
5 changed files with 23 additions and 6 deletions
|
|
@ -17,6 +17,7 @@
|
||||||
namespace cppast
|
namespace cppast
|
||||||
{
|
{
|
||||||
class cpp_entity;
|
class cpp_entity;
|
||||||
|
class cpp_file;
|
||||||
class cpp_namespace;
|
class cpp_namespace;
|
||||||
|
|
||||||
/// \exclude
|
/// \exclude
|
||||||
|
|
@ -78,10 +79,17 @@ namespace cppast
|
||||||
void register_definition(cpp_entity_id id,
|
void register_definition(cpp_entity_id id,
|
||||||
type_safe::object_ref<const cpp_entity> entity) const;
|
type_safe::object_ref<const cpp_entity> entity) const;
|
||||||
|
|
||||||
|
/// \effects Registers a new [cppast::cpp_file]().
|
||||||
|
/// \returns `true` if the file was not registered before.
|
||||||
|
/// If it returns `false`, the file was registered before and nothing was changed.
|
||||||
|
/// \requires The entity must live as long as the index lives.
|
||||||
|
/// \notes This operation is thread safe.
|
||||||
|
bool register_file(cpp_entity_id id, type_safe::object_ref<const cpp_file> file) const;
|
||||||
|
|
||||||
/// \effects Registers a new [cppast::cpp_entity]() which is a declaration.
|
/// \effects Registers a new [cppast::cpp_entity]() which is a declaration.
|
||||||
/// Only the first declaration will be registered.
|
/// Only the first declaration will be registered.
|
||||||
/// \requires The entity must live as long as the index lives.
|
/// \requires The entity must live as long as the index lives.
|
||||||
/// \requires The entity must not be a namespace.
|
/// \requires The entity must be forward declarable.
|
||||||
/// \notes This operation is thread safe.
|
/// \notes This operation is thread safe.
|
||||||
void register_forward_declaration(cpp_entity_id id,
|
void register_forward_declaration(cpp_entity_id id,
|
||||||
type_safe::object_ref<const cpp_entity> entity) const;
|
type_safe::object_ref<const cpp_entity> entity) const;
|
||||||
|
|
|
||||||
|
|
@ -50,11 +50,11 @@ namespace cppast
|
||||||
|
|
||||||
/// \effects Registers the file in the [cppast::cpp_entity_index]().
|
/// \effects Registers the file in the [cppast::cpp_entity_index]().
|
||||||
/// It will use the file name as identifier.
|
/// It will use the file name as identifier.
|
||||||
/// \returns The finished file.
|
/// \returns The finished file, or `nullptr`, if that file was already registered.
|
||||||
std::unique_ptr<cpp_file> finish(const cpp_entity_index& idx) noexcept
|
std::unique_ptr<cpp_file> finish(const cpp_entity_index& idx) noexcept
|
||||||
{
|
{
|
||||||
idx.register_definition(cpp_entity_id(file_->name()), type_safe::ref(*file_));
|
auto res = idx.register_file(cpp_entity_id(file_->name()), type_safe::ref(*file_));
|
||||||
return std::move(file_);
|
return res ? std::move(file_) : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
||||||
|
|
@ -84,6 +84,7 @@ namespace cppast
|
||||||
|
|
||||||
/// \effects Parses the given file.
|
/// \effects Parses the given file.
|
||||||
/// \returns The [cppast::cpp_file]() object describing it.
|
/// \returns The [cppast::cpp_file]() object describing it.
|
||||||
|
/// It can be `nullptr`, if there was an error or the specified file already registered in the index.
|
||||||
/// \requires The dynamic type of `config` must match the required config type.
|
/// \requires The dynamic type of `config` must match the required config type.
|
||||||
std::unique_ptr<cpp_file> parse(const cpp_entity_index& idx, std::string path,
|
std::unique_ptr<cpp_file> parse(const cpp_entity_index& idx, std::string path,
|
||||||
const compile_config& config) const
|
const compile_config& config) const
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@
|
||||||
#include <cppast/detail/assert.hpp>
|
#include <cppast/detail/assert.hpp>
|
||||||
#include <cppast/cpp_entity.hpp>
|
#include <cppast/cpp_entity.hpp>
|
||||||
#include <cppast/cpp_entity_kind.hpp>
|
#include <cppast/cpp_entity_kind.hpp>
|
||||||
|
#include <cppast/cpp_file.hpp>
|
||||||
|
|
||||||
using namespace cppast;
|
using namespace cppast;
|
||||||
|
|
||||||
|
|
@ -33,6 +34,13 @@ void cpp_entity_index::register_definition(cpp_entity_id
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool cpp_entity_index::register_file(cpp_entity_id id,
|
||||||
|
type_safe::object_ref<const cpp_file> file) const
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
|
return map_.emplace(std::move(id), value(file, true)).second;
|
||||||
|
}
|
||||||
|
|
||||||
void cpp_entity_index::register_forward_declaration(
|
void cpp_entity_index::register_forward_declaration(
|
||||||
cpp_entity_id id, type_safe::object_ref<const cpp_entity> entity) const
|
cpp_entity_id id, type_safe::object_ref<const cpp_entity> entity) const
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -399,7 +399,7 @@ std::unique_ptr<cpp_file> libclang_parser::do_parse(const cpp_entity_index& idx,
|
||||||
auto macro_iter = preprocessed.macros.begin();
|
auto macro_iter = preprocessed.macros.begin();
|
||||||
auto include_iter = preprocessed.includes.begin();
|
auto include_iter = preprocessed.includes.begin();
|
||||||
|
|
||||||
// convert entity hierachies
|
// convert entity hierarchies
|
||||||
detail::parse_context context{tu.get(), file, type_safe::ref(logger()), type_safe::ref(idx),
|
detail::parse_context context{tu.get(), file, type_safe::ref(logger()), type_safe::ref(idx),
|
||||||
detail::comment_context(preprocessed.comments)};
|
detail::comment_context(preprocessed.comments)};
|
||||||
detail::visit_tu(tu, path.c_str(), [&](const CXCursor& cur) {
|
detail::visit_tu(tu, path.c_str(), [&](const CXCursor& cur) {
|
||||||
|
|
@ -444,5 +444,5 @@ std::unique_ptr<cpp_file> libclang_parser::do_parse(const cpp_entity_index& idx,
|
||||||
catch (detail::parse_error& ex)
|
catch (detail::parse_error& ex)
|
||||||
{
|
{
|
||||||
logger().log("libclang parser", ex.get_diagnostic());
|
logger().log("libclang parser", ex.get_diagnostic());
|
||||||
return cpp_file::builder(path).finish(idx);
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue