예제 #1
0
        private static EPCompiledManifest CompileToAssembly(
            FAFQueryMethodForge query,
            string classPostfix,
            CompilerOptions compilerOptions,
            ModuleCompileTimeServices compileTimeServices,
            out Assembly assembly)
        {
            string queryMethodProviderClassName;
            try {
                queryMethodProviderClassName = CompilerHelperFAFQuery.CompileQuery(query, classPostfix,compileTimeServices, out assembly);
            }
            catch (StatementSpecCompileException ex) {
                EPCompileExceptionItem first;
                if (ex is StatementSpecCompileSyntaxException) {
                    first = new EPCompileExceptionSyntaxItem(ex.Message, ex.Expression, -1);
                }
                else {
                    first = new EPCompileExceptionItem(ex.Message, ex.Expression, -1);
                }

                var items = Collections.SingletonList(first);
                throw new EPCompileException(ex.Message + " [" + ex.Expression + "]", ex, items);
            }

            // compile query provider
            var fafProviderClassName = MakeFAFProvider(
                queryMethodProviderClassName,
                classPostfix,
                compileTimeServices,
                out assembly);

            // create manifest
            return new EPCompiledManifest(COMPILER_VERSION, null, fafProviderClassName, false);
        }
예제 #2
0
 public StmtClassForgableQueryMethodProvider(
     string className,
     CodegenNamespaceScope namespaceScope,
     FAFQueryMethodForge forge)
 {
     ClassName = className;
     this._namespaceScope = namespaceScope;
     this._forge = forge;
 }
예제 #3
0
        public static string CompileQuery(
            FAFQueryMethodForge query,
            string classPostfix,
            ModuleCompileTimeServices compileTimeServices,
            out Assembly assembly)
        {
            var statementFieldsClassName = CodeGenerationIDGenerator.GenerateClassNameSimple(
                typeof(StatementFields),
                classPostfix);
            var packageScope = new CodegenNamespaceScope(
                compileTimeServices.Namespace,
                statementFieldsClassName,
                compileTimeServices.IsInstrumented());

            var queryMethodProviderClassName = CodeGenerationIDGenerator.GenerateClassNameSimple(
                typeof(FAFQueryMethodProvider),
                classPostfix);
            var forgeablesQueryMethod = query.MakeForgeables(queryMethodProviderClassName, classPostfix, packageScope);

            IList<StmtClassForgeable> forgeables = new List<StmtClassForgeable>(forgeablesQueryMethod);
            forgeables.Add(new StmtClassForgeableStmtFields(statementFieldsClassName, packageScope, 0));

            // forge with statement-fields last
            var classes = new List<CodegenClass>(forgeables.Count);
            foreach (var forgeable in forgeables) {
                var clazz = forgeable.Forge(true, true);
                classes.Add(clazz);
            }

            // assign the assembly (required for completeness)
            assembly = null;

            // compile with statement-field first
            classes = classes
                .OrderBy(c => c.ClassType.GetSortCode())
                .ToList();

            var container = compileTimeServices.Container;
            var compiler = container
                .RoslynCompiler()
                .WithCodeLogging(compileTimeServices.Configuration.Compiler.Logging.IsEnableCode)
                .WithCodeAuditDirectory(compileTimeServices.Configuration.Compiler.Logging.AuditDirectory)
                .WithCodegenClasses(classes);

            assembly = compiler.Compile();

            return queryMethodProviderClassName;
        }