Example #1
0
        public void TopLevelStatements()
        {
            var original = CreateCompilation(
                @"System.Console.WriteLine(""I'm using top-level statements!"");",
                options: TestOptions.DebugExe
                );

            original.VerifyDiagnostics();

            var originalBytes = original.EmitToArray(
                new EmitOptions(debugInformationFormat: DebugInformationFormat.Embedded)
                );
            var originalPeReader  = new PEReader(originalBytes);
            var originalPdbReader = originalPeReader.GetEmbeddedPdbMetadataReader() !;
            var factory           = LoggerFactory.Create(configure => { });
            var logger            = factory.CreateLogger("Test");

            var optionsReader = new CompilationOptionsReader(
                logger,
                originalPdbReader,
                originalPeReader
                );
            var compilationFactory = CompilationFactory.Create("test.exe", optionsReader);

            var sources = original.SyntaxTrees
                          .Select(x => compilationFactory.CreateSyntaxTree(x.FilePath, x.GetText()))
                          .ToImmutableArray();
            var references = original.References.ToImmutableArray();
            var rebuild    = compilationFactory.CreateCompilation(
                sources,
                original.References.ToImmutableArray()
                );

            rebuild.VerifyEmitDiagnostics();
        }
Example #2
0
        public async Task <Assembly> Compile(string uuid, string code)
        {
            var compilation = await Task.Run(() => CompilationFactory.Create(uuid, @"using System; using quiz_oj.IndependentNS;" + code));

            await using var ms = new MemoryStream();
            var emitRes = compilation.Emit(ms);

            if (emitRes.Success)
            {
                ms.Seek(0, SeekOrigin.Begin);
                var context = _contexts.GetOrAdd(uuid, s => new AssemblyLoadContext(s, true));
                var a       = context.LoadFromStream(ms);
                return(a);
            }
            var builder = new StringBuilder();

            builder.AppendLine("Compilation was failed.");
            foreach (var resDiagnostic in emitRes.Diagnostics)
            {
                builder.AppendLine(resDiagnostic.ToString()); Console.WriteLine(resDiagnostic.ToString());
            }

            builder.AppendLine("Please check your code...");
            throw new UserException(builder.ToString());
        }
        public static void VerifyRoundTrip(
            MemoryStream peStream,
            MemoryStream?pdbStream,
            string assemblyFileName,
            ImmutableArray <SyntaxTree> syntaxTrees,
            ImmutableArray <MetadataReference> metadataReferences,
            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);

            VerifyMetadataReferenceInfo(optionsReader, metadataReferences);

            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, syntaxTrees, metadataReferences, cancellationToken);

            Assert.True(emitResult.Success);
            Assert.Equal(peStream.ToArray(), rebuildPeStream.ToArray());
            Assert.Equal(pdbStream?.ToArray(), rebuildPdbStream?.ToArray());
        }
Example #4
0
        private static void VerifyRoundTrip <TCompilation>(TCompilation original)
            where TCompilation : Compilation
        {
            Assert.True(original.SyntaxTrees.All(x => !string.IsNullOrEmpty(x.FilePath)));
            Assert.True(original.Options.Deterministic);

            original.VerifyDiagnostics();
            var originalBytes     = original.EmitToArray(new EmitOptions(debugInformationFormat: DebugInformationFormat.Embedded));
            var originalReader    = new PEReader(originalBytes);
            var originalPdbReader = originalReader.GetEmbeddedPdbMetadataReader();

            var factory          = LoggerFactory.Create(configure => { });
            var logger           = factory.CreateLogger("RoundTripVerification");
            var optionsReader    = new CompilationOptionsReader(logger, originalPdbReader, originalReader);
            var assemblyFileName = original.AssemblyName !;

            if (typeof(TCompilation) == typeof(CSharpCompilation))
            {
                var assemblyFileExtension = original.Options.OutputKind switch
                {
                    OutputKind.DynamicallyLinkedLibrary => ".dll",
                    OutputKind.ConsoleApplication => ".exe",
                    _ => throw new InvalidOperationException(),
                };
                assemblyFileName += assemblyFileExtension;
            }

            var compilationFactory = CompilationFactory.Create(assemblyFileName, optionsReader);
            var rebuild            = compilationFactory.CreateCompilation(
                original.SyntaxTrees.Select(x => compilationFactory.CreateSyntaxTree(x.FilePath, x.GetText())).ToImmutableArray(),
                original.References.ToImmutableArray());

            Assert.IsType <TCompilation>(rebuild);
            VerifyCompilationOptions(original.Options, rebuild.Options);

            using var rebuildStream = new MemoryStream();
            var result = compilationFactory.Emit(
                rebuildStream,
                rebuild,
                embeddedTexts: ImmutableArray <EmbeddedText> .Empty,
                CancellationToken.None);

            Assert.Empty(result.Diagnostics);
            Assert.True(result.Success);
            Assert.Equal(originalBytes.ToArray(), rebuildStream.ToArray());
        }