Kaydet (Commit) 53d7f614 authored tarafından Stephan Bergmann's avatar Stephan Bergmann

Unpublished optional bases of published interfaces complicate things

Change-Id: I206b623fcc3c9e04fc5336cb3704315c44fb83b8
üst 73a1a54b
...@@ -43,7 +43,11 @@ void badUsage() { ...@@ -43,7 +43,11 @@ void badUsage() {
<< std::endl << std::endl
<< ("last <registry> is written to stdout; if --published is specified," << ("last <registry> is written to stdout; if --published is specified,"
" only the") " only the")
<< std::endl << "published entities are written out." << std::endl; << std::endl
<< ("published entities (plus any non-published entities referenced"
" from published")
<< std::endl
<< "via any unpublished optional bases) are written out." << std::endl;
std::exit(EXIT_FAILURE); std::exit(EXIT_FAILURE);
} }
...@@ -133,13 +137,15 @@ OUString decomposeType( ...@@ -133,13 +137,15 @@ OUString decomposeType(
} }
struct Entity { struct Entity {
explicit Entity(rtl::Reference<unoidl::Entity> const & theEntity): explicit Entity(
entity(theEntity), sorted(false), written(false) rtl::Reference<unoidl::Entity> const & theEntity, bool theRelevant):
entity(theEntity), relevant(theRelevant), sorted(false), written(false)
{} {}
rtl::Reference<unoidl::Entity> const entity; rtl::Reference<unoidl::Entity> const entity;
std::set<OUString> dependencies; std::set<OUString> dependencies;
std::set<OUString> interfaceDependencies; std::set<OUString> interfaceDependencies;
bool relevant;
bool sorted; bool sorted;
bool written; bool written;
}; };
...@@ -229,12 +235,18 @@ void scanMap( ...@@ -229,12 +235,18 @@ void scanMap(
manager, manager,
static_cast<unoidl::ModuleEntity *>(ent.get())->createCursor(), static_cast<unoidl::ModuleEntity *>(ent.get())->createCursor(),
published, name + ".", entities); published, name + ".", entities);
} else if (!published } else {
|| (static_cast<unoidl::PublishableEntity *>(ent.get())
->isPublished()))
{
std::map<OUString, Entity>::iterator i( std::map<OUString, Entity>::iterator i(
entities.insert(std::make_pair(name, Entity(ent))).first); entities.insert(
std::make_pair(
name,
Entity(
ent,
(!published
|| (static_cast<unoidl::PublishableEntity *>(
ent.get())
->isPublished())))))
.first);
switch (ent->getSort()) { switch (ent->getSort()) {
case unoidl::Entity::SORT_MODULE: case unoidl::Entity::SORT_MODULE:
assert(false); // this cannot happen assert(false); // this cannot happen
...@@ -390,6 +402,22 @@ void scanMap( ...@@ -390,6 +402,22 @@ void scanMap(
} }
} }
void propagateRelevant(std::map<OUString, Entity> & entities, Entity & entity) {
if (!entity.relevant) {
entity.relevant = true;
if (entity.sorted) {
for (std::set<OUString>::iterator i(entity.dependencies.begin());
i != entity.dependencies.end(); ++i)
{
std::map<OUString, Entity>::iterator j(entities.find(*i));
if (j != entities.end()) {
propagateRelevant(entities, j->second);
}
}
}
}
}
void visit( void visit(
std::map<OUString, Entity> & entities, std::map<OUString, Entity> & entities,
std::map<OUString, Entity>::iterator const & iterator, std::map<OUString, Entity>::iterator const & iterator,
...@@ -405,6 +433,9 @@ void visit( ...@@ -405,6 +433,9 @@ void visit(
{ {
std::map<OUString, Entity>::iterator j(entities.find(*i)); std::map<OUString, Entity>::iterator j(entities.find(*i));
if (j != entities.end()) { if (j != entities.end()) {
if (iterator->second.relevant) {
propagateRelevant(entities, j->second);
}
visit(entities, j, result); visit(entities, j, result);
} }
} }
...@@ -555,7 +586,7 @@ void writeEntity( ...@@ -555,7 +586,7 @@ void writeEntity(
OUString const & name) OUString const & name)
{ {
std::map<OUString, Entity>::iterator i(entities.find(name)); std::map<OUString, Entity>::iterator i(entities.find(name));
if (i != entities.end()) { if (i != entities.end() && i->second.relevant) {
assert(!i->second.written); assert(!i->second.written);
i->second.written = true; i->second.written = true;
for (std::set<OUString>::iterator j( for (std::set<OUString>::iterator j(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment