void CollectGeneric(INamedTypeSymbol type) { var 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?") { CollectCore(type.TypeArguments[0]); if (!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), Namespace = type.ContainingNamespace.IsGlobalNamespace ? null : type.ContainingNamespace.ToDisplayString() }; collectedGenericInfo.Add(info); } return; } if (knownGenericTypes.TryGetValue(genericTypeString, out var formatter)) { 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), Namespace = type.ContainingNamespace.IsGlobalNamespace ? null : type.ContainingNamespace.ToDisplayString(), }; collectedGenericInfo.Add(info); if (genericTypeString == "System.Linq.ILookup<,>") { formatter = knownGenericTypes["System.Linq.IGrouping<,>"]; f = formatter.Replace("TREPLACE", typeArgs); var groupingInfo = new GenericSerializationInfo { FormatterName = f, FullName = $"global::System.Linq.IGrouping<{typeArgs}>", Namespace = type.ContainingNamespace.IsGlobalNamespace ? null : type.ContainingNamespace.ToDisplayString(), }; collectedGenericInfo.Add(groupingInfo); } } }
void CollectArray(IArrayTypeSymbol array) { var elemType = array.ElementType; CollectCore(elemType); var info = new GenericSerializationInfo { FormatterName = $"global::MessagePack.Formatters.ArrayFormatter<{elemType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>", FullName = array.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), }; collectedGenericInfo.Add(info); return; }
void CollectArray(IArrayTypeSymbol array) { var elemType = array.ElementType; 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.TwoDimentionalArrayFormatter<{elemType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>"; } else if (array.Rank == 3) { info.FormatterName = $"global::MessagePack.Formatters.ThreeDimentionalArrayFormatter<{elemType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>"; } else if (array.Rank == 4) { info.FormatterName = $"global::MessagePack.Formatters.FourDimentionalArrayFormatter<{elemType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>"; } else { throw new InvalidOperationException("does not supports array dimention, " + info.FullName); } 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); } } }