Skip to content

Commit dfb5d0a

Browse files
committed
Properly handle interfaces being added. Now creates stub before realigning it to the proper base node
1 parent 22d2912 commit dfb5d0a

File tree

1 file changed

+31
-11
lines changed

1 file changed

+31
-11
lines changed

src/WebApiToTypeScript/Interfaces/InterfaceService.cs

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)