@@ -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 , typing .List [str ]]:
195197 all_parts = []
196198 nameonly_parts = []
197199
@@ -209,10 +211,12 @@ 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 = []
@@ -221,6 +225,7 @@ def _fmt_base_name(typename: PQName) -> typing.Tuple[str, str, str, typing.List[
221225 "::" .join (most_parts ),
222226 "::" .join (all_parts ),
223227 "::" .join (nameonly_parts ),
228+ "::" .join (ns_parts ),
224229 tparam_list ,
225230 )
226231
@@ -824,8 +829,8 @@ def _process_class_bases(
824829 if base .access == "private" :
825830 continue
826831
827- cpp_name , cpp_name_w_templates , dep_cpp_name , tparam_list = _fmt_base_name (
828- base .typename
832+ cpp_name , cpp_name_w_templates , dep_cpp_name , base_ns , tparam_list = (
833+ _fmt_base_name ( base .typename )
829834 )
830835 if ignored_bases .pop (cpp_name_w_templates , None ):
831836 continue
@@ -846,6 +851,11 @@ def _process_class_bases(
846851 cpp_name = user_bqual [:tp ]
847852 template_params = user_bqual [tp + 1 : - 1 ]
848853 dep_cpp_name = cpp_name
854+ ns_idx = cpp_name .rfind ("::" )
855+ if ns_idx == - 1 :
856+ base_ns = ""
857+ else :
858+ base_ns = cpp_name [:ns_idx ]
849859 else :
850860 # TODO: we don't handle nested child classes with templates here
851861 # ... but that has to be rather obscure?
@@ -858,17 +868,22 @@ def _process_class_bases(
858868 # If no explicit namespace specified, we assume base classes
859869 # live in the same namespace as the class
860870 if len (base .typename .segments ) == 1 :
871+ base_ns = cls_namespace
861872 cpp_name = f"{ cls_namespace } ::{ cpp_name } "
862873 cpp_name_w_templates = f"{ cls_namespace } ::{ cpp_name_w_templates } "
863874 dep_cpp_name = f"{ cls_namespace } ::{ dep_cpp_name } "
864875
865876 base_identifier = cpp_name .translate (_qualname_trans )
866877
878+ if base_ns :
879+ base_ns = f"{ base_ns } ::"
880+
867881 bases .append (
868882 BaseClassData (
869883 full_cpp_name = cpp_name ,
870884 full_cpp_name_w_templates = cpp_name_w_templates ,
871885 full_cpp_name_identifier = base_identifier ,
886+ namespace_ = base_ns ,
872887 dep_cpp_name = dep_cpp_name ,
873888 template_params = template_params ,
874889 )
@@ -1242,8 +1257,8 @@ def on_class_end(self, state: AWClassBlockState) -> None:
12421257 if cdata .template_argument_list :
12431258 tmpl = f", { cdata .template_argument_list } "
12441259
1245- trampoline_cfg = f"rpygen ::PyTrampolineCfg_{ cdata .cls_cpp_identifier } <{ cdata .template_argument_list } >"
1246- tname = f"rpygen ::PyTrampoline_{ cdata .cls_cpp_identifier } <typename { ctx .full_cpp_name } { tmpl } , typename { trampoline_cfg } >"
1260+ trampoline_cfg = f"{ cdata . ctx . namespace } ::PyTrampolineCfg_{ cdata .cls_cpp_identifier } <{ cdata .template_argument_list } >"
1261+ tname = f"{ cdata . ctx . namespace } ::PyTrampoline_{ cdata .cls_cpp_identifier } <typename { ctx .full_cpp_name } { tmpl } , typename { trampoline_cfg } >"
12471262 tvar = f"{ ctx .cpp_name } _Trampoline"
12481263
12491264 ctx .trampoline = TrampolineData (
0 commit comments