Esempio n. 1
0
        public async Task <CompileResult> Compile(WorkspaceRequest request, Budget budget = null)
        {
            var workspace = request.Workspace;

            budget ??= new TimeBudget(TimeSpan.FromSeconds(defaultBudgetInSeconds));

            using (Log.OnEnterAndExit())
                using (await locks.GetOrAdd(workspace.WorkspaceType, s => new AsyncLock()).LockAsync())
                {
                    var result = await CompileWorker(request.Workspace, request.ActiveBufferId, budget);

                    if (result.DiagnosticsWithinBuffers.ContainsError())
                    {
                        var compileResult = new CompileResult(
                            succeeded: false,
                            base64assembly: null,
                            result.DiagnosticsWithinBuffers,
                            requestId: request.RequestId);

                        compileResult.AddFeature(new ProjectDiagnostics(result.ProjectDiagnostics));

                        return(compileResult);
                    }

                    using (var stream = new MemoryStream())
                    {
                        result.Compilation.Emit(peStream: stream);
                        var encodedAssembly = Convert.ToBase64String(stream.ToArray());

                        var compileResult = new CompileResult(
                            succeeded: true,
                            base64assembly: encodedAssembly,
                            requestId: request.RequestId);

                        compileResult.AddFeature(new ProjectDiagnostics(result.ProjectDiagnostics));

                        return(compileResult);
                    }
                }
        }