mirror of https://github.com/KLayout/klayout.git
RBA/pya: don't inject child classes into module
Previously, child classes have also appeared in the module. Now, they only appear in the parent class.
This commit is contained in:
parent
4858f3418a
commit
5ed61bcb5a
|
|
@ -597,17 +597,9 @@ ClassBase::classes_in_definition_order (const char *mod_name)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool all_children_available = true;
|
if ((*c)->parent () != 0 && taken.find ((*c)->parent ()) == taken.end ()) {
|
||||||
for (tl::weak_collection<gsi::ClassBase>::const_iterator cc = (*c)->begin_child_classes (); cc != (*c)->end_child_classes (); ++cc) {
|
// can't produce this class yet - it's a child of a parent that is not produced yet.
|
||||||
tl_assert (cc->declaration () != 0);
|
reason_for_more = tl::sprintf ("parent of class %s.%s not available (%s.%s)", (*c)->module (), (*c)->name (), (*c)->parent ()->module (), (*c)->parent ()->name ());
|
||||||
if (taken.find (cc.operator-> ()) == taken.end ()) {
|
|
||||||
reason_for_more = tl::sprintf ("child of class %s.%s not available (%s.%s)", (*c)->module (), (*c)->name (), cc->module (), cc->name ());
|
|
||||||
all_children_available = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (! all_children_available) {
|
|
||||||
// can't produce this class yet - the children are not available yet.
|
|
||||||
more_classes.push_back (*c);
|
more_classes.push_back (*c);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -249,7 +249,7 @@ public:
|
||||||
* Definition order is:
|
* Definition order is:
|
||||||
* - No duplicate class entries
|
* - No duplicate class entries
|
||||||
* - Base classes before their derived classes
|
* - Base classes before their derived classes
|
||||||
* - Child classes before their parent classes
|
* - Child classes after their parent classes
|
||||||
*
|
*
|
||||||
* If a module name is given, only top-level classes from this
|
* If a module name is given, only top-level classes from this
|
||||||
* module will be considered. However, the list may also include
|
* module will be considered. However, the list may also include
|
||||||
|
|
|
||||||
|
|
@ -2427,14 +2427,16 @@ PythonModule::make_classes (const char *mod_name)
|
||||||
tl_assert (cls_for_type (type) == *c);
|
tl_assert (cls_for_type (type) == *c);
|
||||||
|
|
||||||
PyList_Append (all_list.get (), PythonRef (c2python ((*c)->name ())).get ());
|
PyList_Append (all_list.get (), PythonRef (c2python ((*c)->name ())).get ());
|
||||||
PyModule_AddObject (module, (*c)->name ().c_str (), (PyObject *) type);
|
|
||||||
|
|
||||||
// Create the sub-class attributes
|
// Add to the parent class as child class or add to module
|
||||||
|
|
||||||
for (tl::weak_collection<gsi::ClassBase>::const_iterator cc = (*c)->begin_child_classes (); cc != (*c)->end_child_classes (); ++cc) {
|
if ((*c)->parent ()) {
|
||||||
tl_assert (cc->declaration () != 0);
|
tl_assert ((*c)->parent ()->declaration () != 0);
|
||||||
PythonRef cc_obj ((PyObject *) PythonClassClientData::py_type (*cc->declaration ()), false);
|
PyTypeObject *parent_type = PythonClassClientData::py_type (*(*c)->parent ()->declaration ());
|
||||||
set_type_attr (type, cc->name ().c_str (), cc_obj);
|
PythonRef attr ((PyObject *) type);
|
||||||
|
set_type_attr (parent_type, (*c)->name ().c_str (), attr);
|
||||||
|
} else {
|
||||||
|
PyModule_AddObject (module, (*c)->name ().c_str (), (PyObject *) type);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build the attributes now ...
|
// Build the attributes now ...
|
||||||
|
|
|
||||||
|
|
@ -1476,7 +1476,15 @@ rba_init (RubyInterpreterPrivateData *d)
|
||||||
// there should be only main declarations since we merged
|
// there should be only main declarations since we merged
|
||||||
tl_assert ((*c)->declaration () == *c);
|
tl_assert ((*c)->declaration () == *c);
|
||||||
|
|
||||||
VALUE klass = rb_define_class_under (module, (*c)->name ().c_str (), super);
|
VALUE klass;
|
||||||
|
if ((*c)->parent ()) {
|
||||||
|
tl_assert (is_registered ((*c)->parent ()));
|
||||||
|
VALUE parent_class = ruby_cls ((*c)->parent ());
|
||||||
|
klass = rb_define_class_under (parent_class, (*c)->name ().c_str (), super);
|
||||||
|
} else {
|
||||||
|
klass = rb_define_class_under (module, (*c)->name ().c_str (), super);
|
||||||
|
}
|
||||||
|
|
||||||
register_class (klass, *c);
|
register_class (klass, *c);
|
||||||
|
|
||||||
rb_define_alloc_func (klass, alloc_proxy);
|
rb_define_alloc_func (klass, alloc_proxy);
|
||||||
|
|
@ -1612,7 +1620,7 @@ rba_init (RubyInterpreterPrivateData *d)
|
||||||
// x = object with signal "signal"
|
// x = object with signal "signal"
|
||||||
// x.signal = proc
|
// x.signal = proc
|
||||||
// this will basically map to
|
// this will basically map to
|
||||||
// x.signal(proc)
|
// x.signal(proc)
|
||||||
// which will make proc the only receiver for the signal
|
// which will make proc the only receiver for the signal
|
||||||
rb_define_alias (klass, (mt->name (mid) + "=").c_str (), mt->name (mid).c_str ());
|
rb_define_alias (klass, (mt->name (mid) + "=").c_str (), mt->name (mid).c_str ());
|
||||||
}
|
}
|
||||||
|
|
@ -1628,13 +1636,6 @@ rba_init (RubyInterpreterPrivateData *d)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// produce the child classes as constants
|
|
||||||
for (tl::weak_collection<gsi::ClassBase>::const_iterator cc = (*c)->begin_child_classes (); cc != (*c)->end_child_classes (); ++cc) {
|
|
||||||
tl_assert (is_registered (cc.operator-> ()));
|
|
||||||
rb_define_const (ruby_cls (*c), cc->name ().c_str (), ruby_cls (cc->declaration ()));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// now make the constants
|
// now make the constants
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue