public CSharpType(string name, Type nativeType, CSharpObject solutionType, IReadOnlyList <CSharpType> genericArguments) { this.Name = name; this.NativeType = nativeType; this.SolutionType = solutionType; this.GenericArguments = genericArguments; }
private CSharpType Resolve(string typeName) { var chars = typeName.ToCharArray(); var index = 0; var buffer = new List <char>(); var generic = 0; var genericName = typeName; var genericArguments = new List <CSharpType>(); if (typeName.EndsWith("[]")) { genericName = "Array"; var genericArgument = Resolve(typeName.Remove(typeName.Length - 2)); genericArguments.Add(genericArgument); } else if (typeName.EndsWith("?")) { genericName = "Nullable"; var genericArgument = Resolve(typeName.Remove(typeName.Length - 1)); genericArguments.Add(genericArgument); } else { for (; index < chars.Length; index++) { var c = chars[index]; switch (c) { case '<': { generic++; if (generic > 1) { buffer.Add(c); } else { genericName = new String(buffer.ToArray()); buffer.Clear(); } break; } case ',': { if (generic == 1) { var genericArgumentString = new String(buffer.ToArray()); var genericArgument = Resolve(genericArgumentString); genericArguments.Add(genericArgument); buffer.Clear(); } else { buffer.Add(c); } break; } case '>': { if (generic == 0) { throw new Exception(); } generic--; if (generic > 0) { buffer.Add(c); } else { var genericArgumentString = new String(buffer.ToArray()); var genericArgument = Resolve(genericArgumentString); genericArguments.Add(genericArgument); buffer.Clear(); } break; } default: { buffer.Add(c); break; } } } } if (genericArguments.Count > 0) { genericName = $"{genericName}`{genericArguments.Count}"; } var nativeType = Type.GetType(genericName); if (nativeType == null) { nativeType = GetSystemType(genericName); } if (nativeType == null) { foreach (var use in usings) { nativeType = Type.GetType($"{use}.{genericName}"); if (nativeType != null) { break; } } } CSharpObject solutionType = null; if (nativeType == null) { foreach (var item in solution.Classes.Concat(solution.Structs).Concat(solution.Interfaces).Concat(solution.Enums).Concat(solution.Delegates)) { if (ns.ToString() == item.Namespace?.ToString() || usings.Any(x => x.ToString() == item.Namespace?.ToString())) { if (item.Name == genericName) { solutionType = item; break; } } } } var csType = new CSharpType(genericName, nativeType, solutionType, genericArguments); return(csType); }