public AssemblyDefinition[] Translate(string assemblyPath, Stream outputStream = null, bool scanForProxies = true) { var assemblies = LoadAssembly(assemblyPath); if (scanForProxies) TypeInfoProvider.AddProxyAssemblies(assemblies); GeneratedFiles.Add(assemblyPath); var context = new DecompilerContext(assemblies.First().MainModule); context.Settings.YieldReturn = false; context.Settings.AnonymousMethods = true; context.Settings.QueryExpressions = false; context.Settings.LockStatement = false; context.Settings.FullyQualifyAmbiguousTypeNames = true; context.Settings.ForEachStatement = false; var pr = new ProgressReporter(); if (Decompiling != null) Decompiling(pr); for (int i = 0; i < assemblies.Length; i++) { pr.OnProgressChanged(i, assemblies.Length); Analyze(context, assemblies[i]); } pr.OnFinished(); OptimizeAll(); Action<AssemblyDefinition> handler; if (outputStream == null) { handler = (assembly) => { var outputPath = Path.Combine(OutputDirectory, assembly.Name + ".js"); if (File.Exists(outputPath)) File.Delete(outputPath); using (outputStream = File.OpenWrite(outputPath)) Translate(context, assembly, outputStream); }; if (!Directory.Exists(OutputDirectory)) Directory.CreateDirectory(OutputDirectory); } else { handler = (assembly) => Translate(context, assembly, outputStream); } pr = new ProgressReporter(); if (Writing != null) Writing(pr); for (int i = 0; i < assemblies.Length; i++) { pr.OnProgressChanged(i, assemblies.Length); handler(assemblies[i]); } pr.OnFinished(); return assemblies; }
protected void OptimizeAll() { var pr = new ProgressReporter(); if (Optimizing != null) Optimizing(pr); int i = 0; while (FunctionCache.OptimizationQueue.Count > 0) { var id = FunctionCache.OptimizationQueue.First(); FunctionCache.OptimizationQueue.Remove(id); var e = FunctionCache.Cache[id]; if (e.Expression == null) { i++; continue; } pr.OnProgressChanged(i++, i + FunctionCache.OptimizationQueue.Count); OptimizeFunction(e.SpecialIdentifiers, e.ParameterNames, e.Variables, e.Expression); } pr.OnFinished(); }
protected void OptimizeAll() { var pr = new ProgressReporter(); if (Optimizing != null) Optimizing(pr); int i = 0, c = FunctionCache.Cache.Count; foreach (var e in FunctionCache.Cache.Values) { if (e.Expression == null) { i++; continue; } pr.OnProgressChanged(i++, c); OptimizeFunction(e.SpecialIdentifiers, e.ParameterNames, e.Variables, e.Expression); } pr.OnFinished(); }