private void CollectArray(IArrayTypeSymbol array) { ITypeSymbol elemType = array.ElementType; this.CollectCore(elemType); var info = new GenericSerializationInfo { FullName = array.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), }; if (array.IsSZArray) { info.FormatterName = $"global::MessagePack.Formatters.ArrayFormatter<{elemType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>"; } else if (array.Rank == 2) { info.FormatterName = $"global::MessagePack.Formatters.TwoDimensionalArrayFormatter<{elemType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>"; } else if (array.Rank == 3) { info.FormatterName = $"global::MessagePack.Formatters.ThreeDimensionalArrayFormatter<{elemType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>"; } else if (array.Rank == 4) { info.FormatterName = $"global::MessagePack.Formatters.FourDimensionalArrayFormatter<{elemType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>"; } else { throw new InvalidOperationException("does not supports array dimension, " + info.FullName); } this.collectedGenericInfo.Add(info); return; }
private void CollectGeneric(INamedTypeSymbol type) { INamedTypeSymbol genericType = type.ConstructUnboundGenericType(); var genericTypeString = genericType.ToDisplayString(); var fullName = type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); // special case if (fullName == "global::System.ArraySegment<byte>" || fullName == "global::System.ArraySegment<byte>?") { return; } // nullable if (genericTypeString == "T?") { this.CollectCore(type.TypeArguments[0]); if (!this.embeddedTypes.Contains(type.TypeArguments[0].ToString())) { var info = new GenericSerializationInfo { FormatterName = $"global::MessagePack.Formatters.NullableFormatter<{type.TypeArguments[0].ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>", FullName = type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), }; this.collectedGenericInfo.Add(info); } return; } // collection if (this.knownGenericTypes.TryGetValue(genericTypeString, out var formatter)) { foreach (ITypeSymbol item in type.TypeArguments) { this.CollectCore(item); } var typeArgs = string.Join(", ", type.TypeArguments.Select(x => x.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat))); var f = formatter.Replace("TREPLACE", typeArgs); var info = new GenericSerializationInfo { FormatterName = f, FullName = type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), }; this.collectedGenericInfo.Add(info); if (genericTypeString == "System.Linq.ILookup<,>") { formatter = this.knownGenericTypes["System.Linq.IGrouping<,>"]; f = formatter.Replace("TREPLACE", typeArgs); var groupingInfo = new GenericSerializationInfo { FormatterName = f, FullName = $"global::System.Linq.IGrouping<{typeArgs}>", }; this.collectedGenericInfo.Add(groupingInfo); formatter = this.knownGenericTypes["System.Collections.Generic.IEnumerable<>"]; typeArgs = type.TypeArguments[1].ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); f = formatter.Replace("TREPLACE", typeArgs); var enumerableInfo = new GenericSerializationInfo { FormatterName = f, FullName = $"global::System.Collections.Generic.IEnumerable<{typeArgs}>", }; this.collectedGenericInfo.Add(enumerableInfo); } } }