diff --git a/Directory.Packages.props b/Directory.Packages.props index 19490e15..d081ad5a 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -10,7 +10,7 @@ 1.9.1 - + diff --git a/src/CSharpLanguageServer/CSharpLanguageServer.fsproj b/src/CSharpLanguageServer/CSharpLanguageServer.fsproj index 0bad9dd9..17671f98 100644 --- a/src/CSharpLanguageServer/CSharpLanguageServer.fsproj +++ b/src/CSharpLanguageServer/CSharpLanguageServer.fsproj @@ -29,6 +29,7 @@ + @@ -67,7 +68,6 @@ - diff --git a/src/CSharpLanguageServer/Diagnostics.fs b/src/CSharpLanguageServer/Diagnostics.fs new file mode 100644 index 00000000..fd02323e --- /dev/null +++ b/src/CSharpLanguageServer/Diagnostics.fs @@ -0,0 +1,56 @@ +namespace CSharpLanguageServer + +open System.IO +open Microsoft.Extensions.Logging +open Ionide.LanguageServerProtocol +open Ionide.LanguageServerProtocol.Server +open Ionide.LanguageServerProtocol.Types +open Ionide.LanguageServerProtocol.JsonRpc + +open CSharpLanguageServer.Types +open CSharpLanguageServer.Logging +open CSharpLanguageServer.RoslynHelpers + +module Diagnostics = + let private logger = Logging.getLoggerByName "Diagnostics" + + type LspClientStub() = + interface System.IDisposable with + member _.Dispose() = () + + interface ILspClient with + member _.WindowShowMessage(p: ShowMessageParams) = async { logger.LogDebug("WindowShowMessage: {message}", p.Message); return () } + member _.WindowLogMessage(p: LogMessageParams) = async { logger.LogDebug("WindowLogMessage: {message}", p.Message); return () } + member _.TelemetryEvent(_: LSPAny) = async { return () } + member _.TextDocumentPublishDiagnostics(_: PublishDiagnosticsParams) = async { return () } + member _.LogTrace(_: LogTraceParams) = async { return () } + member _.CancelRequest(_: CancelParams) = async { return () } + member _.Progress(_: ProgressParams) = async { return () } + member _.WorkspaceWorkspaceFolders() = async { return LspResult.Ok None } + member _.WorkspaceConfiguration(_: ConfigurationParams) = async { return LspResult.Ok [||] } + member _.WindowWorkDoneProgressCreate(_: WorkDoneProgressCreateParams) = async { return LspResult.Ok () } + member _.WorkspaceSemanticTokensRefresh() = async { return LspResult.Ok () } + member _.WindowShowDocument(_: ShowDocumentParams) = async { return LspResult.Ok { Success = false } } + member _.WorkspaceInlineValueRefresh() = async { return LspResult.Ok () } + member _.WorkspaceInlayHintRefresh() = async { return LspResult.Ok () } + member _.WorkspaceDiagnosticRefresh() = async { return LspResult.Ok () } + member _.ClientRegisterCapability(_: RegistrationParams) = async { return LspResult.Ok () } + member _.ClientUnregisterCapability(_: UnregistrationParams) = async { return LspResult.Ok () } + member _.WindowShowMessageRequest(_: ShowMessageRequestParams) = async { return LspResult.Ok None } + member _.WorkspaceCodeLensRefresh() = async { return LspResult.Ok () } + member _.WorkspaceApplyEdit(_: ApplyWorkspaceEditParams) = async { return LspResult.Ok { Applied = false; FailureReason = None; FailedChange = None } } + + let diagnoseSolution (settings: ServerSettings): Async = async { + logger.LogDebug("diagnoseSolution: settings={settings}", settings) + + logger.LogDebug("diagnoseSolution: loading solution..") + + let lspClient = new LspClientStub() + //let cwd = (string (Directory.GetCurrentDirectory()) + let cwd = "/Users/bob/src/test-csharp-net8" + let! sln = loadSolutionOnSolutionPathOrDir lspClient logger None cwd + + let exitCode = 0 + + return exitCode + } diff --git a/src/CSharpLanguageServer/Options.fs b/src/CSharpLanguageServer/Options.fs deleted file mode 100644 index dea63215..00000000 --- a/src/CSharpLanguageServer/Options.fs +++ /dev/null @@ -1,16 +0,0 @@ -namespace CSharpLanguageServer - -module Options = - open Argu - - type CLIArguments = - | [] Version - | [] LogLevel of level:string - | [] Solution of solution:string - with - interface IArgParserTemplate with - member s.Usage = - match s with - | Version -> "display versioning information" - | Solution _ -> ".sln file to load (relative to CWD)" - | LogLevel _ -> "log level, ; default is `log`" diff --git a/src/CSharpLanguageServer/Program.fs b/src/CSharpLanguageServer/Program.fs index b8fd309b..e7218c91 100644 --- a/src/CSharpLanguageServer/Program.fs +++ b/src/CSharpLanguageServer/Program.fs @@ -9,20 +9,54 @@ open Microsoft.Extensions.Logging open CSharpLanguageServer.Types open CSharpLanguageServer.Lsp open CSharpLanguageServer.Logging +open CSharpLanguageServer.Diagnostics + + +type CLIArguments = + | [] Version + | [] LogLevel of level:string + | [] Solution of solution:string + | Diagnose + with + interface IArgParserTemplate with + member s.Usage = + match s with + | Version -> "Display versioning information" + | Solution _ -> "Specify .sln file to load (relative to CWD)" + | LogLevel _ -> "Set log level, ; default is `info`" + | Diagnose -> "Run diagnostics" [] let entry args = - try - let argParser = ArgumentParser.Create(programName = "csharp-ls") - let serverArgs = argParser.Parse args + let argParser = ArgumentParser.Create(programName = "csharp-ls") + let serverArgs = argParser.Parse args + + let parseLogLevel logLevelArg = + match logLevelArg with + | "error" -> LogLevel.Error + | "warning" -> LogLevel.Warning + | "info" -> LogLevel.Information + | "debug" -> LogLevel.Debug + | "trace" -> LogLevel.Trace + | _ -> LogLevel.Information - serverArgs.TryGetResult(<@ Options.CLIArguments.Version @>) + let settings = { + ServerSettings.Default with + SolutionPath = serverArgs.TryGetResult <@ Solution @> + LogLevel = + serverArgs.TryGetResult(<@ LogLevel @>) + |> Option.map parseLogLevel + |> Option.defaultValue LogLevel.Information + } + + try + serverArgs.TryGetResult <@ Version @> |> Option.iter (fun _ -> printfn "csharp-ls, %s" (Assembly.GetExecutingAssembly().GetName().Version |> string) exit 0) let logLevelArg = - serverArgs.TryGetResult(<@ Options.CLIArguments.LogLevel @>) + serverArgs.TryGetResult(<@ CLIArguments.LogLevel @>) let logLevel = match logLevelArg with @@ -37,11 +71,20 @@ let entry args = let settings = { ServerSettings.Default with - SolutionPath = serverArgs.TryGetResult(<@ Options.CLIArguments.Solution @>) + SolutionPath = serverArgs.TryGetResult(<@ CLIArguments.Solution @>) LogLevel = logLevel } - Server.start settings + match serverArgs.TryGetResult <@ Diagnose @> with + | Some _ -> + Logging.setupLogging LogLevel.Trace + let exitCode = diagnoseSolution settings |> Async.RunSynchronously + exitCode + + | _ -> + Logging.setupLogging settings.LogLevel + Server.start settings + with | :? ArguParseException as ex -> eprintfn "%s" ex.Message diff --git a/tests/CSharpLanguageServer.Tests/CSharpLanguageServer.Tests.fsproj b/tests/CSharpLanguageServer.Tests/CSharpLanguageServer.Tests.fsproj index 77fe3da8..a6651cbe 100644 --- a/tests/CSharpLanguageServer.Tests/CSharpLanguageServer.Tests.fsproj +++ b/tests/CSharpLanguageServer.Tests/CSharpLanguageServer.Tests.fsproj @@ -9,17 +9,7 @@ - - - - - - - - - -