From e22a8a1484f4aed8a0e090611b8680c76dd7aa02 Mon Sep 17 00:00:00 2001 From: Allister Beharry Date: Thu, 25 Jan 2024 19:37:25 -0400 Subject: [PATCH] Add local install vscode-solidity npm package on language server activate. --- src/Stratis.DevEx.Base/Runtime.cs | 123 ++++++++++++++++++ .../SolidityLanguageClient.cs | 85 +++++++++--- .../SolidityLanguageSettings.json | 2 +- .../Stratis.VS.StratisEVM.csproj | 6 + .../StratisEVMPackage.cs | 41 +++++- src/Stratis.VS.StratisEVM/VSUtil.cs | 43 ++++++ src/Stratis.VS.StratisEVM/package.json | 11 ++ .../solidity-0.0.165.tgz | Bin 0 -> 36064 bytes tests/solidity/test2/BasicContract.sol | 9 +- 9 files changed, 294 insertions(+), 26 deletions(-) create mode 100644 src/Stratis.VS.StratisEVM/package.json create mode 100644 src/Stratis.VS.StratisEVM/solidity-0.0.165.tgz diff --git a/src/Stratis.DevEx.Base/Runtime.cs b/src/Stratis.DevEx.Base/Runtime.cs index 33c7084..80861ae 100644 --- a/src/Stratis.DevEx.Base/Runtime.cs +++ b/src/Stratis.DevEx.Base/Runtime.cs @@ -289,6 +289,129 @@ private static void AppDomain_UnhandledException(object sender, UnhandledExcepti } } + public static Dictionary RunCmd(string filename, string arguments, string workingdirectory) + { + ProcessStartInfo info = new ProcessStartInfo(); + info.FileName = filename; + info.Arguments = arguments; + info.WorkingDirectory = workingdirectory; + info.RedirectStandardOutput = true; + info.RedirectStandardError = true; + info.UseShellExecute = false; + info.CreateNoWindow = true; + var output = new Dictionary(); + using (var process = new Process()) + { + process.StartInfo = info; + try + { + if (!process.Start()) + { + output["error"] = ("Could not start {file} {args} in {dir}.", info.FileName, info.Arguments, info.WorkingDirectory); + return output; + } + var stdout = process.StandardOutput.ReadToEnd(); + var stderr = process.StandardError.ReadToEnd(); + if (stdout != null && stdout.Length > 0) + { + output["stdout"] = stdout; + } + if (stderr != null && stderr.Length > 0) + { + output["stderr"] = stderr; + } + return output; + } + catch (Exception ex) + { + output["exception"] = ex; + return output; + } + } + } + + public static async Task> RunCmdAsync(string filename, string arguments, string workingdirectory) + { + ProcessStartInfo info = new ProcessStartInfo(); + info.FileName = filename; + info.Arguments = arguments; + info.WorkingDirectory = workingdirectory; + info.RedirectStandardOutput = true; + info.RedirectStandardError = true; + info.UseShellExecute = false; + info.CreateNoWindow = true; + var output = new Dictionary(); + using (var process = new Process()) + { + process.StartInfo = info; + try + { + if (!process.Start()) + { + output["error"] = ("Could not start {file} {args} in {dir}.", info.FileName, info.Arguments, info.WorkingDirectory); + return output; + } + var stdout = await process.StandardOutput.ReadToEndAsync(); + var stderr = await process.StandardError.ReadToEndAsync(); + if (stdout != null && stdout.Length > 0) + { + output["stdout"] = stdout; + } + if (stderr != null && stderr.Length > 0) + { + output["stderr"] = stderr; + } + return output; + } + catch (Exception ex) + { + output["exception"] = ex; + return output; + } + } + } + + public static bool CheckRunCmdOutput(Dictionary output, string checktext) + { + if (output.ContainsKey("error") || output.ContainsKey("exception")) + { + if (output.ContainsKey("error")) + { + Error((string)output["error"]); + } + if (output.ContainsKey("exception")) + { + Error((Exception) output["exception"], "Exception thrown during process execution."); + } + return false; + } + else + { + if (output.ContainsKey("stderr")) + { + var stderr = (string)output["stderr"]; + Info(stderr); + } + if (output.ContainsKey("stdout")) + { + var stdout = (string)output["stdout"]; + Info(stdout); + if (stdout.Contains(checktext)) + { + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + } + public static void CopyDirectory(string sourceDir, string destinationDir, bool recursive = false) { using var op = Begin("Copying {0} to {1}", sourceDir, destinationDir); diff --git a/src/Stratis.VS.StratisEVM/SolidityLanguageClient.cs b/src/Stratis.VS.StratisEVM/SolidityLanguageClient.cs index 92ec70d..ff719e7 100644 --- a/src/Stratis.VS.StratisEVM/SolidityLanguageClient.cs +++ b/src/Stratis.VS.StratisEVM/SolidityLanguageClient.cs @@ -24,6 +24,7 @@ using Microsoft.VisualStudio.Shell.Interop; using System.Windows.Ink; using Stratis.VS.StratisEVM; +using System.Text; namespace Stratis.VS { @@ -45,8 +46,8 @@ public SolidityLanguageClient() #endregion #region Properties - public static string SolutionOpenFolder {get; set;} - + public static string SolutionOpenFolder { get; set; } + public string Name => "Solidity Language Extension"; public IEnumerable ConfigurationSections @@ -77,8 +78,6 @@ internal static SolidityLanguageClient Instance set; } - internal System.Diagnostics.Process ServerProcess { get; set; } - internal JsonRpc Rpc { get; @@ -86,8 +85,10 @@ internal JsonRpc Rpc } #endregion + #region Events public event AsyncEventHandler StartAsync; public event AsyncEventHandler StopAsync; + #endregion #region Methods protected bool StartLanguageServerProcess() @@ -95,8 +96,9 @@ protected bool StartLanguageServerProcess() ProcessStartInfo info = new ProcessStartInfo(); var programPath = "cmd.exe"; info.FileName = programPath; - info.Arguments = "/c " + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "npm", "nomicfoundation-solidity-language-server.cmd") + " --stdio"; - //info.Arguments = "/c " + "node " + "c:\\Projects\\vscode-solidity\\dist\\cli\\server.js" + " --stdio"; + //info.Arguments = "/c " + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "npm", "nomicfoundation-solidity-language-server.cmd") + " --stdio"; + info.Arguments = "/c " + "node \"" + Path.Combine(Runtime.AssemblyLocation, "node_modules", "solidity", "dist", "cli", "server.js") + "\" --stdio"; + info.WorkingDirectory = AssemblyLocation; info.RedirectStandardInput = true; info.RedirectStandardOutput = true; info.UseShellExecute = false; @@ -108,15 +110,51 @@ protected bool StartLanguageServerProcess() { Info("Language server proceess exited."); }; - ServerProcess = process; - return process.Start(); + serverProcess = process; + try + { + return process.Start(); + } + catch (Exception ex) + { + Error(ex, "Exception thrown starting language server process."); + return false; + } + + } + + public static Dictionary InstallVSCodeSolidityLanguageServer() + { + return RunCmd("cmd.exe", "/c npm install solidity-0.0.165.tgz --force --quiet --no-progress", AssemblyLocation); + } + + public static async Task> InstallVSCodeSolidityLanguageServerAsync() + { + return await RunCmdAsync("cmd.exe", "/c npm install solidity-0.0.165.tgz --force --quiet --no-progress", AssemblyLocation); } #region ILanguageClient, ILanguageClientCustomMessage2 implementation public async Task ActivateAsync(CancellationToken token) { await Task.Yield(); - var solution = (IVsSolution) await ServiceProvider.GetGlobalServiceAsync(typeof(SVsSolution)); + if (Directory.Exists(Path.Combine(Runtime.AssemblyLocation, "node_modules")) && File.Exists(Path.Combine(Runtime.AssemblyLocation, "node_modules", "solidity", "dist", "cli", "server.js"))) + { + Info("VSCode Solidity language server present."); + } + else + { + var output = await InstallVSCodeSolidityLanguageServerAsync(); + if (CheckRunCmdOutput(output, "Run `npm audit` for details.")) + { + Info("VSCode Solidity language server installed."); + } + else + { + Error("Could not install VSCode Solidity language server."); + return null; + } + } + var solution = (IVsSolution)await ServiceProvider.GetGlobalServiceAsync(typeof(SVsSolution)); solution.GetSolutionInfo(out var dir, out var f, out var d); Info("Solution dir is {d}", dir); this.InitializationOptions = JObject.FromObject(new @@ -134,12 +172,12 @@ public async Task ActivateAsync(CancellationToken token) if (StartLanguageServerProcess()) { - Info("Started language server process {proc} {p}.", ServerProcess.StartInfo.FileName, ServerProcess.StartInfo.Arguments); - return new Connection(ServerProcess.StandardOutput.BaseStream, ServerProcess.StandardInput.BaseStream); + Info("Started language server process {proc} {p}.", serverProcess.StartInfo.FileName, serverProcess.StartInfo.Arguments); + return new Connection(serverProcess.StandardOutput.BaseStream, serverProcess.StandardInput.BaseStream); } else { - Info("Could not start language server process {proc}", ServerProcess.StartInfo.FileName); + Error("Could not start language server process: {proc} {args}. Exit code: {code}.", serverProcess.StartInfo.FileName, serverProcess.StartInfo.Arguments, serverProcess.ExitCode); return null; } } @@ -189,6 +227,8 @@ public Task OnServerInitializeFailedAsync(ILanguag #endregion #endregion + + #region Types internal class SolidityLanguageClientMiddleLayer : ILanguageClientMiddleLayer { public bool CanHandle(string methodName) @@ -198,25 +238,25 @@ public bool CanHandle(string methodName) public async Task HandleNotificationAsync(string methodName, JToken methodParam, Func sendNotification) { - Info("Notification {req} {param}.", methodName, methodParam.ToString()); - await sendNotification(methodParam); - /* + //Info("Notification {req} {param}.", methodName, methodParam.ToString()); + //await sendNotification(methodParam); + if (methodName == "textDocument/didChange") { - methodParam.Root["contentChanges"] = JArray.FromObject(new[] {new + methodParam.Root["contentChanges"] = JArray.FromObject(new[] {new { text = methodParam.Root["contentChanges"][0]["text"].Value(), } }); Info("didchange Notification {req} {param}.", methodName, methodParam.ToString()); await sendNotification(methodParam); - + } else { Info("Notification {req} {param}.", methodName, methodParam.ToString()); await sendNotification(methodParam); } - */ + } public async Task HandleRequestAsync(string methodName, JToken methodParam, Func> sendRequest) @@ -226,5 +266,14 @@ public async Task HandleRequestAsync(string methodName, JToken methodPar return resp; } } + #endregion + + #region Fields + internal System.Diagnostics.Process serverProcess; + #endregion } + + + + } diff --git a/src/Stratis.VS.StratisEVM/SolidityLanguageSettings.json b/src/Stratis.VS.StratisEVM/SolidityLanguageSettings.json index 7134b68..5a66e0e 100644 --- a/src/Stratis.VS.StratisEVM/SolidityLanguageSettings.json +++ b/src/Stratis.VS.StratisEVM/SolidityLanguageSettings.json @@ -4,5 +4,5 @@ "solidity.maxNumberOfProblems": 1, "solidity.enabledAsYouTypeCompilationErrorCheck": true, "solidity.defaultCompiler": "localFile", - "solidity.compileUsingLocalVersion": "C:\\Users\\Allister\\Downloads\\soljson.js" + "solidity.compileUsingLocalVersion": "C:\\Users\\Allister\\Downloads\\soljson-v0.8.23+commit.f704f362.js" } \ No newline at end of file diff --git a/src/Stratis.VS.StratisEVM/Stratis.VS.StratisEVM.csproj b/src/Stratis.VS.StratisEVM/Stratis.VS.StratisEVM.csproj index ad660a3..e633e26 100644 --- a/src/Stratis.VS.StratisEVM/Stratis.VS.StratisEVM.csproj +++ b/src/Stratis.VS.StratisEVM/Stratis.VS.StratisEVM.csproj @@ -64,6 +64,12 @@ true + + true + + + true + Designer diff --git a/src/Stratis.VS.StratisEVM/StratisEVMPackage.cs b/src/Stratis.VS.StratisEVM/StratisEVMPackage.cs index fd556e4..b086d7d 100644 --- a/src/Stratis.VS.StratisEVM/StratisEVMPackage.cs +++ b/src/Stratis.VS.StratisEVM/StratisEVMPackage.cs @@ -8,6 +8,9 @@ using Microsoft.VisualStudio.Shell.Interop; using Stratis.DevEx; using Microsoft.VisualStudio.TaskRunnerExplorer; +using Microsoft.IO; +using System.Windows.Threading; +using System.Collections.Generic; namespace Stratis.VS.StratisEVM { @@ -91,17 +94,53 @@ protected override async Task InitializeAsync(CancellationToken cancellationToke await this.JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken); if (VSUtil.InitializeVSServices(ServiceProvider.GlobalProvider)) { - Runtime.Info("StratisEVM package initialized."); + VSUtil.LogInfo("Stratis EVM", $"Extension assembly directory is {Runtime.AssemblyLocation}. StratisEVM package initialized."); } else { Runtime.Error("Could not initialize StratisEVM package VS services."); + return; } + + /* + if (Directory.Exists(Path.Combine(Runtime.AssemblyLocation, "node_modules")) && File.Exists(Path.Combine(Runtime.AssemblyLocation, "node_modules"))) + { + VSUtil.LogInfo("Stratis EVM", "VSCode Solidity language server present."); + } + else + { + VSUtil.LogInfo("Stratis EVM", "VSCode Solidity language server not present, installing..."); + + /* + ThreadPool.QueueUserWorkItem((o) => + { + + var output = SolidityLanguageClient.InstallVSCodeSolidityLanguageServer(); + ThreadHelper.JoinableTaskContext.MainThread. + + }); + + var output = await SolidityLanguageClient.InstallVSCodeSolidityLanguageServerAsync(); + if (VSUtil.CheckRunCmdOutput(output, "Stratis EVM", "Run `npm audit` for details.")) + { + VSUtil.LogInfo("Stratis EVM", "VSCode Solidity language server installed."); + } + else + { + VSUtil.LogError("Stratis EVM", "Could not install VSCode Solidity language server."); + } + + } + */ // When initialized asynchronously, the current thread may be a background thread at this point. // Do any initialization that requires the UI thread after switching to the UI thread. } #endregion #endregion + + #region Fields + public static Dispatcher _dispatcher; + #endregion } } diff --git a/src/Stratis.VS.StratisEVM/VSUtil.cs b/src/Stratis.VS.StratisEVM/VSUtil.cs index 5613acd..29d6b25 100644 --- a/src/Stratis.VS.StratisEVM/VSUtil.cs +++ b/src/Stratis.VS.StratisEVM/VSUtil.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics; +using System.Threading; using System.Threading.Tasks; using Microsoft.VisualStudio; using Microsoft.VisualStudio.Shell; @@ -147,6 +149,47 @@ public static void ShowLogOutputWindowPane(IServiceProvider provider, string pan Error("Could not get a reference to the VsUIShell."); } } + + public static bool CheckRunCmdOutput(Dictionary output, string logname, string checktext) + { + if (output.ContainsKey("error") || output.ContainsKey("exception")) + { + if (output.ContainsKey("error")) + { + LogError(logname, (string)output["error"]); + } + if (output.ContainsKey("exception")) + { + LogError(logname, (Exception) output["exception"]); + } + return false; + } + else + { + if (output.ContainsKey("stderr")) + { + var stderr = (string)output["stderr"]; + LogInfo(logname, stderr); + } + if (output.ContainsKey("stdout")) + { + var stdout = (string)output["stdout"]; + LogInfo(logname, stdout); + if (stdout.Contains(checktext)) + { + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + } public static bool VSServicesInitialized = false; } } diff --git a/src/Stratis.VS.StratisEVM/package.json b/src/Stratis.VS.StratisEVM/package.json new file mode 100644 index 0000000..186bc43 --- /dev/null +++ b/src/Stratis.VS.StratisEVM/package.json @@ -0,0 +1,11 @@ +{ + "name": "stratisevm-vs", + "version": "0.1.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC" +} diff --git a/src/Stratis.VS.StratisEVM/solidity-0.0.165.tgz b/src/Stratis.VS.StratisEVM/solidity-0.0.165.tgz new file mode 100644 index 0000000000000000000000000000000000000000..5c1ddafda0577ce2511da8e2502fcaa6d1b5da57 GIT binary patch literal 36064 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 literal 0 HcmV?d00001 diff --git a/tests/solidity/test2/BasicContract.sol b/tests/solidity/test2/BasicContract.sol index 9c084ea..e81f094 100644 --- a/tests/solidity/test2/BasicContract.sol +++ b/tests/solidity/test2/BasicContract.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.23; + // Uncomment this line to use console.log // import "hardhat/console.sol"; @@ -15,11 +16,7 @@ contract BasicContract { emit BasicEvent(funcArg); } - function foo(uint s) private pure { - s = 4; - } + - function foo2(string s) { - - } + }