Пример #1
0
        private static void DoCompilation(ConfigData cfg, ref bool showUsage)
        {
            var showUsage1 = showUsage;

            CompilerEngine.ExecuteInSeparateAppDomain(
                ce =>
            {
                ce.Configuration = cfg.Configuration;
                ce.CsProject     = cfg.CsProject;
                ce.OutDir        = cfg.OutDir;
                ce.Referenced.Clear();
                ce.TranlationHelpers.Clear();
                ce.ReferencedPyLibsLocations.Clear();

                // src and dest can be in different application domain
                // we need to add item by item
                ce.Set1(cfg.Referenced.ToArray(),
                        cfg.TranlationHelpers.ToArray(),
                        cfg.ReferencedPyLibsLocations.Select(a => a.Key + "\n" + a.Value).ToArray()
                        );
                ce.BinaryOutputDir = cfg.BinaryOutputDir;
                Debug.Assert(ce.Referenced.Count == cfg.Referenced.Count);
                Debug.Assert(ce.TranlationHelpers.Count == cfg.TranlationHelpers.Count);
                Debug.Assert(ce.ReferencedPyLibsLocations.Count == cfg.ReferencedPyLibsLocations.Count);
                //ce.CopyFrom(aa);
                ce.Check();
                showUsage1 = false;
                ce.Compile();
            });
            showUsage = showUsage1;
        }
Пример #2
0
        public void Compile()
        {
            using (new AppConfigManipulator())
            {
                CompilerEngine.ExecuteInSeparateAppDomain(
                    ce =>
                {
#if DEBUG
                    ce.Configuration = "DEBUG";
#else
                    ce.Configuration = "RELEASE";
#endif
                    ce.CsProject = LangPhpTestCsProj;
                    ce.OutDir    = ce.BinaryOutputDir = Path.GetTempPath();
                    ce.Referenced.Clear();

                    var types = new[]
                    {
                        typeof(Func <,>),
                        typeof(EmitContext),
                        typeof(ThisExpression),
                        typeof(CompilerEngine)
                    };
                    {
                        var tmp =
                            Assembly.Load(
                                "System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
                        ce.Referenced.Add(tmp.GetCodeLocation().FullName);
                    }
                    ce.Referenced.AddRange(types.Select(type => type.Assembly.GetCodeLocation().FullName));


                    ce.TranlationHelpers.Clear();
                    ce.ReferencedPhpLibsLocations.Clear();
                    ce.Check();

                    using (var comp = ce.PreparePhpCompiler())
                    {
                        Console.WriteLine("Compilation");
                        var emitResult = comp.CompileCSharpProject(comp.Sandbox, ce.DllFilename);
                        if (!emitResult.Success)
                        {
                            foreach (var i in emitResult.Diagnostics.Where(a => a.Severity == DiagnosticSeverity.Error))
                            {
                                throw new Exception("Compilation error: " + i.GetMessage());
                            }
                        }


                        var translationInfo = comp.ParseCsSource();


                        translationInfo.CurrentAssembly = comp.CompiledAssembly;
                        var assemblyTi = translationInfo.GetOrMakeTranslationInfo(comp.CompiledAssembly);
                        var ecBaseDir  = Path.Combine(Directory.GetCurrentDirectory(),
                                                      assemblyTi.RootPath.Replace("/", "\\"));
                        Console.WriteLine("Output root {0}", ecBaseDir);

                        var translationState = new TranslationState(translationInfo);
                        var translator       = new Translator(translationState);

                        translator.Translate(comp.Sandbox);

                        // =============
                        var m =
                            string.Join(", ", translator.Modules.Select(i => i.Name.Name).OrderBy(i => i)).ToArray();

                        //Assert.True(m == "Lang_Php_Test_Code_MyCode, Lang_Php_Test_Code_SampleEmptyClass", m);

                        MethodTranslation(ModuleMycode, ClassMycode, "BasicMath1", translator);
                        MethodTranslation(ModuleMycode, ClassMycode, "Collections", translator);
                        MethodTranslation(ModuleMycode, ClassMycode, "CostantsAndVariables", translator);
                        MethodTranslation(ModuleMycode, ClassMycode, "Filters", translator);
                        MethodTranslation(ModuleMycode, ClassMycode, "StringConcats", translator);
                        MethodTranslation(ModuleMycode, ClassMycode, "PregTest", translator);

//                            ModuleTranslation("Lang_Php_Test_Code_SampleEmptyClass", translator);
//                            ModuleTranslation("Lang_Php_Test_Code_BusinessClass", translator);
//                            ModuleTranslation("Lang_Php_Test_Code_BusinessClassDefinedConst", translator);

                        foreach (var moduleName in translator.Modules.Select(i => i.Name.Name))
                        {
                            ModuleTranslation(moduleName, translator);
                        }
                    }
                    ;
                }, AppDomain.CurrentDomain);
            }
        }