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 @@
-
-
-
-
-
-
-
-
-
-