// internal for testing
        internal static IReadOnlyDictionary <AnonymousTypeKey, AnonymousTypeValue> GetAnonymousTypeMapFromMetadata(MetadataReader reader, MetadataDecoder metadataDecoder)
        {
            var result = new Dictionary <AnonymousTypeKey, AnonymousTypeValue>();

            foreach (var handle in reader.TypeDefinitions)
            {
                var def = reader.GetTypeDefinition(handle);
                if (!def.Namespace.IsNil)
                {
                    continue;
                }
                if (!reader.StringComparer.StartsWith(def.Name, GeneratedNames.AnonymousNamePrefix))
                {
                    continue;
                }
                var   metadataName = reader.GetString(def.Name);
                short arity;
                var   name = MetadataHelpers.InferTypeArityAndUnmangleMetadataName(metadataName, out arity);
                int   index;
                if (GeneratedNames.TryParseAnonymousTypeTemplateName(name, out index))
                {
                    var builder = ArrayBuilder <AnonymousTypeKeyField> .GetInstance();

                    if (TryGetAnonymousTypeKey(reader, def, builder))
                    {
                        var type  = (NamedTypeSymbol)metadataDecoder.GetTypeOfToken(handle);
                        var key   = new AnonymousTypeKey(builder.ToImmutable());
                        var value = new AnonymousTypeValue(name, index, type.GetCciAdapter());
                        result.Add(key, value);
                    }
                    builder.Free();
                }
            }
            return(result);
        }