private CompileResult BuildFull(CompileOptions options) { var result = new CompileResult(); _logger.Info("BuildFull"); _options = options; _referenceFileList = new FileTimeList(); _referenceFileList.Update(options.References); _sourceFileList = new FileTimeList(); _sourceFileList.Update(options.Files); _referenceMap = options.References.ToDictionary( file => file, file => CreateReference(file)); var parseOption = new CSharpParseOptions(LanguageVersion.CSharp6, DocumentationMode.Parse, SourceCodeKind.Regular, options.Defines); _sourceMap = options.Files.ToDictionary( file => file, file => ParseSource(file, parseOption)); _compilation = CSharpCompilation.Create( options.AssemblyName, _sourceMap.Values, _referenceMap.Values, new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); Emit(result); return result; }
private CompileResult BuildFull(CompileOptions options) { var result = new CompileResult(); _logger.Info("BuildFull"); _options = options; _referenceFileList = new FileTimeList(); _referenceFileList.Update(options.References); _sourceFileList = new FileTimeList(); _sourceFileList.Update(options.Files); _referenceMap = options.References.ToDictionary( file => file, file => CreateReference(file)); var parseOption = new CSharpParseOptions(LanguageVersion.CSharp6, DocumentationMode.Parse, SourceCodeKind.Regular, options.Defines); _sourceMap = options.Files.ToDictionary( file => file, file => ParseSource(file, parseOption)); var specificDiagnosticOptions = options.NoWarnings.ToDictionary(x => x, _ => ReportDiagnostic.Suppress); _compilation = CSharpCompilation.Create( options.AssemblyName, _sourceMap.Values, _referenceMap.Values, new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary) .WithSpecificDiagnosticOptions(specificDiagnosticOptions) .WithAssemblyIdentityComparer(DesktopAssemblyIdentityComparer.Default) .WithAllowUnsafe(options.Options.Contains("-unsafe"))); Emit(result); return(result); }
private CompileResult BuildFull(CompileOptions options) { var result = new CompileResult(); _logger.Info("BuildFull"); _options = options; _referenceFileList = new FileTimeList(); _referenceFileList.Update(options.References); _sourceFileList = new FileTimeList(); _sourceFileList.Update(options.Files); _referenceMap = options.References.ToDictionary( file => file, file => CreateReference(file)); var parseOption = new CSharpParseOptions(LanguageVersion.CSharp6, DocumentationMode.Parse, SourceCodeKind.Regular, options.Defines); _sourceMap = options.Files.ToDictionary( file => file, file => ParseSource(file, parseOption)); var specificDiagnosticOptions = options.NoWarnings.ToDictionary(x => x, _ => ReportDiagnostic.Suppress); _compilation = CSharpCompilation.Create( options.AssemblyName, _sourceMap.Values, _referenceMap.Values, new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary) .WithSpecificDiagnosticOptions(specificDiagnosticOptions) .WithAssemblyIdentityComparer(DesktopAssemblyIdentityComparer.Default) .WithAllowUnsafe(options.Options.Contains("-unsafe"))); Emit(result); return result; }
private CompileResult BuildIncremental(CompileOptions options) { var result = new CompileResult(); _logger.Info("BuildIncremental"); _options = options; // update reference files var referenceChanges = _referenceFileList.Update(options.References); foreach (var file in referenceChanges.Added) { _logger.Info("+ {0}", file); var reference = CreateReference(file); _compilation = _compilation.AddReferences(reference); _referenceMap.Add(file, reference); } foreach (var file in referenceChanges.Changed) { _logger.Info("* {0}", file); var reference = CreateReference(file); _compilation = _compilation.RemoveReferences(_referenceMap[file]) .AddReferences(reference); _referenceMap[file] = reference; } foreach (var file in referenceChanges.Removed) { _logger.Info("- {0}", file); _compilation = _compilation.RemoveReferences(_referenceMap[file]); _referenceMap.Remove(file); } // update source files var sourceChanges = _sourceFileList.Update(options.Files); var parseOption = new CSharpParseOptions(LanguageVersion.CSharp6, DocumentationMode.Parse, SourceCodeKind.Regular, options.Defines); foreach (var file in sourceChanges.Added) { _logger.Info("+ {0}", file); var syntaxTree = ParseSource(file, parseOption); _compilation = _compilation.AddSyntaxTrees(syntaxTree); _sourceMap.Add(file, syntaxTree); } foreach (var file in sourceChanges.Changed) { _logger.Info("* {0}", file); var syntaxTree = ParseSource(file, parseOption); _compilation = _compilation.RemoveSyntaxTrees(_sourceMap[file]) .AddSyntaxTrees(syntaxTree); _sourceMap[file] = syntaxTree; } foreach (var file in sourceChanges.Removed) { _logger.Info("- {0}", file); _compilation = _compilation.RemoveSyntaxTrees(_sourceMap[file]); _sourceMap.Remove(file); } // emit or reuse prebuilt output var reusePrebuilt = _outputDllStream != null && ( (_options.PrebuiltOutputReuse == PrebuiltOutputReuseType.WhenNoChange && sourceChanges.Empty && referenceChanges.Empty) || (_options.PrebuiltOutputReuse == PrebuiltOutputReuseType.WhenNoSourceChange && sourceChanges.Empty && referenceChanges.Added.Count == 0 && referenceChanges.Removed.Count == 0)); if (reusePrebuilt) { _logger.Info("Reuse prebuilt output"); // write dll var dllFile = Path.Combine(_options.WorkDirectory, _options.Output); using (var dllStream = new FileStream(dllFile, FileMode.Create)) { _outputDllStream.Seek(0L, SeekOrigin.Begin); _outputDllStream.CopyTo(dllStream); } // write pdb or mdb switch (_options.DebugSymbolFile) { case DebugSymbolFileType.Pdb: var pdbFile = Path.Combine(_options.WorkDirectory, Path.ChangeExtension(_options.Output, ".pdb")); using (var debugSymbolStream = new FileStream(pdbFile, FileMode.Create)) { _outputDebugSymbolStream.Seek(0L, SeekOrigin.Begin); _outputDebugSymbolStream.CopyTo(debugSymbolStream); } break; case DebugSymbolFileType.PdbToMdb: case DebugSymbolFileType.Mdb: var mdbFile = Path.Combine(_options.WorkDirectory, _options.Output + ".mdb"); using (var debugSymbolStream = new FileStream(mdbFile, FileMode.Create)) { _outputDebugSymbolStream.Seek(0L, SeekOrigin.Begin); _outputDebugSymbolStream.CopyTo(debugSymbolStream); } break; } result.Succeeded = true; } else { _logger.Info("Emit"); Emit(result); } return(result); }