public static IEnumerable <EcsFile> Run(MethodReference entryPoint)
        {
            var usedTypes = GetUsedTypesOrdered(entryPoint).ToList();

            var moduleParameter = new ModuleParameters {
                Kind = ModuleKind.Dll, AssemblyResolver = entryPoint.Module.AssemblyResolver
            };
            var mod = ModuleDefinition.CreateModule("test", moduleParameter);

            // copy search path from old assembly

            // todo move to new transform, discovery transform?
            foreach (var t in usedTypes)
            {
                t.IsNestedPrivate = false;
            }

            foreach (var t in usedTypes)
            {
                mod.Types.Add(t);
            }

            (new NewobjTransform()).TransformIL(usedTypes);
            //(new ArrayTransform()).TransformIL(usedTypes);
            (new FinalizerOptimization()).TransformIL(usedTypes);
            (new VirtualCallOptimization()).TransformIL(usedTypes);
            (new MainNoReturnCodeTransform()).TransformIL(usedTypes);
            RenameTransform.Rename(usedTypes);
            (new ThisParameterTransform()).TransformIL(usedTypes);
            (new DelegateTransform()).TransformIL(usedTypes);
            (new StringLiteralOptimization()).GlobalOptimization(usedTypes);
            (new ValueTypeOptimization()).TransformIL(usedTypes);
            (new IsInstanceOptimization()).TransformIL(usedTypes); // has to be before Interface Optimization (IsInterface is set to false there)
            (new InterfaceOptimization()).TransformIL(usedTypes);
            (new FinalizerImplementationOptimization()).TransformIL(usedTypes);
            (new ExceptionTransform()).TransformIL(usedTypes);
            (new StripExternalAnnotations()).TransformIL(usedTypes);
            //(new StripTryCatch()).TransformIL(usedTypes);

            // do this after ExceptionTransform as it will create default values.
            (new PrimitiveDefaultValues()).TransformIL(usedTypes);



            ILAstDebugPrinter.ClearLogs();

            ReferenceImportHelper.ImportReferences(mod);
            mod.Write(@"logs\compacted.dll");

            File.Copy("ESharpCore.dll", @"logs\ESharpCore.dll");

            // todo, just disabled temporarly because of poiter types resolving to null?? Should this happen?
            ReferenceChecker.CheckReferences(mod);

            var files = (new DecompilerService()).Generate(usedTypes, @"logs\compacted.dll").ToList();

            // file optimization
            var fileOptimizationContext = new FileOptimizationContext {
                UsedTypes = usedTypes
            };

            TypeEnumGenerator.FileOptimization(files, fileOptimizationContext);

            IncludeCFiles.Run(files);

            var mergedFiles = CMerger.MergeIntoSingleFile(files);

            return(mergedFiles);
        }