@@ -682,20 +682,23 @@ class TypedDictProperty implements PythonBase {
682682interface ClassOpts extends PythonTypeOpts {
683683 abstract ?: boolean ;
684684 interfaces ?: spec . NamedTypeReference [ ] ;
685+ abstractBases ?: spec . ClassType [ ] ;
685686}
686687
687688class Class extends BasePythonClassType {
688689
689690 private abstract : boolean ;
691+ private abstractBases : spec . ClassType [ ] ;
690692 private interfaces : spec . NamedTypeReference [ ] ;
691693
692694 constructor ( name : string , fqn : string , opts : ClassOpts ) {
693695 super ( name , fqn , opts ) ;
694696
695- const { abstract = false , interfaces = [ ] } = opts ;
697+ const { abstract = false , interfaces = [ ] , abstractBases = [ ] } = opts ;
696698
697699 this . abstract = abstract ;
698700 this . interfaces = interfaces ;
701+ this . abstractBases = abstractBases ;
699702 }
700703
701704 public dependsOn ( resolver : TypeResolver ) : PythonType [ ] {
@@ -744,7 +747,13 @@ class Class extends BasePythonClassType {
744747 // abstract, and subclassing our initial class.
745748 if ( this . abstract ) {
746749 resolver = this . fqn ? resolver . bind ( this . fqn ) : resolver ;
747- code . openBlock ( `class ${ this . getProxyClassName ( ) } (${ this . name } )` ) ;
750+
751+ const proxyBases : string [ ] = [ this . name ] ;
752+ for ( const base of this . abstractBases ) {
753+ proxyBases . push ( `jsii.proxy_for(${ resolver . resolve ( base ) } )` ) ;
754+ }
755+
756+ code . openBlock ( `class ${ this . getProxyClassName ( ) } (${ proxyBases . join ( ', ' ) } )` ) ;
748757
749758 // Filter our list of members to *only* be abstract members, and not any
750759 // other types.
@@ -1372,7 +1381,8 @@ class PythonGenerator extends Generator {
13721381 const klass = new Class (
13731382 toPythonIdentifier ( cls . name ) ,
13741383 cls . fqn ,
1375- { abstract, bases : cls . base !== undefined ? [ cls . base ] : [ ] , interfaces : cls . interfaces }
1384+ { abstract, bases : cls . base !== undefined ? [ cls . base ] : [ ] , interfaces : cls . interfaces ,
1385+ abstractBases : abstract ? this . getAbstractBases ( cls ) : [ ] }
13761386 ) ;
13771387
13781388 if ( cls . initializer !== undefined ) {
@@ -1580,4 +1590,22 @@ class PythonGenerator extends Generator {
15801590
15811591 return undefined ;
15821592 }
1593+
1594+ private getAbstractBases ( cls : spec . ClassType ) : spec . ClassType [ ] {
1595+ const abstractBases : spec . ClassType [ ] = [ ] ;
1596+
1597+ if ( cls . base !== undefined ) {
1598+ const base = this . findType ( cls . base . fqn ) ;
1599+
1600+ if ( ! spec . isClassType ( base ) ) {
1601+ throw new Error ( "Class inheritence that isn't a class?" ) ;
1602+ }
1603+
1604+ if ( base . abstract ) {
1605+ abstractBases . push ( base ) ;
1606+ }
1607+ }
1608+
1609+ return abstractBases ;
1610+ }
15831611}
0 commit comments