public static void GenerateStubScript(string scriptPath, IEnumerable <object> stubs)
        {
            Ensure.That(nameof(stubs)).IsNotNull(stubs);

            var stubWriters = stubs.Select(s => AotStubWriterProvider.instance.GetDecorator(s)).ToHashSet();

            var unit = new CodeCompileUnit();

            unit.StartDirectives.Add(new CodePragmaWarningDirective(CodePragmaWarningSetting.Disable, new[] { 219 }));             // Disable unused variable warning

            var @namespace = new CodeNamespace("Ludiq.Generated.Aot");

            unit.Namespaces.Add(@namespace);

            var @class = new CodeClassTypeDeclaration(CodeMemberModifiers.Public, "AotStubs");

            @class.CustomAttributes.Add(new CodeAttributeDeclaration(Code.TypeRef(typeof(PreserveAttribute))));

            @namespace.Types.Add(@class);

            var usedMethodNames = new HashSet <string>();

            foreach (var stubWriter in stubWriters.OrderBy(sw => sw.stubMethodComment))
            {
                if (stubWriter.skip)
                {
                    continue;
                }

                var methodName = stubWriter.stubMethodName;

                var i = 0;

                while (usedMethodNames.Contains(methodName))
                {
                    methodName = stubWriter.stubMethodName + "_" + i++;
                }

                usedMethodNames.Add(methodName);

                var method = new CodeMethodMember(CodeMemberModifiers.Public | CodeMemberModifiers.Static, Code.TypeRef(typeof(void)), methodName, Enumerable.Empty <CodeParameterDeclaration>(), stubWriter.GetStubStatements().ToArray());
                method.CustomAttributes.Add(new CodeAttributeDeclaration(Code.TypeRef(typeof(PreserveAttribute), true)));
                method.Comments.Add(new CodeComment(stubWriter.stubMethodComment));

                @class.Members.Add(method);
            }

            PathUtility.CreateDirectoryIfNeeded(LudiqCore.Paths.transientGenerated);

            VersionControlUtility.Unlock(scriptPath);

            if (File.Exists(scriptPath))
            {
                File.Delete(scriptPath);
            }

            using (var scriptWriter = new StreamWriter(scriptPath))
            {
                CodeGenerator.GenerateCodeFromCompileUnit(unit, new TextCodeWriter(scriptWriter), new CodeGeneratorOptions(indentString: "\t"));
            }
        }
 public StatementsGenerator(MethodDefinition methodDef, Graph graph)
 {
     this.graph = graph;
     this.method = new CodeMethodMember(methodDef);
 }