From 3c043ce8a324e2b234c4110b8f5910872b3e4168 Mon Sep 17 00:00:00 2001 From: Ravi Chande Date: Tue, 20 Aug 2019 14:19:50 -0700 Subject: [PATCH] wip --- .../Kernel/CSharpKernelTests.cs | 25 +++++++++++++++++++ WorkspaceServer/Kernel/CSharpKernel.cs | 8 +++--- .../Kernel/CSharpKernelExtensions.cs | 14 ++++++++++- 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/WorkspaceServer.Tests/Kernel/CSharpKernelTests.cs b/WorkspaceServer.Tests/Kernel/CSharpKernelTests.cs index 9fa0772ca..397fe2cce 100644 --- a/WorkspaceServer.Tests/Kernel/CSharpKernelTests.cs +++ b/WorkspaceServer.Tests/Kernel/CSharpKernelTests.cs @@ -422,5 +422,30 @@ public async Task OnLoadAsync(IKernel kernel) .ContainSingle(e => e.Value is CodeSubmissionEvaluated && e.Value.As().Code.Contains("using System.Reflection;")); } + + [Fact] + public async Task It_can_reuse_loaded_assemblies() + { + var kernel = CreateKernel(); + + await kernel.SendAsync(new SubmitCode("#r \"nuget:Microsoft.ML.DataView, 1.3.1\"")); + await kernel.SendAsync(new SubmitCode(@"using Microsoft.ML; +void DoIt(IDataView view) +{ +}")); + await kernel.SendAsync(new SubmitCode(@" +IDataView dv = null; +DoIt(dv); +")); + + KernelEvents.ValuesOnly() + .Last() + .Should() + .BeOfType() + .Which + .Message + .Should() + .Be("(1,1): error CS0103: The name 'aaaadd' does not exist in the current context"); + } } } \ No newline at end of file diff --git a/WorkspaceServer/Kernel/CSharpKernel.cs b/WorkspaceServer/Kernel/CSharpKernel.cs index 7182d72bf..aacd5e617 100644 --- a/WorkspaceServer/Kernel/CSharpKernel.cs +++ b/WorkspaceServer/Kernel/CSharpKernel.cs @@ -23,6 +23,7 @@ using WorkspaceServer.Servers.Scripting; using CompletionItem = Microsoft.DotNet.Interactive.CompletionItem; using Task = System.Threading.Tasks.Task; +using Microsoft.CodeAnalysis.Scripting.Hosting; namespace WorkspaceServer.Kernel { @@ -40,11 +41,13 @@ public class CSharpKernel : KernelBase private StringBuilder _inputBuffer = new StringBuilder(); private ImmutableArray _metadataReferences; + private readonly InteractiveAssemblyLoader _loader; private WorkspaceFixture _fixture; public CSharpKernel() { _metadataReferences = ImmutableArray.Empty; + _loader = new InteractiveAssemblyLoader(); SetupScriptOptions(); } @@ -131,9 +134,8 @@ private async Task HandleSubmitCode( { if (_scriptState == null) { - _scriptState = await CSharpScript.RunAsync( - code, - ScriptOptions); + var script = CSharpScript.Create(code, ScriptOptions, assemblyLoader: _loader); + _scriptState = await script.RunAsync(); } else { diff --git a/WorkspaceServer/Kernel/CSharpKernelExtensions.cs b/WorkspaceServer/Kernel/CSharpKernelExtensions.cs index 5997b0be1..7727a09d7 100644 --- a/WorkspaceServer/Kernel/CSharpKernelExtensions.cs +++ b/WorkspaceServer/Kernel/CSharpKernelExtensions.cs @@ -3,7 +3,9 @@ using System.CommandLine; using System.CommandLine.Invocation; +using System.Text; using System.Threading.Tasks; +using Microsoft.CodeAnalysis; using Microsoft.DotNet.Interactive; using Microsoft.DotNet.Interactive.Commands; using Microsoft.DotNet.Interactive.Events; @@ -12,6 +14,7 @@ namespace WorkspaceServer.Kernel { + public static class CSharpKernelExtensions { public static CSharpKernel UseDefaultRendering( @@ -63,7 +66,16 @@ public static CSharpKernel UseNugetDirective(this CSharpKernel kernel) var refs = await restoreContext.AddPackage(package.PackageName, package.PackageVersion); if (refs != null) { - kernel.AddMetatadaReferences(refs); + var directives = new StringBuilder(); + foreach (var reference in refs) + { + if (reference is PortableExecutableReference pe) + { + directives.AppendLine($"#r \"{pe.FilePath}\""); + } + } + + await kernel.SendAsync(new SubmitCode(directives.ToString(), kernel.Name)); } context.OnNext(new NuGetPackageAdded(package));