@@ -16,8 +16,8 @@ private readonly Regex genericNameRegEx
1616 private InterfaceNode InterfaceNode { get ; }
1717 = new InterfaceNode ( ) ;
1818
19- private HashSet < TypeDefinition > InterfacesBeingAdded { get ; }
20- = new HashSet < TypeDefinition > ( ) ;
19+ private List < InterfaceNode > InterfaceNodes { get ; }
20+ = new List < InterfaceNode > ( ) ;
2121
2222 public TypeScriptBlock CreateInterfacesBlock ( )
2323 {
@@ -76,10 +76,7 @@ public InterfaceNode AddInterfaceNode(TypeDefinition typeDefinition)
7676 if ( typeDefinition . IsInterface )
7777 return null ;
7878
79- if ( InterfacesBeingAdded . Contains ( typeDefinition ) )
80- return null ;
81-
82- InterfacesBeingAdded . Add ( typeDefinition ) ;
79+ interfaceNode = AddInterfaceNode ( typeDefinition , InterfaceNode ) ;
8380
8481 var baseInterfaceNode = InterfaceNode ;
8582
@@ -97,9 +94,11 @@ public InterfaceNode AddInterfaceNode(TypeDefinition typeDefinition)
9794 var baseClass = typeDefinition . BaseType as TypeDefinition ;
9895 var isBaseClassNotObject = baseClass != null && baseClass . FullName != "System.Object" ;
9996
100- if ( isBaseClassNotObject )
97+ if ( isBaseClassNotObject && baseClass != typeDefinition )
10198 baseInterfaceNode = AddInterfaceNode ( baseClass ) ;
10299 }
100+
101+ interfaceNode = AdjustBaseClass ( interfaceNode , baseInterfaceNode ) ;
103102
104103 var things = GetMembers ( typeDefinition )
105104 . Where ( m => ! m . CSharpType . IsGenericParameter ) ;
@@ -122,7 +121,7 @@ public InterfaceNode AddInterfaceNode(TypeDefinition typeDefinition)
122121 }
123122 }
124123
125- return AddInterfaceNode ( typeDefinition , baseInterfaceNode ) ;
124+ return interfaceNode ;
126125 }
127126
128127 private void WriteInterfaces ( TypeScriptBlock interfacesBlock , InterfaceNode interfaceNode )
@@ -209,6 +208,9 @@ private void WriteInterfaces(TypeScriptBlock interfacesBlock, InterfaceNode inte
209208 var thingType = thing . CSharpType . TypeDefinition ;
210209 var typeScriptType = TypeService . GetTypeScriptType ( thingType , thing . Name ) ;
211210
211+ if ( thingType . IsInterface )
212+ continue ;
213+
212214 interfaceName = typeScriptType . InterfaceName ;
213215 typeName = typeScriptType . TypeName ;
214216 }
@@ -219,6 +221,10 @@ private void WriteInterfaces(TypeScriptBlock interfacesBlock, InterfaceNode inte
219221
220222 var collectionString = thing . CSharpType . IsCollection ? "[]" : string . Empty ;
221223
224+ // todo-balki sigh
225+ if ( thingName == "constructor" )
226+ thingName = "_constructor" ;
227+
222228 interfaceBlock
223229 . AddStatement ( $ "{ thingName } : { interfaceName } { collectionString } ;") ;
224230
@@ -267,7 +273,7 @@ private List<MemberWithCSharpType> GetMembers(TypeDefinition typeDefinition)
267273 } ) ;
268274
269275 var properties = typeDefinition . Properties
270- . Where ( p => p . GetMethod . IsPublic && ! p . IsSpecialName )
276+ . Where ( p => p . GetMethod != null && p . GetMethod . IsPublic && ! p . IsSpecialName )
271277 . Select ( p => new MemberWithCSharpType
272278 {
273279 Name = p . Name ,
@@ -308,9 +314,23 @@ private InterfaceNode AddInterfaceNode(TypeDefinition typeDefinition, InterfaceN
308314 baseInterfaceNode . DerivedInterfaces
309315 . Add ( derivedInterfaceNode ) ;
310316
311- InterfacesBeingAdded . Remove ( typeDefinition ) ;
312-
313317 return derivedInterfaceNode ;
314318 }
319+
320+ private InterfaceNode AdjustBaseClass ( InterfaceNode interfaceNode , InterfaceNode baseInterfaceNode )
321+ {
322+ interfaceNode
323+ . BaseInterface
324+ . DerivedInterfaces
325+ . Remove ( interfaceNode ) ;
326+
327+ interfaceNode . BaseInterface = baseInterfaceNode ;
328+
329+ baseInterfaceNode
330+ . DerivedInterfaces
331+ . Add ( interfaceNode ) ;
332+
333+ return interfaceNode ;
334+ }
315335 }
316336}
0 commit comments