internal static EmitDifferenceResult EmitDifference( CSharpCompilation compilation, EmitBaseline baseline, IEnumerable <SemanticEdit> edits, Func <ISymbol, bool> isAddedSymbol, Stream metadataStream, Stream ilStream, Stream pdbStream, ICollection <MethodDefinitionHandle> updatedMethods, CompilationTestData testData, CancellationToken cancellationToken) { var diagnostics = DiagnosticBag.GetInstance(); var emitOptions = EmitOptions.Default.WithDebugInformationFormat(baseline.HasPortablePdb ? DebugInformationFormat.PortablePdb : DebugInformationFormat.Pdb); string runtimeMDVersion = compilation.GetRuntimeMetadataVersion(emitOptions, diagnostics); var serializationProperties = compilation.ConstructModuleSerializationProperties(emitOptions, runtimeMDVersion, baseline.ModuleVersionId); var manifestResources = SpecializedCollections.EmptyEnumerable <ResourceDescription>(); PEDeltaAssemblyBuilder moduleBeingBuilt; try { moduleBeingBuilt = new PEDeltaAssemblyBuilder( compilation.SourceAssembly, emitOptions: emitOptions, outputKind: compilation.Options.OutputKind, serializationProperties: serializationProperties, manifestResources: manifestResources, previousGeneration: baseline, edits: edits, isAddedSymbol: isAddedSymbol); } catch (NotSupportedException e) { // TODO: https://github.com/dotnet/roslyn/issues/9004 diagnostics.Add(ErrorCode.ERR_ModuleEmitFailure, NoLocation.Singleton, compilation.AssemblyName, e.Message); return(new EmitDifferenceResult(success: false, diagnostics: diagnostics.ToReadOnlyAndFree(), baseline: null)); } if (testData != null) { moduleBeingBuilt.SetMethodTestData(testData.Methods); testData.Module = moduleBeingBuilt; } var definitionMap = moduleBeingBuilt.PreviousDefinitions; var changes = moduleBeingBuilt.Changes; EmitBaseline newBaseline = null; if (compilation.Compile( moduleBeingBuilt, emittingPdb: true, diagnostics: diagnostics, filterOpt: s => changes.RequiresCompilation(s.GetISymbol()), cancellationToken: cancellationToken)) { // Map the definitions from the previous compilation to the current compilation. // This must be done after compiling above since synthesized definitions // (generated when compiling method bodies) may be required. var mappedBaseline = MapToCompilation(compilation, moduleBeingBuilt); newBaseline = compilation.SerializeToDeltaStreams( moduleBeingBuilt, mappedBaseline, definitionMap, changes, metadataStream, ilStream, pdbStream, updatedMethods, diagnostics, testData?.SymWriterFactory, emitOptions.PdbFilePath, cancellationToken); } return(new EmitDifferenceResult( success: newBaseline != null, diagnostics: diagnostics.ToReadOnlyAndFree(), baseline: newBaseline)); }
internal static EmitDifferenceResult EmitDifference( CSharpCompilation compilation, EmitBaseline baseline, IEnumerable<SemanticEdit> edits, Func<ISymbol, bool> isAddedSymbol, Stream metadataStream, Stream ilStream, Stream pdbStream, ICollection<MethodDefinitionHandle> updatedMethods, CompilationTestData testData, CancellationToken cancellationToken) { Guid moduleVersionId; try { moduleVersionId = baseline.OriginalMetadata.GetModuleVersionId(); } catch (BadImageFormatException) { // TODO: // return MakeEmitResult(success: false, diagnostics: ..., baseline: null); throw; } var diagnostics = DiagnosticBag.GetInstance(); var emitOptions = EmitOptions.Default; string runtimeMDVersion = compilation.GetRuntimeMetadataVersion(emitOptions, diagnostics); var serializationProperties = compilation.ConstructModuleSerializationProperties(emitOptions, runtimeMDVersion, moduleVersionId); var manifestResources = SpecializedCollections.EmptyEnumerable<ResourceDescription>(); var moduleBeingBuilt = new PEDeltaAssemblyBuilder( compilation.SourceAssembly, emitOptions: emitOptions, outputKind: compilation.Options.OutputKind, serializationProperties: serializationProperties, manifestResources: manifestResources, previousGeneration: baseline, edits: edits, isAddedSymbol: isAddedSymbol); if (testData != null) { moduleBeingBuilt.SetMethodTestData(testData.Methods); testData.Module = moduleBeingBuilt; } var definitionMap = moduleBeingBuilt.PreviousDefinitions; var changes = moduleBeingBuilt.Changes; EmitBaseline newBaseline = null; if (compilation.Compile( moduleBeingBuilt, win32Resources: null, xmlDocStream: null, emittingPdb: true, diagnostics: diagnostics, filterOpt: changes.RequiresCompilation, cancellationToken: cancellationToken)) { // Map the definitions from the previous compilation to the current compilation. // This must be done after compiling above since synthesized definitions // (generated when compiling method bodies) may be required. var mappedBaseline = MapToCompilation(compilation, moduleBeingBuilt); newBaseline = compilation.SerializeToDeltaStreams( moduleBeingBuilt, mappedBaseline, definitionMap, changes, metadataStream, ilStream, pdbStream, updatedMethods, diagnostics, testData?.SymWriterFactory, cancellationToken); } return new EmitDifferenceResult( success: newBaseline != null, diagnostics: diagnostics.ToReadOnlyAndFree(), baseline: newBaseline); }
internal static EmitDifferenceResult EmitDifference( CSharpCompilation compilation, EmitBaseline baseline, IEnumerable<SemanticEdit> edits, Func<ISymbol, bool> isAddedSymbol, Stream metadataStream, Stream ilStream, Stream pdbStream, ICollection<MethodDefinitionHandle> updatedMethods, CompilationTestData testData, CancellationToken cancellationToken) { Guid moduleVersionId; try { moduleVersionId = baseline.OriginalMetadata.GetModuleVersionId(); } catch (BadImageFormatException) { // TODO: // return MakeEmitResult(success: false, diagnostics: ..., baseline: null); throw; } var pdbName = FileNameUtilities.ChangeExtension(compilation.SourceModule.Name, "pdb"); var diagnostics = DiagnosticBag.GetInstance(); var emitOptions = EmitOptions.Default; string runtimeMDVersion = compilation.GetRuntimeMetadataVersion(emitOptions, diagnostics); var serializationProperties = compilation.ConstructModuleSerializationProperties(emitOptions, runtimeMDVersion, moduleVersionId); var manifestResources = SpecializedCollections.EmptyEnumerable<ResourceDescription>(); var moduleBeingBuilt = new PEDeltaAssemblyBuilder( compilation.SourceAssembly, emitOptions: emitOptions, outputKind: compilation.Options.OutputKind, serializationProperties: serializationProperties, manifestResources: manifestResources, previousGeneration: baseline, edits: edits, isAddedSymbol: isAddedSymbol); if (testData != null) { moduleBeingBuilt.SetMethodTestData(testData.Methods); testData.Module = moduleBeingBuilt; } baseline = moduleBeingBuilt.PreviousGeneration; var definitionMap = moduleBeingBuilt.PreviousDefinitions; var changes = moduleBeingBuilt.Changes; if (compilation.Compile( moduleBeingBuilt, win32Resources: null, xmlDocStream: null, generateDebugInfo: true, diagnostics: diagnostics, filterOpt: changes.RequiresCompilation, cancellationToken: cancellationToken)) { // Map the definitions from the previous compilation to the current compilation. // This must be done after compiling above since synthesized definitions // (generated when compiling method bodies) may be required. baseline = MapToCompilation(compilation, moduleBeingBuilt); using (var pdbWriter = new Cci.PdbWriter(pdbName, pdbStream, (testData != null) ? testData.SymWriterFactory : null)) { var context = new EmitContext(moduleBeingBuilt, null, diagnostics); var encId = Guid.NewGuid(); try { var writer = new DeltaMetadataWriter( context, compilation.MessageProvider, baseline, encId, definitionMap, changes, cancellationToken); Cci.MetadataSizes metadataSizes; writer.WriteMetadataAndIL(pdbWriter, metadataStream, ilStream, out metadataSizes); writer.GetMethodTokens(updatedMethods); bool hasErrors = diagnostics.HasAnyErrors(); return new EmitDifferenceResult( success: !hasErrors, diagnostics: diagnostics.ToReadOnlyAndFree(), baseline: hasErrors ? null : writer.GetDelta(baseline, compilation, encId, metadataSizes)); } catch (Cci.PdbWritingException e) { diagnostics.Add(ErrorCode.FTL_DebugEmitFailure, Location.None, e.Message); } catch (PermissionSetFileReadException e) { diagnostics.Add(ErrorCode.ERR_PermissionSetAttributeFileReadError, Location.None, e.FileName, e.PropertyName, e.Message); } } } return new EmitDifferenceResult(success: false, diagnostics: diagnostics.ToReadOnlyAndFree(), baseline: null); }
internal static EmitDifferenceResult EmitDifference( CSharpCompilation compilation, EmitBaseline baseline, IEnumerable <SemanticEdit> edits, Func <ISymbol, bool> isAddedSymbol, Stream metadataStream, Stream ilStream, Stream pdbStream, ICollection <MethodDefinitionHandle> updatedMethods, CompilationTestData testData, CancellationToken cancellationToken) { Guid moduleVersionId; try { moduleVersionId = baseline.OriginalMetadata.GetModuleVersionId(); } catch (BadImageFormatException) { // TODO: // return MakeEmitResult(success: false, diagnostics: ..., baseline: null); throw; } var diagnostics = DiagnosticBag.GetInstance(); var emitOptions = EmitOptions.Default; string runtimeMDVersion = compilation.GetRuntimeMetadataVersion(emitOptions, diagnostics); var serializationProperties = compilation.ConstructModuleSerializationProperties(emitOptions, runtimeMDVersion, moduleVersionId); var manifestResources = SpecializedCollections.EmptyEnumerable <ResourceDescription>(); var moduleBeingBuilt = new PEDeltaAssemblyBuilder( compilation.SourceAssembly, emitOptions: emitOptions, outputKind: compilation.Options.OutputKind, serializationProperties: serializationProperties, manifestResources: manifestResources, previousGeneration: baseline, edits: edits, isAddedSymbol: isAddedSymbol); if (testData != null) { moduleBeingBuilt.SetMethodTestData(testData.Methods); testData.Module = moduleBeingBuilt; } var definitionMap = moduleBeingBuilt.PreviousDefinitions; var changes = moduleBeingBuilt.Changes; EmitBaseline newBaseline = null; if (compilation.Compile( moduleBeingBuilt, win32Resources: null, xmlDocStream: null, emittingPdb: true, diagnostics: diagnostics, filterOpt: changes.RequiresCompilation, cancellationToken: cancellationToken)) { // Map the definitions from the previous compilation to the current compilation. // This must be done after compiling above since synthesized definitions // (generated when compiling method bodies) may be required. var mappedBaseline = MapToCompilation(compilation, moduleBeingBuilt); newBaseline = compilation.SerializeToDeltaStreams( moduleBeingBuilt, mappedBaseline, definitionMap, changes, metadataStream, ilStream, pdbStream, updatedMethods, diagnostics, testData?.SymWriterFactory, cancellationToken); } return(new EmitDifferenceResult( success: newBaseline != null, diagnostics: diagnostics.ToReadOnlyAndFree(), baseline: newBaseline)); }
internal static EmitDifferenceResult EmitDifference( CSharpCompilation compilation, EmitBaseline baseline, IEnumerable <SemanticEdit> edits, Stream metadataStream, Stream ilStream, Stream pdbStream, ICollection <uint> updatedMethodTokens, CompilationTestData testData, CancellationToken cancellationToken) { Guid moduleVersionId; try { moduleVersionId = baseline.OriginalMetadata.GetModuleVersionId(); } catch (BadImageFormatException) { // return MakeEmitResult(success: false, diagnostics: ..., baseline: null); throw; } var pdbName = FileNameUtilities.ChangeExtension(compilation.SourceModule.Name, "pdb"); var diagnostics = DiagnosticBag.GetInstance(); string runtimeMDVersion = compilation.GetRuntimeMetadataVersion(diagnostics); var serializationProperties = compilation.ConstructModuleSerializationProperties(runtimeMDVersion, moduleVersionId); var manifestResources = SpecializedCollections.EmptyEnumerable <ResourceDescription>(); var moduleBeingBuilt = new PEDeltaAssemblyBuilder( compilation.SourceAssembly, outputName: null, outputKind: compilation.Options.OutputKind, serializationProperties: serializationProperties, manifestResources: manifestResources, assemblySymbolMapper: null, previousGeneration: baseline, edits: edits); if (testData != null) { moduleBeingBuilt.SetMethodTestData(testData.Methods); testData.Module = moduleBeingBuilt; } baseline = moduleBeingBuilt.PreviousGeneration; var definitionMap = moduleBeingBuilt.PreviousDefinitions; var changes = moduleBeingBuilt.Changes; if (compilation.Compile( moduleBeingBuilt, outputName: null, win32Resources: null, xmlDocStream: null, cancellationToken: cancellationToken, generateDebugInfo: true, diagnostics: diagnostics, filterOpt: changes.RequiresCompilation)) { // Map the definitions from the previous compilation to the current compilation. // This must be done after compiling above since synthesized definitions // (generated when compiling method bodies) may be required. baseline = MapToCompilation(compilation, moduleBeingBuilt); using (var pdbWriter = new Cci.PdbWriter(pdbName, pdbStream, (testData != null) ? testData.SymWriterFactory : null)) { var context = new EmitContext(moduleBeingBuilt, null, diagnostics); var encId = Guid.NewGuid(); try { var writer = new DeltaPeWriter( context, compilation.MessageProvider, pdbWriter, baseline, encId, definitionMap, changes, cancellationToken); Cci.MetadataSizes metadataSizes; writer.WriteMetadataAndIL(metadataStream, ilStream, out metadataSizes); writer.GetMethodTokens(updatedMethodTokens); return(new EmitDifferenceResult( success: true, diagnostics: diagnostics.ToReadOnlyAndFree(), baseline: writer.GetDelta(baseline, compilation, encId, metadataSizes))); } catch (Cci.PdbWritingException e) { diagnostics.Add(ErrorCode.FTL_DebugEmitFailure, Location.None, e.Message); } catch (PermissionSetFileReadException e) { diagnostics.Add(ErrorCode.ERR_PermissionSetAttributeFileReadError, Location.None, e.FileName, e.PropertyName, e.Message); } } } return(new EmitDifferenceResult(success: false, diagnostics: diagnostics.ToReadOnlyAndFree(), baseline: null)); }