diff --git a/src/db/db/gsiDeclDbCompoundOperation.cc b/src/db/db/gsiDeclDbCompoundOperation.cc index 70197552f..a259e3944 100644 --- a/src/db/db/gsiDeclDbCompoundOperation.cc +++ b/src/db/db/gsiDeclDbCompoundOperation.cc @@ -933,7 +933,7 @@ gsi::EnumIn decl_DText ("db", "DText", - constructor ("new", &dtext_from_itext, gsi::arg ("Text"), + constructor ("new", &dtext_from_itext, gsi::arg ("text"), "@brief Creates a floating-point coordinate text from an integer coordinate text\n" "\n" "This constructor has been introduced in version 0.25 and replaces the previous static method 'from_itext'." diff --git a/src/gsi/gsi/gsiClassBase.h b/src/gsi/gsi/gsiClassBase.h index 28d97f432..ba8e118af 100644 --- a/src/gsi/gsi/gsiClassBase.h +++ b/src/gsi/gsi/gsiClassBase.h @@ -558,6 +558,16 @@ public: return false; } + /** + * @brief Identifies the interpreter running the class + * + * The category is a disambiguator for external class (i.e. Python and Ruby versions). + */ + virtual std::string interpreter_name () const + { + return std::string (); + } + /** * @brief Post-construction initialization * diff --git a/src/lay/lay/layGSIHelpProvider.cc b/src/lay/lay/layGSIHelpProvider.cc index bdfb5b630..82bef4ab6 100644 --- a/src/lay/lay/layGSIHelpProvider.cc +++ b/src/lay/lay/layGSIHelpProvider.cc @@ -316,6 +316,12 @@ static std::string make_qualified_name (const gsi::ClassBase *cls) } + if (! cls->interpreter_name ().empty ()) { + qname += "("; + qname += cls->interpreter_name (); + qname += ")"; + } + return qname; } @@ -925,49 +931,22 @@ GSIHelpProvider::produce_class_doc (const std::string &cls) const const gsi::ClassBase *cls_obj = 0; - std::vector comp = tl::split (cls, "::"); - if (comp.empty ()) { - return "Invalid class name: " + cls; - } - - std::vector cp = comp; - - for (gsi::ClassBase::class_iterator c = gsi::ClassBase::begin_classes (); c != gsi::ClassBase::end_classes (); ++c) { - if (c->name () == cp.front ()) { - cls_obj = &*c; - cp.erase (cp.begin ()); + auto cl = gsi::ClassBase::classes_in_definition_order (); + for (auto c = cl.begin (); c != cl.end (); ++c) { + if (make_qualified_name (*c) == cls) { + cls_obj = *c; break; } } if (! cls_obj) { - return "Unknown class: " + cls; - } - while (! cp.empty ()) { + os << "" << std::endl + << "" << std::endl + << "Error

Unknown class: " << escape_xml (cls) << "

" + << std::endl; - const gsi::ClassBase *pc = cls_obj; - - cls_obj = 0; - while (pc && !cls_obj) { - - for (tl::weak_collection::const_iterator sc = pc->begin_child_classes (); sc != pc->end_child_classes (); ++sc) { - if (sc->name () == cp.front ()) { - cls_obj = sc.operator-> (); - cp.erase (cp.begin ()); - break; - } - } - - // Try the base classes too - since we might have skipped some of the classes in the - // inheritance hierarchy, the child may be in a base class. - pc = pc->base (); - - } - - if (! cls_obj) { - return "Unknown class: " + cls; - } + return os.str (); } diff --git a/src/lym/lym/lymMacro.cc b/src/lym/lym/lymMacro.cc index 32bb72411..e1ff1ee45 100644 --- a/src/lym/lym/lymMacro.cc +++ b/src/lym/lym/lymMacro.cc @@ -896,17 +896,17 @@ class ExternalClass : public gsi::ClassBase { public: - ExternalClass (const std::string &module, const std::string &name, const std::string &category, const gsi::ClassBase *base, const std::string &doc, const gsi::Methods &mm) - : gsi::ClassBase (doc, mm), m_category (category) + ExternalClass (const std::string &module, const std::string &name, const std::string &interpreter_name, const gsi::ClassBase *base, const std::string &doc, const gsi::Methods &mm) + : gsi::ClassBase (doc, mm), m_interpreter_name (interpreter_name) { set_module (module); set_name (name); set_base (base); } - const std::string &category () const + virtual std::string interpreter_name () const { - return m_category; + return m_interpreter_name; } virtual bool consolidate () const @@ -927,7 +927,7 @@ public: } private: - std::string m_category; + std::string m_interpreter_name; }; void Macro::install_doc () const @@ -976,8 +976,8 @@ void Macro::install_doc () const for (gsi::ClassBase::class_iterator c = gsi::ClassBase::begin_classes (); c != gsi::ClassBase::end_classes (); ++c) { if (c->name () == cls_name) { - const ExternalClass *ec = dynamic_cast (&*c); - if (!ec || ec->category () == category ()) { + const ExternalClass *ec = dynamic_cast (c.operator-> ()); + if (!ec || ec->interpreter_name () == interpreter_name ()) { cls = const_cast (&*c); } } @@ -1000,7 +1000,7 @@ void Macro::install_doc () const if (! cls) { // create a new class declaration static tl::stable_vector ext_classes; - ExternalClass *ext_cls = new ExternalClass (module, cls_name, category (), super_cls, doc, gsi::Methods ()); + ExternalClass *ext_cls = new ExternalClass (module, cls_name, interpreter_name (), super_cls, doc, gsi::Methods ()); ext_classes.push_back (ext_cls); cls = ext_cls; }