@@ -191,7 +191,9 @@ def _count_and_unwrap(
191191            assert  False 
192192
193193
194- def  _fmt_base_name (typename : PQName ) ->  typing .Tuple [str , str , str , typing .List [str ]]:
194+ def  _fmt_base_name (
195+     typename : PQName ,
196+ ) ->  typing .Tuple [str , str , str , str , str , typing .List [str ]]:
195197    all_parts  =  []
196198    nameonly_parts  =  []
197199
@@ -209,18 +211,22 @@ def _fmt_base_name(typename: PQName) -> typing.Tuple[str, str, str, typing.List[
209211
210212    if  last_segment .specialization :
211213        most_parts  =  all_parts [:- 1 ]
214+         ns_parts  =  all_parts [:- 1 ]
212215        all_parts .append (last_segment .format ())
213216        most_parts .append (last_segment .name )
214217        tparam_list  =  [arg .format () for  arg  in  last_segment .specialization .args ]
215218    else :
219+         ns_parts  =  all_parts [:]
216220        all_parts .append (last_segment .name )
217221        most_parts  =  all_parts 
218222        tparam_list  =  []
219223
220224    return  (
225+         last_segment .name ,
221226        "::" .join (most_parts ),
222227        "::" .join (all_parts ),
223228        "::" .join (nameonly_parts ),
229+         "::" .join (ns_parts ),
224230        tparam_list ,
225231    )
226232
@@ -287,7 +293,6 @@ class ClassStateData(typing.NamedTuple):
287293    defer_protected_fields : typing .List [Field ]
288294
289295    # Needed for trampoline 
290-     cls_cpp_identifier : str 
291296    template_argument_list : str 
292297    base_template_params : str 
293298    base_template_args : str 
@@ -751,7 +756,6 @@ def on_class_start(self, state: AWClassBlockState) -> typing.Optional[bool]:
751756            defer_private_virtual_methods = [],
752757            defer_protected_fields = [],
753758            # Trampoline data 
754-             cls_cpp_identifier = cls_cpp_identifier ,
755759            template_argument_list = template_argument_list ,
756760            base_template_args = base_template_args_s ,
757761            base_template_params = base_template_params_s ,
@@ -824,28 +828,38 @@ def _process_class_bases(
824828            if  base .access  ==  "private" :
825829                continue 
826830
827-             cpp_name , cpp_name_w_templates , dep_cpp_name , tparam_list  =  _fmt_base_name (
828-                 base .typename 
829-             )
831+             (
832+                 cpp_name ,
833+                 full_cpp_name ,
834+                 cpp_name_w_templates ,
835+                 dep_cpp_name ,
836+                 base_ns ,
837+                 tparam_list ,
838+             ) =  _fmt_base_name (base .typename )
830839            if  ignored_bases .pop (cpp_name_w_templates , None ):
831840                continue 
832841
833842            # Sometimes, we can't guess all the information about the base, so the 
834843            # user needs to specify it explicitly. 
835-             user_bqual  =  class_data .base_qualnames .get (cpp_name )
844+             user_bqual  =  class_data .base_qualnames .get (full_cpp_name )
836845            if  user_bqual :
837846                cpp_name_w_templates  =  user_bqual 
838847                # TODO: sometimes need to add this to pybase_params, but 
839848                # that would require parsing this more. Seems sufficiently 
840849                # obscure, going to omit it for now. 
841850                tp  =  user_bqual .find ("<" )
842851                if  tp  ==  - 1 :
843-                     cpp_name  =  user_bqual 
852+                     full_cpp_name  =  user_bqual 
844853                    template_params  =  "" 
845854                else :
846-                     cpp_name  =  user_bqual [:tp ]
855+                     full_cpp_name  =  user_bqual [:tp ]
847856                    template_params  =  user_bqual [tp  +  1  : - 1 ]
848-                 dep_cpp_name  =  cpp_name 
857+                 dep_cpp_name  =  full_cpp_name 
858+                 ns_idx  =  full_cpp_name .rfind ("::" )
859+                 if  ns_idx  ==  - 1 :
860+                     base_ns  =  "" 
861+                 else :
862+                     base_ns  =  full_cpp_name [:ns_idx ]
849863            else :
850864                # TODO: we don't handle nested child classes with templates here 
851865                #       ... but that has to be rather obscure? 
@@ -858,15 +872,21 @@ def _process_class_bases(
858872                # If no explicit namespace specified, we assume base classes 
859873                # live in the same namespace as the class 
860874                if  len (base .typename .segments ) ==  1 :
861-                     cpp_name  =  f"{ cls_namespace } { cpp_name }  
875+                     base_ns  =  cls_namespace 
876+                     full_cpp_name  =  f"{ cls_namespace } { full_cpp_name }  
862877                    cpp_name_w_templates  =  f"{ cls_namespace } { cpp_name_w_templates }  
863878                    dep_cpp_name  =  f"{ cls_namespace } { dep_cpp_name }  
864879
865-             base_identifier  =  cpp_name .translate (_qualname_trans )
880+             base_identifier  =  full_cpp_name .translate (_qualname_trans )
881+ 
882+             if  base_ns :
883+                 base_ns  =  f"{ base_ns }  
866884
867885            bases .append (
868886                BaseClassData (
869-                     full_cpp_name = cpp_name ,
887+                     cls_name = cpp_name ,
888+                     namespace_ = base_ns ,
889+                     full_cpp_name = full_cpp_name ,
870890                    full_cpp_name_w_templates = cpp_name_w_templates ,
871891                    full_cpp_name_identifier = base_identifier ,
872892                    dep_cpp_name = dep_cpp_name ,
@@ -1242,8 +1262,8 @@ def on_class_end(self, state: AWClassBlockState) -> None:
12421262            if  cdata .template_argument_list :
12431263                tmpl  =  f", { cdata .template_argument_list }  
12441264
1245-             trampoline_cfg  =  f"rpygen ::PyTrampolineCfg_{ cdata . cls_cpp_identifier } { cdata .template_argument_list }  
1246-             tname  =  f"rpygen ::PyTrampoline_{ cdata . cls_cpp_identifier } { ctx .full_cpp_name } { tmpl } { trampoline_cfg }  
1265+             trampoline_cfg  =  f"{ ctx . namespace } { ctx . cpp_name } { cdata .template_argument_list }  
1266+             tname  =  f"{ ctx . namespace } { ctx . cpp_name } { ctx .full_cpp_name } { tmpl } { trampoline_cfg }  
12471267            tvar  =  f"{ ctx .cpp_name }  
12481268
12491269            ctx .trampoline  =  TrampolineData (
0 commit comments