|
1 |
| -using Mono.Cecil; |
2 |
| -using System.Collections.Generic; |
| 1 | +using System.Collections.Generic; |
3 | 2 | using System.Diagnostics;
|
4 | 3 | using System.Linq;
|
5 | 4 | using System.Text.RegularExpressions;
|
| 5 | +using Mono.Cecil; |
6 | 6 | using WebApiToTypeScript.Block;
|
7 | 7 | using WebApiToTypeScript.Types;
|
8 | 8 |
|
@@ -97,7 +97,7 @@ public InterfaceNode AddInterfaceNode(TypeDefinition typeDefinition)
|
97 | 97 | if (isBaseClassNotObject && baseClass != typeDefinition)
|
98 | 98 | baseInterfaceNode = AddInterfaceNode(baseClass);
|
99 | 99 | }
|
100 |
| - |
| 100 | + |
101 | 101 | interfaceNode = AdjustBaseClass(interfaceNode, baseInterfaceNode);
|
102 | 102 |
|
103 | 103 | var things = GetMembers(typeDefinition)
|
@@ -130,120 +130,133 @@ private void WriteInterfaces(TypeScriptBlock interfacesBlock, InterfaceNode inte
|
130 | 130 |
|
131 | 131 | if (typeDefinition != null)
|
132 | 132 | {
|
133 |
| - string implementsString = null; |
134 |
| - string extendsString = null; |
| 133 | + WriteInterfaceNode(interfacesBlock, interfaceNode); |
| 134 | + } |
135 | 135 |
|
136 |
| - var iHaveGenericParameters = typeDefinition.HasGenericParameters; |
137 |
| - if (iHaveGenericParameters) |
138 |
| - { |
139 |
| - var genericParameters = typeDefinition.GenericParameters |
140 |
| - .Select(p => p.Name); |
| 136 | + foreach (var derivedInterfaceNode in interfaceNode.DerivedInterfaces) |
| 137 | + WriteInterfaces(interfacesBlock, derivedInterfaceNode); |
| 138 | + } |
141 | 139 |
|
142 |
| - implementsString = WrapInAngledBrackets(string.Join(", ", genericParameters)); |
143 |
| - } |
| 140 | + private void WriteInterfaceNode(TypeScriptBlock interfacesBlock, InterfaceNode interfaceNode) |
| 141 | + { |
| 142 | + var typeDefinition = interfaceNode.TypeDefinition; |
| 143 | + |
| 144 | + string implementsString = null; |
| 145 | + string extendsString = null; |
144 | 146 |
|
145 |
| - var hasBaseClass = interfaceNode.BaseInterface?.TypeDefinition != null; |
146 |
| - var baseTypeName = CleanName(interfaceNode.BaseInterface?.TypeDefinition?.Name); |
| 147 | + var iHaveGenericParameters = typeDefinition.HasGenericParameters; |
| 148 | + if (iHaveGenericParameters) |
| 149 | + { |
| 150 | + var genericParameters = typeDefinition.GenericParameters |
| 151 | + .Select(p => p.Name); |
147 | 152 |
|
148 |
| - if (hasBaseClass) |
| 153 | + implementsString = WrapInAngledBrackets(string.Join(", ", genericParameters)); |
| 154 | + } |
| 155 | + |
| 156 | + var hasBaseClass = interfaceNode.BaseInterface?.TypeDefinition != null; |
| 157 | + var baseTypeName = CleanName(interfaceNode.BaseInterface?.TypeDefinition?.Name); |
| 158 | + |
| 159 | + if (hasBaseClass) |
| 160 | + { |
| 161 | + var iHaveGenericArguments = typeDefinition.BaseType.IsGenericInstance; |
| 162 | + if (iHaveGenericArguments) |
149 | 163 | {
|
150 |
| - var iHaveGenericArguments = typeDefinition.BaseType.IsGenericInstance; |
151 |
| - if (iHaveGenericArguments) |
152 |
| - { |
153 |
| - var baseTypeInstance = typeDefinition.BaseType as GenericInstanceType; |
154 |
| - var genericArguments = baseTypeInstance.GenericArguments |
155 |
| - .Select(p => p.IsGenericParameter |
156 |
| - ? p.Name |
157 |
| - : TypeService.GetTypeScriptType(p.GetElementType(), p.Name).TypeName); |
| 164 | + var baseTypeInstance = typeDefinition.BaseType as GenericInstanceType; |
| 165 | + var genericArguments = baseTypeInstance.GenericArguments |
| 166 | + .Select(p => p.IsGenericParameter |
| 167 | + ? p.Name |
| 168 | + : TypeService.GetTypeScriptType(p.GetElementType(), p.Name).TypeName); |
158 | 169 |
|
159 |
| - extendsString = WrapInAngledBrackets(string.Join(", ", genericArguments)); |
160 |
| - } |
| 170 | + extendsString = WrapInAngledBrackets(string.Join(", ", genericArguments)); |
| 171 | + } |
161 | 172 |
|
162 |
| - var baseTypeHasGenericParameters = typeDefinition.BaseType.HasGenericParameters; |
163 |
| - if (baseTypeHasGenericParameters) |
164 |
| - { |
165 |
| - var genericParameters = typeDefinition.BaseType.GenericParameters |
166 |
| - .Select(p => p.Name); |
| 173 | + var baseTypeHasGenericParameters = typeDefinition.BaseType.HasGenericParameters; |
| 174 | + if (baseTypeHasGenericParameters) |
| 175 | + { |
| 176 | + var genericParameters = typeDefinition.BaseType.GenericParameters |
| 177 | + .Select(p => p.Name); |
167 | 178 |
|
168 |
| - extendsString = WrapInAngledBrackets(string.Join(", ", genericParameters)); |
169 |
| - } |
| 179 | + extendsString = WrapInAngledBrackets(string.Join(", ", genericParameters)); |
170 | 180 | }
|
| 181 | + } |
171 | 182 |
|
172 |
| - var interfaceExtendsString = hasBaseClass |
173 |
| - ? $" extends I{baseTypeName}{extendsString}" |
174 |
| - : string.Empty; |
| 183 | + var interfaceExtendsString = hasBaseClass |
| 184 | + ? $" extends I{baseTypeName}{extendsString}" |
| 185 | + : string.Empty; |
175 | 186 |
|
176 |
| - var classExtendsString = hasBaseClass |
177 |
| - ? $" extends {baseTypeName}{extendsString}" |
178 |
| - : string.Empty; |
| 187 | + var classExtendsString = hasBaseClass |
| 188 | + ? $" extends {baseTypeName}{extendsString}" |
| 189 | + : string.Empty; |
179 | 190 |
|
180 |
| - var blockTypeName = CleanName(typeDefinition.Name); |
| 191 | + var blockTypeName = CleanName(typeDefinition.Name); |
181 | 192 |
|
182 |
| - var classImplementsString = |
183 |
| - $" implements I{blockTypeName}{implementsString}, {Config.EndpointsNamespace}.{nameof(IHaveQueryParams)}"; |
| 193 | + if (!TypeService.IsValidTypeName(blockTypeName)) |
| 194 | + { |
| 195 | + LogMessage($"Interface name [{blockTypeName}] of type [{typeDefinition.FullName}] is invalid!"); |
| 196 | + return; |
| 197 | + } |
184 | 198 |
|
185 |
| - var parameterOrInstanceString = iHaveGenericParameters |
186 |
| - ? implementsString |
187 |
| - : string.Empty; |
| 199 | + var classImplementsString = |
| 200 | + $" implements I{blockTypeName}{implementsString}, {Config.EndpointsNamespace}.{nameof(IHaveQueryParams)}"; |
188 | 201 |
|
189 |
| - var interfaceBlock = interfacesBlock |
190 |
| - .AddAndUseBlock($"export interface I{blockTypeName}{parameterOrInstanceString}{interfaceExtendsString}"); |
| 202 | + var parameterOrInstanceString = iHaveGenericParameters |
| 203 | + ? implementsString |
| 204 | + : string.Empty; |
191 | 205 |
|
192 |
| - var classBlock = interfacesBlock |
193 |
| - .AddAndUseBlock($"export class {blockTypeName}{parameterOrInstanceString}{classExtendsString}{classImplementsString}"); |
| 206 | + var interfaceBlock = interfacesBlock |
| 207 | + .AddAndUseBlock($"export interface I{blockTypeName}{parameterOrInstanceString}{interfaceExtendsString}"); |
194 | 208 |
|
195 |
| - var things = GetMembers(typeDefinition); |
| 209 | + var classBlock = interfacesBlock |
| 210 | + .AddAndUseBlock($"export class {blockTypeName}{parameterOrInstanceString}{classExtendsString}{classImplementsString}"); |
196 | 211 |
|
197 |
| - foreach (var thing in things) |
198 |
| - { |
199 |
| - var interfaceName = string.Empty; |
200 |
| - var typeName = string.Empty; |
| 212 | + var things = GetMembers(typeDefinition); |
201 | 213 |
|
202 |
| - if (thing.CSharpType.IsGenericParameter) |
203 |
| - { |
204 |
| - typeName = interfaceName = thing.CSharpType.GenericParameterName; |
205 |
| - } |
206 |
| - else |
207 |
| - { |
208 |
| - var thingType = thing.CSharpType.TypeDefinition; |
209 |
| - var typeScriptType = TypeService.GetTypeScriptType(thingType, thing.Name); |
| 214 | + foreach (var thing in things) |
| 215 | + { |
| 216 | + var interfaceName = string.Empty; |
| 217 | + var typeName = string.Empty; |
210 | 218 |
|
211 |
| - if (thingType.IsInterface) |
212 |
| - continue; |
| 219 | + if (thing.CSharpType.IsGenericParameter) |
| 220 | + { |
| 221 | + typeName = interfaceName = thing.CSharpType.GenericParameterName; |
| 222 | + } |
| 223 | + else |
| 224 | + { |
| 225 | + var thingType = thing.CSharpType.TypeDefinition; |
| 226 | + var typeScriptType = TypeService.GetTypeScriptType(thingType, thing.Name); |
213 | 227 |
|
214 |
| - interfaceName = typeScriptType.InterfaceName; |
215 |
| - typeName = typeScriptType.TypeName; |
216 |
| - } |
| 228 | + if (thingType.IsInterface) |
| 229 | + continue; |
217 | 230 |
|
218 |
| - var thingName = Config.InterfaceMembersInCamelCase |
219 |
| - ? Helpers.ToCamelCaseFromPascalCase(thing.Name) |
220 |
| - : thing.Name; |
| 231 | + interfaceName = typeScriptType.InterfaceName; |
| 232 | + typeName = typeScriptType.TypeName; |
| 233 | + } |
221 | 234 |
|
222 |
| - var collectionString = thing.CSharpType.IsCollection ? "[]" : string.Empty; |
| 235 | + var thingName = Config.InterfaceMembersInCamelCase |
| 236 | + ? Helpers.ToCamelCaseFromPascalCase(thing.Name) |
| 237 | + : thing.Name; |
223 | 238 |
|
224 |
| - thingName = TypeService.FixIfReservedWord(thingName); |
| 239 | + var collectionString = thing.CSharpType.IsCollection ? "[]" : string.Empty; |
225 | 240 |
|
226 |
| - interfaceBlock |
227 |
| - .AddStatement($"{thingName}: {interfaceName}{collectionString};"); |
| 241 | + thingName = TypeService.FixIfReservedWord(thingName); |
228 | 242 |
|
229 |
| - classBlock |
230 |
| - .AddStatement($"{thingName}: {typeName}{collectionString};"); |
231 |
| - } |
| 243 | + interfaceBlock |
| 244 | + .AddStatement($"{thingName}: {interfaceName}{collectionString};"); |
232 | 245 |
|
233 |
| - if (hasBaseClass) |
234 |
| - { |
235 |
| - classBlock |
236 |
| - .AddAndUseBlock("constructor()") |
237 |
| - .AddStatement("super();"); |
238 |
| - } |
| 246 | + classBlock |
| 247 | + .AddStatement($"{thingName}: {typeName}{collectionString};"); |
| 248 | + } |
239 | 249 |
|
| 250 | + if (hasBaseClass) |
| 251 | + { |
240 | 252 | classBlock
|
241 |
| - .AddAndUseBlock("getQueryParams()") |
242 |
| - .AddStatement("return this;"); |
| 253 | + .AddAndUseBlock("constructor()") |
| 254 | + .AddStatement("super();"); |
243 | 255 | }
|
244 | 256 |
|
245 |
| - foreach (var derivedInterfaceNode in interfaceNode.DerivedInterfaces) |
246 |
| - WriteInterfaces(interfacesBlock, derivedInterfaceNode); |
| 257 | + classBlock |
| 258 | + .AddAndUseBlock("getQueryParams()") |
| 259 | + .AddStatement("return this;"); |
247 | 260 | }
|
248 | 261 |
|
249 | 262 | private string CleanName(string dirtyName)
|
|
0 commit comments