From 3c9ec94e82c8ff626e3e447b6257be564cc5195d Mon Sep 17 00:00:00 2001 From: Victor XField Date: Tue, 24 Nov 2020 11:57:10 -0800 Subject: [PATCH 01/17] Initial attempt to detect .NET SDK 3.1 and display a message if not found (cherry picked from commit 59681e9219a94ca5aaeed118b3b9e5e79e33456e) --- .../LanguageServer/LanguageServer.cs | 19 ++++++++++ src/QsCompiler/LanguageServer/Program.cs | 1 + src/QsCompiler/LanguageServer/Utils.cs | 35 +++++++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/src/QsCompiler/LanguageServer/LanguageServer.cs b/src/QsCompiler/LanguageServer/LanguageServer.cs index ccb10ad6c3..fe32e94935 100644 --- a/src/QsCompiler/LanguageServer/LanguageServer.cs +++ b/src/QsCompiler/LanguageServer/LanguageServer.cs @@ -126,6 +126,25 @@ internal Task NotifyClientAsync(string method, object args) => internal Task PublishDiagnosticsAsync(PublishDiagnosticParams diagnostics) => this.NotifyClientAsync(Methods.TextDocumentPublishDiagnosticsName, diagnostics); + internal void CheckDotNetSDKVersion() + { + var sdkVersions = DotNetSDKHelper.GetSDKVersions(); + if (sdkVersions == null) + { + this.LogToWindow($"Unable to detect .NET SDK versions", MessageType.Error); + } + else + { + if (!sdkVersions.HasDotNet31) + { + this.LogToWindow($".NET SDK 3.1 not found. QDK requires .NET SDK 3.1 to work properly.", MessageType.Error); + this.ShowInWindow( + $"QDK requires .NET SDK 3.1 to work properly. Please install .NET SDK 3.1 from https://dotnet.microsoft.com/download/dotnet-core/3.1", + MessageType.Error); + } + } + } + /// /// does not actually do anything unless the corresponding flag is defined upon compilation /// diff --git a/src/QsCompiler/LanguageServer/Program.cs b/src/QsCompiler/LanguageServer/Program.cs index a389d29e6f..50407cf34f 100644 --- a/src/QsCompiler/LanguageServer/Program.cs +++ b/src/QsCompiler/LanguageServer/Program.cs @@ -140,6 +140,7 @@ private static int Run(Options options) Log("Listening...", options.LogFile); try { + server.CheckDotNetSDKVersion(); server.WaitForShutdown(); } catch (Exception ex) diff --git a/src/QsCompiler/LanguageServer/Utils.cs b/src/QsCompiler/LanguageServer/Utils.cs index f7c5425d77..1139f27c4f 100644 --- a/src/QsCompiler/LanguageServer/Utils.cs +++ b/src/QsCompiler/LanguageServer/Utils.cs @@ -4,6 +4,8 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; +using System.Diagnostics; +using System.Text.RegularExpressions; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; using Microsoft.Quantum.QsCompiler; @@ -123,4 +125,37 @@ public override void Initialize(IEventSource eventSource) } } } + + internal static class DotNetSDKHelper + { + private static readonly Regex DotNet31Regex = new Regex(@"^3\.1\.\d+", RegexOptions.Multiline | RegexOptions.Compiled); + private static readonly Regex DotNet50Regex = new Regex(@"^5\.0\.\d+", RegexOptions.Multiline | RegexOptions.Compiled); + + public class DotNetSDKVersions + { + public bool HasDotNet50 { get; set; } + public bool HasDotNet31 { get; set; } + } + + public static DotNetSDKVersions? GetSDKVersions() + { + var listSdkProcess = Process.Start( + new ProcessStartInfo() + { + FileName = "dotnet", + Arguments = "--list-sdks", + RedirectStandardOutput = true, + }); + if (listSdkProcess.WaitForExit(3000)) + { + var sdks = listSdkProcess.StandardOutput.ReadToEnd(); + return new DotNetSDKVersions() + { + HasDotNet31 = DotNet31Regex.IsMatch(sdks), + HasDotNet50 = DotNet50Regex.IsMatch(sdks), + }; + } + return null; + } + } } From 16622dc0196edb3432fe415c2e4868f6df7c0bd6 Mon Sep 17 00:00:00 2001 From: Victor XField Date: Tue, 24 Nov 2020 14:20:22 -0800 Subject: [PATCH 02/17] Show a dialog with option to open .NET 3.1 download page (cherry picked from commit b538b3dd507a71f077bd132d087091f123df4039) --- .../LanguageServer/LanguageServer.cs | 29 +++++++++++++++---- src/QsCompiler/LanguageServer/Program.cs | 2 +- src/QsCompiler/LanguageServer/Utils.cs | 27 +++++++++++++++-- 3 files changed, 49 insertions(+), 9 deletions(-) diff --git a/src/QsCompiler/LanguageServer/LanguageServer.cs b/src/QsCompiler/LanguageServer/LanguageServer.cs index fe32e94935..22f63992e4 100644 --- a/src/QsCompiler/LanguageServer/LanguageServer.cs +++ b/src/QsCompiler/LanguageServer/LanguageServer.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; +using System.Diagnostics; using System.IO; using System.Linq; using System.Reactive.Linq; @@ -123,12 +124,15 @@ public void Dispose() internal Task NotifyClientAsync(string method, object args) => this.rpc.NotifyWithParameterObjectAsync(method, args); // no need to wait for completion + internal Task InvokeAsync(string method, object args) => + this.rpc.InvokeWithParameterObjectAsync(method, args); + internal Task PublishDiagnosticsAsync(PublishDiagnosticParams diagnostics) => this.NotifyClientAsync(Methods.TextDocumentPublishDiagnosticsName, diagnostics); - internal void CheckDotNetSDKVersion() + internal async void CheckDotNetSdkVersion() { - var sdkVersions = DotNetSDKHelper.GetSDKVersions(); + var sdkVersions = DotNetSdkHelper.GetSdkVersions(); if (sdkVersions == null) { this.LogToWindow($"Unable to detect .NET SDK versions", MessageType.Error); @@ -137,10 +141,23 @@ internal void CheckDotNetSDKVersion() { if (!sdkVersions.HasDotNet31) { - this.LogToWindow($".NET SDK 3.1 not found. QDK requires .NET SDK 3.1 to work properly.", MessageType.Error); - this.ShowInWindow( - $"QDK requires .NET SDK 3.1 to work properly. Please install .NET SDK 3.1 from https://dotnet.microsoft.com/download/dotnet-core/3.1", - MessageType.Error); + const string dotnet31Url = "https://dotnet.microsoft.com/download/dotnet-core/3.1"; + this.LogToWindow($".NET SDK 3.1 not found. The Quantum Development Kit Extension requires .NET SDK 3.1 to work properly ({dotnet31Url}).", MessageType.Error); + var downloadAction = new MessageActionItem { Title = "Download" }; + var cancelAction = new MessageActionItem { Title = "No, thanks" }; + var selectedAction = await this.ShowDialogInWindowAsync( + $"The Quantum Development Kit Extension requires .NET SDK 3.1 to work properly. Please install .NET SDK 3.1.", + MessageType.Error, + new[] { downloadAction, cancelAction }); + if (selectedAction != null + && selectedAction.Title == downloadAction.Title) + { + Process.Start(new ProcessStartInfo + { + FileName = dotnet31Url, + UseShellExecute = true + }); + } } } } diff --git a/src/QsCompiler/LanguageServer/Program.cs b/src/QsCompiler/LanguageServer/Program.cs index 50407cf34f..16f4e4cbbf 100644 --- a/src/QsCompiler/LanguageServer/Program.cs +++ b/src/QsCompiler/LanguageServer/Program.cs @@ -140,7 +140,7 @@ private static int Run(Options options) Log("Listening...", options.LogFile); try { - server.CheckDotNetSDKVersion(); + server.CheckDotNetSdkVersion(); server.WaitForShutdown(); } catch (Exception ex) diff --git a/src/QsCompiler/LanguageServer/Utils.cs b/src/QsCompiler/LanguageServer/Utils.cs index 1139f27c4f..2bc352f90b 100644 --- a/src/QsCompiler/LanguageServer/Utils.cs +++ b/src/QsCompiler/LanguageServer/Utils.cs @@ -6,6 +6,7 @@ using System.Collections.Immutable; using System.Diagnostics; using System.Text.RegularExpressions; +using System.Threading.Tasks; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; using Microsoft.Quantum.QsCompiler; @@ -35,6 +36,23 @@ internal static void ShowInWindow(this QsLanguageServer server, string text, Mes _ = server.NotifyClientAsync(Methods.WindowShowMessageName, message); } + /// + /// Shows a dialog window with options (actions) to the user, and returns the selected option (action). + /// + internal static async Task ShowDialogInWindowAsync(this QsLanguageServer server, string text, MessageType severity, MessageActionItem[] actionItems) + { + var message = + new ShowMessageRequestParams() + { + Message = text, + MessageType = severity, + Actions = actionItems + }; + QsCompilerError.Verify(server != null && message != null, "cannot show message - given server or text was null"); + var action = await server.InvokeAsync(Methods.WindowShowMessageRequestName, message); + return action; + } + /// /// Logs the given text in the editor. /// @@ -126,7 +144,7 @@ public override void Initialize(IEventSource eventSource) } } - internal static class DotNetSDKHelper + internal static class DotNetSdkHelper { private static readonly Regex DotNet31Regex = new Regex(@"^3\.1\.\d+", RegexOptions.Multiline | RegexOptions.Compiled); private static readonly Regex DotNet50Regex = new Regex(@"^5\.0\.\d+", RegexOptions.Multiline | RegexOptions.Compiled); @@ -134,10 +152,11 @@ internal static class DotNetSDKHelper public class DotNetSDKVersions { public bool HasDotNet50 { get; set; } + public bool HasDotNet31 { get; set; } } - public static DotNetSDKVersions? GetSDKVersions() + public static DotNetSDKVersions? GetSdkVersions() { var listSdkProcess = Process.Start( new ProcessStartInfo() @@ -148,6 +167,10 @@ public class DotNetSDKVersions }); if (listSdkProcess.WaitForExit(3000)) { + if (listSdkProcess.ExitCode != 0) + { + return null; + } var sdks = listSdkProcess.StandardOutput.ReadToEnd(); return new DotNetSDKVersions() { From f992fca79ff4029dd32e4aa233ffd9b903bdfcc4 Mon Sep 17 00:00:00 2001 From: Victor XField Date: Tue, 24 Nov 2020 14:22:12 -0800 Subject: [PATCH 03/17] Better error message (cherry picked from commit 28e79dd23260af8422d0a9080cb31f0978e05fcf) --- src/QsCompiler/LanguageServer/LanguageServer.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/QsCompiler/LanguageServer/LanguageServer.cs b/src/QsCompiler/LanguageServer/LanguageServer.cs index 22f63992e4..379732dac2 100644 --- a/src/QsCompiler/LanguageServer/LanguageServer.cs +++ b/src/QsCompiler/LanguageServer/LanguageServer.cs @@ -142,11 +142,11 @@ internal async void CheckDotNetSdkVersion() if (!sdkVersions.HasDotNet31) { const string dotnet31Url = "https://dotnet.microsoft.com/download/dotnet-core/3.1"; - this.LogToWindow($".NET SDK 3.1 not found. The Quantum Development Kit Extension requires .NET SDK 3.1 to work properly ({dotnet31Url}).", MessageType.Error); + this.LogToWindow($".NET SDK 3.1 not found. Quantum Development Kit Extension requires .NET Core SDK 3.1 to work properly ({dotnet31Url}).", MessageType.Error); var downloadAction = new MessageActionItem { Title = "Download" }; var cancelAction = new MessageActionItem { Title = "No, thanks" }; var selectedAction = await this.ShowDialogInWindowAsync( - $"The Quantum Development Kit Extension requires .NET SDK 3.1 to work properly. Please install .NET SDK 3.1.", + $"Quantum Development Kit Extension requires .NET Core SDK 3.1 to work properly. Please install .NET SDK 3.1.", MessageType.Error, new[] { downloadAction, cancelAction }); if (selectedAction != null From 1373031c436e5dd0e49d2d0a45548df4ed06e052 Mon Sep 17 00:00:00 2001 From: XField <58103249+vxfield@users.noreply.github.com> Date: Tue, 24 Nov 2020 15:45:07 -0800 Subject: [PATCH 04/17] Update src/QsCompiler/LanguageServer/Utils.cs Co-authored-by: Sarah Marshall <33814365+samarsha@users.noreply.github.com> (cherry picked from commit f2cd93bee2e1fb033cdc9ce13b6c8e0751b27dac) --- src/QsCompiler/LanguageServer/Utils.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/QsCompiler/LanguageServer/Utils.cs b/src/QsCompiler/LanguageServer/Utils.cs index 2bc352f90b..1bf1acad5b 100644 --- a/src/QsCompiler/LanguageServer/Utils.cs +++ b/src/QsCompiler/LanguageServer/Utils.cs @@ -48,7 +48,6 @@ internal static async Task ShowDialogInWindowAsync(this QsLan MessageType = severity, Actions = actionItems }; - QsCompilerError.Verify(server != null && message != null, "cannot show message - given server or text was null"); var action = await server.InvokeAsync(Methods.WindowShowMessageRequestName, message); return action; } From 8f9de2aa86197a3f240811120febe668a1ffb38c Mon Sep 17 00:00:00 2001 From: XField <58103249+vxfield@users.noreply.github.com> Date: Tue, 24 Nov 2020 15:45:23 -0800 Subject: [PATCH 05/17] Update src/QsCompiler/LanguageServer/Utils.cs Co-authored-by: Sarah Marshall <33814365+samarsha@users.noreply.github.com> (cherry picked from commit de463e00ac8d0011a6405b58c6df61ddccd79c4d) --- src/QsCompiler/LanguageServer/Utils.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/QsCompiler/LanguageServer/Utils.cs b/src/QsCompiler/LanguageServer/Utils.cs index 1bf1acad5b..2b5e920da7 100644 --- a/src/QsCompiler/LanguageServer/Utils.cs +++ b/src/QsCompiler/LanguageServer/Utils.cs @@ -48,8 +48,7 @@ internal static async Task ShowDialogInWindowAsync(this QsLan MessageType = severity, Actions = actionItems }; - var action = await server.InvokeAsync(Methods.WindowShowMessageRequestName, message); - return action; + return await server.InvokeAsync(Methods.WindowShowMessageRequestName, message); } /// From aeb8972b6ef3a27a4ac671c126eda822af692420 Mon Sep 17 00:00:00 2001 From: XField <58103249+vxfield@users.noreply.github.com> Date: Tue, 24 Nov 2020 15:46:00 -0800 Subject: [PATCH 06/17] Update src/QsCompiler/LanguageServer/LanguageServer.cs Co-authored-by: Sarah Marshall <33814365+samarsha@users.noreply.github.com> (cherry picked from commit 7911bd54ec92ba4fd767e18da69511289c037236) --- src/QsCompiler/LanguageServer/LanguageServer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/QsCompiler/LanguageServer/LanguageServer.cs b/src/QsCompiler/LanguageServer/LanguageServer.cs index 379732dac2..7dafa60be5 100644 --- a/src/QsCompiler/LanguageServer/LanguageServer.cs +++ b/src/QsCompiler/LanguageServer/LanguageServer.cs @@ -135,7 +135,7 @@ internal async void CheckDotNetSdkVersion() var sdkVersions = DotNetSdkHelper.GetSdkVersions(); if (sdkVersions == null) { - this.LogToWindow($"Unable to detect .NET SDK versions", MessageType.Error); + this.LogToWindow("Unable to detect .NET SDK versions", MessageType.Error); } else { From aafbb3d3e141ccacf611548c07d18912552c45bd Mon Sep 17 00:00:00 2001 From: XField <58103249+vxfield@users.noreply.github.com> Date: Tue, 24 Nov 2020 15:46:15 -0800 Subject: [PATCH 07/17] Update src/QsCompiler/LanguageServer/LanguageServer.cs Co-authored-by: Sarah Marshall <33814365+samarsha@users.noreply.github.com> (cherry picked from commit c19177d5c85697f8957910b26e9e03bdf00645d5) --- src/QsCompiler/LanguageServer/LanguageServer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/QsCompiler/LanguageServer/LanguageServer.cs b/src/QsCompiler/LanguageServer/LanguageServer.cs index 7dafa60be5..1af9bf0264 100644 --- a/src/QsCompiler/LanguageServer/LanguageServer.cs +++ b/src/QsCompiler/LanguageServer/LanguageServer.cs @@ -146,7 +146,7 @@ internal async void CheckDotNetSdkVersion() var downloadAction = new MessageActionItem { Title = "Download" }; var cancelAction = new MessageActionItem { Title = "No, thanks" }; var selectedAction = await this.ShowDialogInWindowAsync( - $"Quantum Development Kit Extension requires .NET Core SDK 3.1 to work properly. Please install .NET SDK 3.1.", + "Quantum Development Kit Extension requires .NET Core SDK 3.1 to work properly. Please install .NET SDK 3.1.", MessageType.Error, new[] { downloadAction, cancelAction }); if (selectedAction != null From 140d10d0b5871e0a6854b6b93d73a5fd37ff28d6 Mon Sep 17 00:00:00 2001 From: Victor XField Date: Tue, 24 Nov 2020 16:15:19 -0800 Subject: [PATCH 08/17] Addressing minor PR review comments (cherry picked from commit 283cecdf4c74f6d3e5ef65b015c305a4dd10d070) --- src/QsCompiler/LanguageServer/LanguageServer.cs | 10 +++++----- src/QsCompiler/LanguageServer/Utils.cs | 16 ++-------------- 2 files changed, 7 insertions(+), 19 deletions(-) diff --git a/src/QsCompiler/LanguageServer/LanguageServer.cs b/src/QsCompiler/LanguageServer/LanguageServer.cs index 1af9bf0264..8d708aa89b 100644 --- a/src/QsCompiler/LanguageServer/LanguageServer.cs +++ b/src/QsCompiler/LanguageServer/LanguageServer.cs @@ -132,21 +132,21 @@ internal Task PublishDiagnosticsAsync(PublishDiagnosticParams diagnostics) => internal async void CheckDotNetSdkVersion() { - var sdkVersions = DotNetSdkHelper.GetSdkVersions(); - if (sdkVersions == null) + var isDotNet31Installed = DotNetSdkHelper.IsDotNet31Installed(); + if (isDotNet31Installed == null) { this.LogToWindow("Unable to detect .NET SDK versions", MessageType.Error); } else { - if (!sdkVersions.HasDotNet31) + if (isDotNet31Installed != true) { const string dotnet31Url = "https://dotnet.microsoft.com/download/dotnet-core/3.1"; - this.LogToWindow($".NET SDK 3.1 not found. Quantum Development Kit Extension requires .NET Core SDK 3.1 to work properly ({dotnet31Url}).", MessageType.Error); + this.LogToWindow($".NET Core SDK 3.1 not found. Quantum Development Kit Extension requires .NET Core SDK 3.1 to work properly ({dotnet31Url}).", MessageType.Error); var downloadAction = new MessageActionItem { Title = "Download" }; var cancelAction = new MessageActionItem { Title = "No, thanks" }; var selectedAction = await this.ShowDialogInWindowAsync( - "Quantum Development Kit Extension requires .NET Core SDK 3.1 to work properly. Please install .NET SDK 3.1.", + "Quantum Development Kit Extension requires .NET Core SDK 3.1 to work properly. Please install .NET Core SDK 3.1.", MessageType.Error, new[] { downloadAction, cancelAction }); if (selectedAction != null diff --git a/src/QsCompiler/LanguageServer/Utils.cs b/src/QsCompiler/LanguageServer/Utils.cs index 2b5e920da7..516032ab03 100644 --- a/src/QsCompiler/LanguageServer/Utils.cs +++ b/src/QsCompiler/LanguageServer/Utils.cs @@ -145,16 +145,8 @@ public override void Initialize(IEventSource eventSource) internal static class DotNetSdkHelper { private static readonly Regex DotNet31Regex = new Regex(@"^3\.1\.\d+", RegexOptions.Multiline | RegexOptions.Compiled); - private static readonly Regex DotNet50Regex = new Regex(@"^5\.0\.\d+", RegexOptions.Multiline | RegexOptions.Compiled); - public class DotNetSDKVersions - { - public bool HasDotNet50 { get; set; } - - public bool HasDotNet31 { get; set; } - } - - public static DotNetSDKVersions? GetSdkVersions() + public static bool? IsDotNet31Installed() { var listSdkProcess = Process.Start( new ProcessStartInfo() @@ -170,11 +162,7 @@ public class DotNetSDKVersions return null; } var sdks = listSdkProcess.StandardOutput.ReadToEnd(); - return new DotNetSDKVersions() - { - HasDotNet31 = DotNet31Regex.IsMatch(sdks), - HasDotNet50 = DotNet50Regex.IsMatch(sdks), - }; + return DotNet31Regex.IsMatch(sdks); } return null; } From b02a8cacc28ba629513d5511ab1a5da014758bed Mon Sep 17 00:00:00 2001 From: Victor XField Date: Tue, 24 Nov 2020 23:18:03 -0800 Subject: [PATCH 09/17] Add global.json and set working directory (cherry picked from commit 833af12029eedb94c9b2d66a2afe9daea3440a55) --- src/QsCompiler/LanguageServer/LanguageServer.cs | 2 +- src/QsCompiler/LanguageServer/LanguageServer.csproj | 8 ++++++++ src/QsCompiler/LanguageServer/Program.cs | 5 +++++ src/QsCompiler/LanguageServer/global.json | 6 ++++++ 4 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 src/QsCompiler/LanguageServer/global.json diff --git a/src/QsCompiler/LanguageServer/LanguageServer.cs b/src/QsCompiler/LanguageServer/LanguageServer.cs index 8d708aa89b..6a29b7baf2 100644 --- a/src/QsCompiler/LanguageServer/LanguageServer.cs +++ b/src/QsCompiler/LanguageServer/LanguageServer.cs @@ -146,7 +146,7 @@ internal async void CheckDotNetSdkVersion() var downloadAction = new MessageActionItem { Title = "Download" }; var cancelAction = new MessageActionItem { Title = "No, thanks" }; var selectedAction = await this.ShowDialogInWindowAsync( - "Quantum Development Kit Extension requires .NET Core SDK 3.1 to work properly. Please install .NET Core SDK 3.1.", + "Quantum Development Kit Extension requires .NET Core SDK 3.1 to work properly. Please install .NET Core SDK 3.1 and restart Visual Studio.", MessageType.Error, new[] { downloadAction, cancelAction }); if (selectedAction != null diff --git a/src/QsCompiler/LanguageServer/LanguageServer.csproj b/src/QsCompiler/LanguageServer/LanguageServer.csproj index 92975a783c..58e2c233a4 100644 --- a/src/QsCompiler/LanguageServer/LanguageServer.csproj +++ b/src/QsCompiler/LanguageServer/LanguageServer.csproj @@ -12,6 +12,9 @@ DEBUG;TRACE + + + true @@ -37,4 +40,9 @@ + + + Always + + diff --git a/src/QsCompiler/LanguageServer/Program.cs b/src/QsCompiler/LanguageServer/Program.cs index 16f4e4cbbf..c566d16d64 100644 --- a/src/QsCompiler/LanguageServer/Program.cs +++ b/src/QsCompiler/LanguageServer/Program.cs @@ -83,6 +83,11 @@ private static int LogAndExit(ReturnCode code, string? logFile = null, string? m public static int Main(string[] args) { + // We need to set the current directory to the same directory of + // the LanguageServer executable so that it will pick the global.json file + // and force the MSBuildLocator to use .NET Core SDK 3.1 + Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory); + var parser = new Parser(parser => parser.HelpWriter = null); // we want our own custom format for the version info var options = parser.ParseArguments(args); return options.MapResult( diff --git a/src/QsCompiler/LanguageServer/global.json b/src/QsCompiler/LanguageServer/global.json new file mode 100644 index 0000000000..0b2cf8aa3c --- /dev/null +++ b/src/QsCompiler/LanguageServer/global.json @@ -0,0 +1,6 @@ +{ + "sdk": { + "version": "3.1.100", + "rollForward": "latestFeature" + } +} From 4f89b230b3fa092500ead3227ac51edcedc404fc Mon Sep 17 00:00:00 2001 From: Victor XField Date: Wed, 25 Nov 2020 00:23:13 -0800 Subject: [PATCH 10/17] Continue to start the server even if there were issues with the MSBuildLocator (cherry picked from commit 64d7d110cf49f2d4c6855634b5a60ae66ba39535) --- src/QsCompiler/LanguageServer/LanguageServer.cs | 3 ++- src/QsCompiler/LanguageServer/Program.cs | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/QsCompiler/LanguageServer/LanguageServer.cs b/src/QsCompiler/LanguageServer/LanguageServer.cs index 6a29b7baf2..515c811565 100644 --- a/src/QsCompiler/LanguageServer/LanguageServer.cs +++ b/src/QsCompiler/LanguageServer/LanguageServer.cs @@ -155,7 +155,8 @@ internal async void CheckDotNetSdkVersion() Process.Start(new ProcessStartInfo { FileName = dotnet31Url, - UseShellExecute = true + UseShellExecute = true, + CreateNoWindow = true, }); } } diff --git a/src/QsCompiler/LanguageServer/Program.cs b/src/QsCompiler/LanguageServer/Program.cs index c566d16d64..eb5849195d 100644 --- a/src/QsCompiler/LanguageServer/Program.cs +++ b/src/QsCompiler/LanguageServer/Program.cs @@ -126,7 +126,6 @@ private static int Run(Options options) catch (Exception ex) { Log("[ERROR] MsBuildLocator could not register defaults.", options.LogFile); - return LogAndExit(ReturnCode.MSBUILD_UNINITIALIZED, options.LogFile, ex.ToString()); } QsLanguageServer server; From d8462ceac7f642d095e20aa5262edaceb7ceb244 Mon Sep 17 00:00:00 2001 From: Victor XField Date: Wed, 25 Nov 2020 01:13:35 -0800 Subject: [PATCH 11/17] Add comments to MsBuildLocator exception handling (cherry picked from commit dc99a4b8f9a8a7d32434555ad10583affb604ee9) --- src/QsCompiler/LanguageServer/Program.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/QsCompiler/LanguageServer/Program.cs b/src/QsCompiler/LanguageServer/Program.cs index eb5849195d..a5a7445ca5 100644 --- a/src/QsCompiler/LanguageServer/Program.cs +++ b/src/QsCompiler/LanguageServer/Program.cs @@ -126,6 +126,9 @@ private static int Run(Options options) catch (Exception ex) { Log("[ERROR] MsBuildLocator could not register defaults.", options.LogFile); + // Don't exit here, since exiting without establishing a connection will result in a cryptic failure of the extension. + // Instead, we proceed to create a server instance and establish the connection. + // Any errors can then be properly processed via the standard server-client communication as needed. } QsLanguageServer server; From e11e1586b865ce7315b145cd8f1614e7d56f9d7f Mon Sep 17 00:00:00 2001 From: Victor XField Date: Thu, 14 Jan 2021 14:07:50 -0800 Subject: [PATCH 12/17] Use .NET 5.0 SDK and build the Language Server to target the 5.0 runtime --- build/init.yml | 4 ++-- src/QsCompiler/LanguageServer/LanguageServer.csproj | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/build/init.yml b/build/init.yml index a8475046fe..6cfa433ea5 100644 --- a/build/init.yml +++ b/build/init.yml @@ -16,7 +16,7 @@ steps: versionSpec: '5.6.0' - task: UseDotNet@2 - displayName: 'Use .NET Core SDK 3.1.300' + displayName: 'Use .NET SDK 5.0.101' inputs: packageType: sdk - version: '3.1.300' \ No newline at end of file + version: '5.0.101' diff --git a/src/QsCompiler/LanguageServer/LanguageServer.csproj b/src/QsCompiler/LanguageServer/LanguageServer.csproj index 58e2c233a4..067a78ddaa 100644 --- a/src/QsCompiler/LanguageServer/LanguageServer.csproj +++ b/src/QsCompiler/LanguageServer/LanguageServer.csproj @@ -2,12 +2,13 @@ Microsoft.Quantum.QsLanguageServer - netcoreapp3.1 + net5.0 Exe true + true DEBUG;TRACE From a98f62400a1a7f720c31977f7bce29f724b329b7 Mon Sep 17 00:00:00 2001 From: Sarah Marshall Date: Tue, 19 Jan 2021 13:29:56 -0800 Subject: [PATCH 13/17] Revert "Use .NET 5.0 SDK and build the Language Server to target the 5.0 runtime" This reverts commit e11e1586b865ce7315b145cd8f1614e7d56f9d7f. --- build/init.yml | 4 ++-- src/QsCompiler/LanguageServer/LanguageServer.csproj | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/build/init.yml b/build/init.yml index 6cfa433ea5..a8475046fe 100644 --- a/build/init.yml +++ b/build/init.yml @@ -16,7 +16,7 @@ steps: versionSpec: '5.6.0' - task: UseDotNet@2 - displayName: 'Use .NET SDK 5.0.101' + displayName: 'Use .NET Core SDK 3.1.300' inputs: packageType: sdk - version: '5.0.101' + version: '3.1.300' \ No newline at end of file diff --git a/src/QsCompiler/LanguageServer/LanguageServer.csproj b/src/QsCompiler/LanguageServer/LanguageServer.csproj index 067a78ddaa..58e2c233a4 100644 --- a/src/QsCompiler/LanguageServer/LanguageServer.csproj +++ b/src/QsCompiler/LanguageServer/LanguageServer.csproj @@ -2,13 +2,12 @@ Microsoft.Quantum.QsLanguageServer - net5.0 + netcoreapp3.1 Exe true - true DEBUG;TRACE From 9388319e8b2016eeb4f1852a4ab2decde2562c0c Mon Sep 17 00:00:00 2001 From: Sarah Marshall Date: Tue, 19 Jan 2021 13:41:55 -0800 Subject: [PATCH 14/17] Fix warnings --- src/QsCompiler/LanguageServer/Program.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/QsCompiler/LanguageServer/Program.cs b/src/QsCompiler/LanguageServer/Program.cs index afd6fff85d..3c79e8e2f8 100644 --- a/src/QsCompiler/LanguageServer/Program.cs +++ b/src/QsCompiler/LanguageServer/Program.cs @@ -123,12 +123,13 @@ private static int Run(Options options) return null; }; } - catch (Exception ex) + catch (Exception) { Log("[ERROR] MsBuildLocator could not register defaults.", options.LogFile); - // Don't exit here, since exiting without establishing a connection will result in a cryptic failure of the extension. - // Instead, we proceed to create a server instance and establish the connection. - // Any errors can then be properly processed via the standard server-client communication as needed. + + // Don't exit here, since exiting without establishing a connection will result in a cryptic failure of the extension. + // Instead, we proceed to create a server instance and establish the connection. + // Any errors can then be properly processed via the standard server-client communication as needed. } QsLanguageServer server; From 3ce2822ccdde772fe857cc242c8b7e297b3f84ce Mon Sep 17 00:00:00 2001 From: Sarah Marshall Date: Tue, 19 Jan 2021 13:59:22 -0800 Subject: [PATCH 15/17] Rename global.json --- src/QsCompiler/LanguageServer/LanguageServer.csproj | 9 +++------ .../{global.json => global.language-server.json} | 0 2 files changed, 3 insertions(+), 6 deletions(-) rename src/QsCompiler/LanguageServer/{global.json => global.language-server.json} (100%) diff --git a/src/QsCompiler/LanguageServer/LanguageServer.csproj b/src/QsCompiler/LanguageServer/LanguageServer.csproj index ea07f5f9c5..5e0c4656cf 100644 --- a/src/QsCompiler/LanguageServer/LanguageServer.csproj +++ b/src/QsCompiler/LanguageServer/LanguageServer.csproj @@ -12,9 +12,6 @@ DEBUG;TRACE - - - true @@ -37,8 +34,8 @@ - - Always - + + PreserveNewest + diff --git a/src/QsCompiler/LanguageServer/global.json b/src/QsCompiler/LanguageServer/global.language-server.json similarity index 100% rename from src/QsCompiler/LanguageServer/global.json rename to src/QsCompiler/LanguageServer/global.language-server.json From 38676d25dd3835694e272cd4695f096de0821769 Mon Sep 17 00:00:00 2001 From: Sarah Marshall Date: Tue, 19 Jan 2021 14:03:13 -0800 Subject: [PATCH 16/17] Preserve log of exception --- src/QsCompiler/LanguageServer/Program.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/QsCompiler/LanguageServer/Program.cs b/src/QsCompiler/LanguageServer/Program.cs index 3c79e8e2f8..5115feddd6 100644 --- a/src/QsCompiler/LanguageServer/Program.cs +++ b/src/QsCompiler/LanguageServer/Program.cs @@ -123,13 +123,13 @@ private static int Run(Options options) return null; }; } - catch (Exception) + catch (Exception ex) { - Log("[ERROR] MsBuildLocator could not register defaults.", options.LogFile); - // Don't exit here, since exiting without establishing a connection will result in a cryptic failure of the extension. // Instead, we proceed to create a server instance and establish the connection. // Any errors can then be properly processed via the standard server-client communication as needed. + Log("[ERROR] MsBuildLocator could not register defaults.", options.LogFile); + Log(ex, options.LogFile); } QsLanguageServer server; From 2d9c1b458ffffdb06eab3450eff31c358163db77 Mon Sep 17 00:00:00 2001 From: Sarah Marshall Date: Tue, 19 Jan 2021 15:59:23 -0800 Subject: [PATCH 17/17] Check null from Process.Start --- src/QsCompiler/LanguageServer/Utils.cs | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/QsCompiler/LanguageServer/Utils.cs b/src/QsCompiler/LanguageServer/Utils.cs index 414e30c99e..105c4f447a 100644 --- a/src/QsCompiler/LanguageServer/Utils.cs +++ b/src/QsCompiler/LanguageServer/Utils.cs @@ -149,23 +149,19 @@ internal static class DotNetSdkHelper public static bool? IsDotNet31Installed() { - var listSdkProcess = Process.Start( - new ProcessStartInfo() - { - FileName = "dotnet", - Arguments = "--list-sdks", - RedirectStandardOutput = true, - }); - if (listSdkProcess.WaitForExit(3000)) + var process = Process.Start(new ProcessStartInfo { - if (listSdkProcess.ExitCode != 0) - { - return null; - } - var sdks = listSdkProcess.StandardOutput.ReadToEnd(); - return DotNet31Regex.IsMatch(sdks); + FileName = "dotnet", + Arguments = "--list-sdks", + RedirectStandardOutput = true, + }); + if (process?.WaitForExit(3000) != true || process.ExitCode != 0) + { + return null; } - return null; + + var sdks = process.StandardOutput.ReadToEnd(); + return DotNet31Regex.IsMatch(sdks); } } }