public CodegenClass Forge(
            bool includeDebugSymbols,
            bool fireAndForget)
        {
            var makeVirtual = (_desc.OptionalSupertype == null);

            var classScope = new CodegenClassScope(includeDebugSymbols, _namespaceScope, _className);

            // make members
            var members = new List <CodegenTypedParam>();

            // --------------------------------------------------------------------------------
            // Constructor
            // --------------------------------------------------------------------------------

            var ctorParams = new CodegenTypedParam[] {};
            var ctor       = new CodegenCtor(typeof(StmtClassForgeableRSPFactoryProvider), classScope, ctorParams);

            // --------------------------------------------------------------------------------
            // Deserialize(JsonElement)
            // --------------------------------------------------------------------------------
            var deserializeMethod = CodegenMethod
                                    //.MakeParentNode(_underlyingClassName, GetType(), CodegenSymbolProviderEmpty.INSTANCE, classScope)
                                    .MakeParentNode(typeof(object), GetType(), CodegenSymbolProviderEmpty.INSTANCE, classScope)
                                    .AddParam(typeof(JsonElement), JsonDeserializeRefs.INSTANCE.ElementName);

            deserializeMethod = MakeDeserialize(deserializeMethod, classScope, makeVirtual);

            // --------------------------------------------------------------------------------
            // Properties (property)
            // --------------------------------------------------------------------------------

            var propertiesProp = CodegenProperty
                                 .MakePropertyNode(typeof(ILookup <string, IJsonDeserializer>), GetType(), CodegenSymbolProviderEmpty.INSTANCE, classScope);

            propertiesProp = makeVirtual
                                ? propertiesProp.WithVirtual()
                                : propertiesProp.WithOverride();

            propertiesProp.GetterBlock.BlockReturn(ConstantNull());             // TBD

            // --------------------------------------------------------------------------------

            var properties = new CodegenClassProperties();

            // walk methods
            var methods = new CodegenClassMethods();

            //CodegenStackGenerator.RecursiveBuildStack(getResultMethod, "GetResult", methods, properties);
            CodegenStackGenerator.RecursiveBuildStack(deserializeMethod, "Deserialize", methods, properties);
            CodegenStackGenerator.RecursiveBuildStack(propertiesProp, "Properties", methods, properties);

            var clazz = new CodegenClass(
                _classType,
                _className,
                classScope,
                members,
                ctor,
                methods,
                properties,
                EmptyList <CodegenInnerClass> .Instance);

            if (_desc.OptionalSupertype == null)
            {
                clazz.BaseList.AssignType(typeof(JsonCompositeDeserializer));
            }
            else
            {
                clazz.BaseList.AssignBaseType(_desc.OptionalSupertype.Detail.DeserializerClassName);
            }

            return(clazz);
        }
示例#2
0
        private static string MakeFAFProvider(
            string queryMethodProviderClassName,
            string classPostfix,
            ModuleCompileTimeServices compileTimeServices,
            out Assembly assembly)
        {
            var statementFieldsClassName = CodeGenerationIDGenerator.GenerateClassNameSimple(
                typeof(StatementFields), classPostfix);
            var namespaceScope = new CodegenNamespaceScope(
                compileTimeServices.Namespace, statementFieldsClassName, compileTimeServices.IsInstrumented());
            var fafProviderClassName =
                CodeGenerationIDGenerator.GenerateClassNameSimple(typeof(FAFProvider), classPostfix);
            var classScope = new CodegenClassScope(true, namespaceScope, fafProviderClassName);
            var methods = new CodegenClassMethods();
            var properties = new CodegenClassProperties();

            // --------------------------------------------------------------------------------
            // Add statementFields
            // --------------------------------------------------------------------------------

            var ctor = new CodegenCtor(
                typeof(CompilerHelperFAFProvider),
                classScope,
                new List<CodegenTypedParam>());

            ctor.Block.AssignRef(Ref("statementFields"), NewInstanceInner(statementFieldsClassName));

            // initialize-event-types
            var initializeEventTypesMethod = MakeInitEventTypes(classScope, compileTimeServices);

            // initialize-query
            var initializeQueryMethod = CodegenMethod
                .MakeMethod(
                    typeof(void),
                    typeof(EPCompilerImpl),
                    CodegenSymbolProviderEmpty.INSTANCE,
                    classScope)
                .AddParam(
                    typeof(EPStatementInitServices),
                    EPStatementInitServicesConstants.REF.Ref);
            initializeQueryMethod.Block.AssignMember(
                MEMBERNAME_QUERY_METHOD_PROVIDER,
                NewInstanceInner(queryMethodProviderClassName, EPStatementInitServicesConstants.REF, Ref("statementFields")));

            // get-execute
            var queryMethodProviderProperty = CodegenProperty.MakePropertyNode(
                typeof(FAFQueryMethodProvider),
                typeof(EPCompilerImpl),
                CodegenSymbolProviderEmpty.INSTANCE,
                classScope);
            queryMethodProviderProperty.GetterBlock.BlockReturn(Ref(MEMBERNAME_QUERY_METHOD_PROVIDER));

            // provide module dependencies
            var moduleDependenciesProperty = CodegenProperty.MakePropertyNode(
                typeof(ModuleDependenciesRuntime),
                typeof(EPCompilerImpl),
                CodegenSymbolProviderEmpty.INSTANCE,
                classScope);
            moduleDependenciesProperty.GetterBlock
                .BlockReturn(compileTimeServices.ModuleDependencies.Make(
                    initializeQueryMethod, classScope));

            // build stack
            CodegenStackGenerator.RecursiveBuildStack(moduleDependenciesProperty, "ModuleDependencies", methods, properties);
            CodegenStackGenerator.RecursiveBuildStack(initializeEventTypesMethod, "InitializeEventTypes", methods, properties);
            CodegenStackGenerator.RecursiveBuildStack(initializeQueryMethod, "InitializeQuery", methods, properties);
            CodegenStackGenerator.RecursiveBuildStack(queryMethodProviderProperty, "QueryMethodProvider", methods, properties);

            IList<CodegenTypedParam> members = new List<CodegenTypedParam>();
            members.Add(new CodegenTypedParam(statementFieldsClassName, null, "statementFields"));
            var typedParam = new CodegenTypedParam(typeof(FAFQueryMethodProvider), MEMBERNAME_QUERY_METHOD_PROVIDER);
            typedParam.IsReadonly = false;
            members.Add(typedParam);

            var clazz = new CodegenClass(
                CodegenClassType.FAFPROVIDER,
                typeof(FAFProvider),
                fafProviderClassName,
                classScope,
                members,
                ctor,
                methods,
                properties,
                new EmptyList<CodegenInnerClass>());

            var container = compileTimeServices.Container;
            var compiler = container
                .RoslynCompiler()
                .WithCodeLogging(compileTimeServices.Configuration.Compiler.Logging.IsEnableCode)
                .WithCodeAuditDirectory(compileTimeServices.Configuration.Compiler.Logging.AuditDirectory)
                .WithCodegenClasses(new List<CodegenClass>() { clazz });

            assembly = compiler.Compile();

            return CodeGenerationIDGenerator.GenerateClassNameWithNamespace(
                compileTimeServices.Namespace,
                typeof(FAFProvider),
                classPostfix);
        }
示例#3
0
        public CodegenClass Forge(
            bool includeDebugSymbols,
            bool fireAndForget)
        {
            var classScope = new CodegenClassScope(includeDebugSymbols, _namespaceScope, _className);

            // make members
            var members = new List <CodegenTypedParam>();

            // --------------------------------------------------------------------------------
            // Constructor
            // --------------------------------------------------------------------------------

            var ctorParams = new CodegenTypedParam[] {};
            var ctor       = new CodegenCtor(typeof(StmtClassForgeableRSPFactoryProvider), classScope, ctorParams);

            // --------------------------------------------------------------------------------
            // TryGetProperty(string name, out object value)
            // --------------------------------------------------------------------------------

            var tryGetPropertyMethod = CodegenMethod
                                       .MakeParentNode(typeof(bool), this.GetType(), CodegenSymbolProviderEmpty.INSTANCE, classScope)
                                       .AddParam(new CodegenNamedParam(typeof(string), "name"))
                                       .AddParam(new CodegenNamedParam(typeof(object), "underlying"))
                                       .AddParam(new CodegenNamedParam(typeof(object), "value").WithOutputModifier());

            tryGetPropertyMethod = MakeTryGetProperty(tryGetPropertyMethod);

            // --------------------------------------------------------------------------------
            // TrySetProperty(string name, object underlying, object value)
            // --------------------------------------------------------------------------------

            var trySetPropertyMethod = CodegenMethod
                                       .MakeParentNode(typeof(bool), this.GetType(), CodegenSymbolProviderEmpty.INSTANCE, classScope)
                                       .AddParam(new CodegenNamedParam(typeof(string), "name"))
                                       .AddParam(new CodegenNamedParam(typeof(object), "underlying"))
                                       .AddParam(new CodegenNamedParam(typeof(object), "value"));

            trySetPropertyMethod = MakeTrySetProperty(trySetPropertyMethod);

            // --------------------------------------------------------------------------------
            // object TryCopy(object source)
            // --------------------------------------------------------------------------------

            var tryCopyMethod = CodegenMethod
                                .MakeParentNode(typeof(object), this.GetType(), CodegenSymbolProviderEmpty.INSTANCE, classScope)
                                .AddParam(new CodegenNamedParam(typeof(object), "source"));

            tryCopyMethod = MakeTryCopy(tryCopyMethod, classScope);

            // --------------------------------------------------------------------------------
            // Allocator (property)
            // --------------------------------------------------------------------------------

            var allocateMethod = CodegenMethod
                                 .MakeParentNode(typeof(object), GetType(), CodegenSymbolProviderEmpty.INSTANCE, classScope);

            allocateMethod = MakeAllocate(allocateMethod);

            // --------------------------------------------------------------------------------

            var properties = new CodegenClassProperties();

            // walk methods
            var methods = new CodegenClassMethods();

            CodegenStackGenerator.RecursiveBuildStack(tryGetPropertyMethod, "TryGetProperty", methods, properties);
            CodegenStackGenerator.RecursiveBuildStack(trySetPropertyMethod, "TrySetProperty", methods, properties);
            CodegenStackGenerator.RecursiveBuildStack(tryCopyMethod, "TryCopy", methods, properties);
            CodegenStackGenerator.RecursiveBuildStack(allocateMethod, "Allocate", methods, properties);

            var clazz = new CodegenClass(
                _classType,
                _className,
                classScope,
                members,
                ctor,
                methods,
                properties,
                EmptyList <CodegenInnerClass> .Instance);

            clazz.BaseList.AssignType(typeof(IJsonDelegate));

            return(clazz);
        }