internal static string GenerateCompilerCommandLine(
            string outputFolder, ITaskItem[] references, ITaskItem[] sources, bool emitDebugInformation,
            string[] disabledWarnings)
        {
            var builder = new CommandLineBuilder();

            #region javac <options> <source files>
            /* where possible options include:
              -g                         Generate all debugging info
              -g:none                    Generate no debugging info
              -g:{lines,vars,source}     Generate only some debugging info
              -nowarn                    Generate no warnings
              -verbose                   Output messages about what the compiler is doing
              -deprecation               Output source locations where deprecated APIs are used
              -classpath <path>          Specify where to find user class files and annotation processors
              -cp <path>                 Specify where to find user class files and annotation processors
              -sourcepath <path>         Specify where to find input source files
              -bootclasspath <path>      Override location of bootstrap class files
              -extdirs <dirs>            Override location of installed extensions
              -endorseddirs <dirs>       Override location of endorsed standards path
              -proc:{none,only}          Control whether annotation processing and/or compilation is done.
              -processor <class1>[,<class2>,<class3>...]Names of the annotation processors to run; bypasses default discovery process
              -processorpath <path>      Specify where to find annotation processors
              -d <directory>             Specify where to place generated class files
              -s <directory>             Specify where to place generated source files
              -implicit:{none,class}     Specify whether or not to generate class files for implicitly referenced files
              -encoding <encoding>       Specify character encoding used by source files
              -source <release>          Provide source compatibility with specified release
              -target <release>          Generate class files for specific VM version
              -version                   Version information
              -help                      Print a synopsis of standard options
              -Akey[=value]              Options to pass to annotation processors
              -X                         Print a synopsis of nonstandard options
              -J<flag>                   Pass <flag> directly to the runtime system */
            #endregion

            #region Debugging information
            if (emitDebugInformation)
            {
                builder.AppendSwitch("-g");
            }
            else
            {
                builder.AppendSwitch("-g:none");
            }
            #endregion

            builder.AppendSwitch("-d");
            builder.AppendFileNameIfNotNull(outputFolder);

            builder.AppendSwitch("-Xlint:all");
            if (disabledWarnings != null)
            {
                foreach (string warning in disabledWarnings)
                {
                    builder.AppendSwitch("-Xlint:-" + warning);
                }
            }

            #region Project references built into a classpath
            if (references != null)
            {
                builder.AppendSwitch("-classpath");
                builder.AppendSwitch('"' + references.Join(";", (item) => item.GetMetadata("HintPath")) + '"');
            }
            #endregion

            builder.AppendFileNamesIfNotNull(sources, " ");

            var result = builder.ToString();
            return result;
        }