public void Rewrite(AssemblyDefinition assembly, IWorkSession session)
        {
            if (!session.IsFSharp())
            {
                return;
            }

            if (assembly.EntryPoint != null)
            {
                return;
            }

            var(entryPoint, isStaticConstructor) = FindBestEntryPointCandidate(assembly);
            if (entryPoint == null)
            {
                return;
            }

            if (isStaticConstructor)
            {
                entryPoint.Attributes &= ~MethodAttributes.SpecialName & ~MethodAttributes.RTSpecialName;
                entryPoint.Name        = "cctor_rewritten_to_method_by_sharplab";
            }
            assembly.EntryPoint = entryPoint;
        }
Beispiel #2
0
        public async Task <bool> TryCompileToStreamAsync(MemoryStream assemblyStream, MemoryStream symbolStream, IWorkSession session, IList <Diagnostic> diagnostics, CancellationToken cancellationToken)
        {
            if (session.IsFSharp())
            {
                return(await TryCompileFSharpToStreamAsync(assemblyStream, session, diagnostics, cancellationToken));
            }

            if (session.IsPhp())
            {
                return(TryCompilePhpToStreamAsync(assemblyStream, symbolStream, session, diagnostics));
            }

            var compilation = await session.Roslyn.Project.GetCompilationAsync(cancellationToken).ConfigureAwait(false);

            var emitResult = compilation.Emit(assemblyStream, pdbStream: symbolStream);

            if (!emitResult.Success)
            {
                foreach (var diagnostic in emitResult.Diagnostics)
                {
                    diagnostics.Add(diagnostic);
                }
                return(false);
            }
            return(true);
        }
Beispiel #3
0
        public async Task <(bool assembly, bool symbols)> TryCompileToStreamAsync(MemoryStream assemblyStream, MemoryStream?symbolStream, IWorkSession session, IList <Diagnostic> diagnostics, CancellationToken cancellationToken)
        {
            if (session.IsFSharp())
            {
                var compiled = await TryCompileFSharpToStreamAsync(assemblyStream, session, diagnostics, cancellationToken).ConfigureAwait(false);

                return(compiled, false);
            }

            #warning TODO: Revisit after https://github.com/dotnet/docs/issues/14784
            var compilation = (await session.Roslyn.Project.GetCompilationAsync(cancellationToken).ConfigureAwait(false)) !;
            var emitResult  = compilation.Emit(assemblyStream, pdbStream: symbolStream, options: RoslynEmitOptions);
            if (!emitResult.Success)
            {
                foreach (var diagnostic in emitResult.Diagnostics)
                {
                    diagnostics.Add(diagnostic);
                }
                return(false, false);
            }
            return(true, true);
        }
Beispiel #4
0
        public async Task <(bool assembly, bool symbols)> TryCompileToStreamAsync(MemoryStream assemblyStream, MemoryStream?symbolStream, IWorkSession session, IList <Diagnostic> diagnostics, CancellationToken cancellationToken)
        {
            #if !NETCOREAPP
            if (session.IsFSharp())
            {
                var compiled = await TryCompileFSharpToStreamAsync(assemblyStream, session, diagnostics, cancellationToken).ConfigureAwait(false);

                return(compiled, false);
            }
            #endif

            var compilation = await session.Roslyn.Project.GetCompilationAsync(cancellationToken).ConfigureAwait(false);

            var emitResult = compilation.Emit(assemblyStream, pdbStream: symbolStream, options: RoslynEmitOptions);
            if (!emitResult.Success)
            {
                foreach (var diagnostic in emitResult.Diagnostics)
                {
                    diagnostics.Add(diagnostic);
                }
                return(false, false);
            }
            return(true, true);
        }