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); }
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); }
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); }