public static Ast_CSharp mapCodeO2References(this Ast_CSharp astCSharp, CSharp_FastCompiler_CompilerOptions compilerOptions)
        {
            compilerOptions.ExtraSourceCodeFilesToCompile = new List <string>();
            var compilationUnit = astCSharp.CompilationUnit;

            compilerOptions.ReferencedAssemblies   = new List <string>();               // this should be cleared in a more global location
            compilerOptions.Extra_Using_Statements = new List <string>();               // same here

            var filesToDownload = new List <string>();

            var currentUsingDeclarations = new List <string>();

            foreach (var usingDeclaration in astCSharp.AstDetails.UsingDeclarations)
            {
                currentUsingDeclarations.Add(usingDeclaration.Text);
            }

            compilerOptions.mapOptionsDefinedInsideComments(astCSharp.AstDetails.comments())
            .mapNuGetReferences()
            .Extra_Using_Statements.forEach(value => astCSharp.CompilationUnit.add_Using(value));

            //resolve location of ExtraSourceCodeFilesToCompile
            astCSharp.resolveFileLocationsOfExtraSourceCodeFilesToCompile(compilerOptions);

            CompileEngine.handleReferencedAssembliesInstallRequirements(astCSharp.AstDetails.CSharpCode);

            //use the same technique to download files that are needed for this script (for example *.zip files or other unmanaged/support files)
            CompileEngine.tryToResolveReferencesForCompilation(filesToDownload, compilerOptions.WorkOffline);


            if (compilerOptions.onlyAddReferencedAssemblies.isFalse())
            {
                foreach (var defaultRefAssembly in CompileEngine.DefaultReferencedAssemblies)
                {
                    if (compilerOptions.ReferencedAssemblies.Contains(defaultRefAssembly).isFalse())
                    {
                        compilerOptions.ReferencedAssemblies.add(defaultRefAssembly);
                    }
                }
                foreach (var usingStatement in CompileEngine.DefaultUsingStatements)
                {
                    if (false == currentUsingDeclarations.Contains(usingStatement))
                    {
                        compilationUnit.add_Using(usingStatement);
                    }
                }
            }

            //make sure the referenced assemblies are in the current execution directory
            CompileEngine.tryToResolveReferencesForCompilation(compilerOptions.ReferencedAssemblies, compilerOptions.WorkOffline);
            return(astCSharp);
        }
        public static Ast_CSharp mapCodeO2References(this Ast_CSharp astCSharp, CSharp_FastCompiler_CompilerOptions compilerOptions)
        {
            compilerOptions.ExtraSourceCodeFilesToCompile = new List<string>();
            var compilationUnit = astCSharp.CompilationUnit;
            compilerOptions.ReferencedAssemblies = new List<string>();                  // this should be cleared in a more global location
            compilerOptions.Extra_Using_Statements = new List<string>();                // same here

            var filesToDownload = new List<string>();

            var currentUsingDeclarations = new List<string>();
            foreach(var usingDeclaration in astCSharp.AstDetails.UsingDeclarations)
                currentUsingDeclarations.Add(usingDeclaration.Text);

            compilerOptions.mapOptionsDefinedInsideComments(astCSharp.AstDetails.comments())
                           .mapNuGetReferences()
                           .Extra_Using_Statements.forEach (value => astCSharp.CompilationUnit.add_Using(value));

            //resolve location of ExtraSourceCodeFilesToCompile
            astCSharp.resolveFileLocationsOfExtraSourceCodeFilesToCompile(compilerOptions);

            CompileEngine.handleReferencedAssembliesInstallRequirements(astCSharp.AstDetails.CSharpCode);

            //use the same technique to download files that are needed for this script (for example *.zip files or other unmanaged/support files)
            CompileEngine.tryToResolveReferencesForCompilation(filesToDownload, compilerOptions.WorkOffline);

            if (compilerOptions.onlyAddReferencedAssemblies.isFalse())
            {
                foreach (var defaultRefAssembly in CompileEngine.DefaultReferencedAssemblies)
                    if (compilerOptions.ReferencedAssemblies.Contains(defaultRefAssembly).isFalse())
                        compilerOptions.ReferencedAssemblies.add(defaultRefAssembly);
                foreach (var usingStatement in CompileEngine.DefaultUsingStatements)
                    if (false == currentUsingDeclarations.Contains(usingStatement))
                        compilationUnit.add_Using(usingStatement);
            }

            //make sure the referenced assemblies are in the current execution directory
            CompileEngine.tryToResolveReferencesForCompilation(compilerOptions.ReferencedAssemblies, compilerOptions.WorkOffline);
            return astCSharp;
        }
        public void mapOptionsDefinedInsideComments()
        {
            var compilerOptions = new CSharp_FastCompiler_CompilerOptions();

            var comments = new List<string>();

            compilerOptions.mapOptionsDefinedInsideComments(comments)
                           .toXml().assert_Equal(new CSharp_FastCompiler_CompilerOptions().toXml(), "Empty comments should make no changes to compilerOptions");
            comments.add("This is a random content");

            compilerOptions.mapOptionsDefinedInsideComments(comments)
                           .toXml().assert_Equal(new CSharp_FastCompiler_CompilerOptions().toXml(), "Non relevant comments should make no changes to compilerOptions");

            //O2Tag_OnlyAddReferencedAssemblies
            compilerOptions.onlyAddReferencedAssemblies.assert_False();
            compilerOptions.mapOptionsDefinedInsideComments(comments.add("O2Tag_OnlyAddReferencedAssemblies"))
                           .onlyAddReferencedAssemblies.assert_True();

            //generateDebugSymbols
            compilerOptions.generateDebugSymbols.assert_False();
            compilerOptions.mapOptionsDefinedInsideComments(comments.add("generateDebugSymbols"))
                           .generateDebugSymbols.assert_True();

            //SetInvocationParametersToDynamic
            compilerOptions.ResolveInvocationParametersType.assert_True();
            compilerOptions.mapOptionsDefinedInsideComments(comments.add("SetInvocationParametersToDynamic"))
                           .ResolveInvocationParametersType.assert_False();

            //DontSetInvocationParametersToDynamic
            compilerOptions.ResolveInvocationParametersType.assert_False();
            compilerOptions.mapOptionsDefinedInsideComments(comments.add("DontSetInvocationParametersToDynamic"))
                           .ResolveInvocationParametersType.assert_True();

            //StaThread
            compilerOptions.ExecuteInStaThread.assert_False();
            compilerOptions.mapOptionsDefinedInsideComments(comments.add("StaThread"))
                           .ExecuteInStaThread.assert_True();

            //MtaThread
            compilerOptions.ExecuteInMtaThread.assert_False();
            compilerOptions.mapOptionsDefinedInsideComments(comments.add("MtaThread"))
                           .ExecuteInMtaThread.assert_True();

            //WorkOffline
            compilerOptions.WorkOffline.assert_False();
            compilerOptions.mapOptionsDefinedInsideComments(comments.add("WorkOffline"))
                           .WorkOffline.assert_True();

            //using
            compilerOptions.Extra_Using_Statements.assert_Empty();
            compilerOptions.mapOptionsDefinedInsideComments(comments.add("using ABC"))
                           .Extra_Using_Statements.assert_Not_Empty()
                                                  .first().assert_Is("ABC");
            //O2Ref
            compilerOptions.ReferencedAssemblies.assert_Not_Contains("ABC");
            compilerOptions.mapOptionsDefinedInsideComments(comments.add("O2Ref:ABC"))
                           .ReferencedAssemblies.assert_Contains("ABC");

            //O2Download
            compilerOptions.FilesToDownload.assert_Empty();
            compilerOptions.mapOptionsDefinedInsideComments(comments.add("O2Download:ABC"))
                           .FilesToDownload.assert_Not_Empty()
                                                  .first().assert_Is("ABC");

            //O2File
            compilerOptions.ExtraSourceCodeFilesToCompile.assert_Empty();
            compilerOptions.mapOptionsDefinedInsideComments(comments.add("O2File:ABC"))
                           .ExtraSourceCodeFilesToCompile.assert_Not_Empty()
                                                         .first().assert_Is("ABC");

            //O2Dir

            var tempDir = "_DirToInclude".temp_Dir();
            var file    = tempDir.folder_Create_File("tempFile.cs", "some code");
            compilerOptions.ExtraSourceCodeFilesToCompile.assert_Not_Contains(file);
            compilerOptions.mapOptionsDefinedInsideComments(comments.add("O2Dir:".append(tempDir)))
                           .ExtraSourceCodeFilesToCompile.assert_Contains(file);

            tempDir.assert_Folder_Deleted();

            //NuGet
            compilerOptions.NuGet_References.assert_Empty();
            compilerOptions.mapOptionsDefinedInsideComments(comments.add("NuGet:ABC"))
                           .NuGet_References.assert_Not_Empty()
                                            .first().assert_Is("ABC");
        }