public void Execute(GeneratorExecutionContext context)
        {
            if (!(context.SyntaxReceiver is SyntaxReceiver receiver))
            {
                return;
            }
            //System.Diagnostics.Debugger.Launch();
            if (receiver.Candidates.Count == 0)
            {
                return;
            }
            _context = context;

            ProcessCandidates(receiver.Candidates);
            context.AddSource($"{Basics.GlobalSerializationHelperGeneratedString}.cs", SourceText.From(GenerateGlobalHelperStaticClass(), Encoding.UTF8));
            foreach (var item in meta)
            {
                if (!TypeMap.SimpleOperations.ContainsKey(item.ClassSymbol.Name))
                {
                    TypeMap.SimpleOperations.Add(item.ClassSymbol.Name, new GeneratedSerializerRW(item.ClassSymbol));
                }
            }
            foreach (var item in meta)
            {
                var source = BsonSyntaxGenerator.Create(item)?.NormalizeWhitespace().ToFullString();

                context.AddSource(Basics.GenerateSerializerName(item.ClassSymbol), SourceText.From(source, Encoding.UTF8));
                System.Diagnostics.Debugger.Break();
            }
        }
Beispiel #2
0
        public override ClassDeclarationSyntax Generate()
        {
            var decl = SF.ClassDeclaration(Basics.GenerateSerializerName(ClassSymbol));

            decl = decl.WithTypeParameterList(GetTypeParametersList());
            return(decl.WithBaseList(SF.BaseList(GetBaseList()))
                   .WithMembers(GenerateStaticNamesSpans())
                   .AddMembers(DeclareTryParseMethod()));
        }
        public string GenerateGlobalHelperStaticClass()
        {
            StringBuilder builder = new StringBuilder();

            builder.Append($@"
                using MongoDB.Client.Bson.Reader;
                using MongoDB.Client.Bson.Serialization;
                using System;
                using System.Collections.Generic;
                using System.Runtime.CompilerServices;

                namespace MongoDB.Client.Bson.Serialization.Generated{{
                    public static class {Basics.GlobalSerializationHelperGeneratedString}{{
                        {GenerateFields()}
                        {GenerateGetSeriazlizersMethod()}

                        [ModuleInitializerAttribute]
                        public static void MapInit()
                        {{
                            SerializersMap.RegisterSerializers(GetGeneratedSerializers()) ;
                        }}
                    }}
                }}");
            return(builder.ToString());

            string GenerateFields()
            {
                var builder = new StringBuilder();

                foreach (var info in meta)
                {
                    builder.Append($"\n\t\tpublic static readonly  IGenericBsonSerializer<{info.ClassSymbol.ToString()}>  {Basics.GenerateSerializerNameStaticField(info.ClassSymbol)} = new {Basics.GenerateSerializerName(info.ClassSymbol)}();");
                }
                return(builder.ToString());
            }

            string GenerateGetSeriazlizersMethod()
            {
                StringBuilder builder = new StringBuilder();

                builder.Append($@"
                public static KeyValuePair<Type, IBsonSerializer>[]  GetGeneratedSerializers()
                {{
                    var pairs = new KeyValuePair<Type, IBsonSerializer>[{meta.Count}];                    
                ");
                int index = 0;

                foreach (var decl in meta)
                {
                    builder.Append($@"
                    pairs[{index}] = KeyValuePair.Create<Type, IBsonSerializer>(typeof({decl.ClassSymbol.ToString()}), {Basics.GenerateSerializerNameStaticField(decl.ClassSymbol)});
                    ");
                    index++;
                }
                builder.Append(@"
                    return pairs;
                }
                ");
                return(builder.ToString());
            }
        }