public static void VerifyRoundTrip( MemoryStream peStream, MemoryStream?pdbStream, string assemblyFileName, IRebuildArtifactResolver rebuildArtifactResolver, CancellationToken cancellationToken = default) { using var peReader = new PEReader(peStream); var embeddedPdbReader = peReader.GetEmbeddedPdbMetadataReader(); var portablePdbReader = pdbStream is not null?MetadataReaderProvider.FromPortablePdbStream(pdbStream).GetMetadataReader() : null; Assert.True(embeddedPdbReader == null ^ portablePdbReader == null); var pdbReader = embeddedPdbReader ?? portablePdbReader ?? throw ExceptionUtilities.Unreachable; var factory = LoggerFactory.Create(configure => { }); var logger = factory.CreateLogger("RoundTripVerification"); var optionsReader = new CompilationOptionsReader(logger, pdbReader, peReader); var compilationFactory = CompilationFactory.Create( assemblyFileName, optionsReader); using var rebuildPeStream = new MemoryStream(); using var rebuildPdbStream = optionsReader.HasEmbeddedPdb ? null : new MemoryStream(); var emitResult = compilationFactory.Emit( rebuildPeStream, rebuildPdbStream, rebuildArtifactResolver, cancellationToken); Assert.True(emitResult.Success); Assert.Equal(peStream.ToArray(), rebuildPeStream.ToArray()); Assert.Equal(pdbStream?.ToArray(), rebuildPdbStream?.ToArray()); }
public (ImmutableArray <SyntaxTree> SyntaxTrees, ImmutableArray <MetadataReference> MetadataReferences) ResolveArtifacts( IRebuildArtifactResolver resolver, Func <string, SourceText, SyntaxTree> createSyntaxTreeFunc ) { var syntaxTrees = ResolveSyntaxTrees(); var metadataReferences = ResolveMetadataReferences(); return(syntaxTrees, metadataReferences); ImmutableArray <SyntaxTree> ResolveSyntaxTrees() { var sourceFileCount = GetSourceFileCount(); var builder = ImmutableArray.CreateBuilder <SyntaxTree>(sourceFileCount); foreach (var(documentHandle, sourceTextInfo) in GetSourceTextInfoCore()) { SourceText sourceText; if ( ResolveEmbeddedSource(documentHandle, sourceTextInfo) is { } embeddedSourceTextInfo ) { sourceText = embeddedSourceTextInfo.SourceText; }
public EmitResult Emit( Stream rebuildPeStream, Stream?rebuildPdbStream, IRebuildArtifactResolver rebuildArtifactResolver, CancellationToken cancellationToken) => Emit( rebuildPeStream, rebuildPdbStream, CreateCompilation(rebuildArtifactResolver), cancellationToken);
public Compilation CreateCompilation(IRebuildArtifactResolver resolver) { var tuple = OptionsReader.ResolveArtifacts(resolver, CreateSyntaxTree); return(CreateCompilation(tuple.SyntaxTrees, tuple.MetadataReferences)); }