Skip to content

Commit 756634c

Browse files
committed
Add "Diagnose" argument
1 parent 7ea992b commit 756634c

File tree

2 files changed

+54
-42
lines changed

2 files changed

+54
-42
lines changed

src/CSharpLanguageServer/CSharpLanguageServer.fsproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
<Compile Include="ProgressReporter.fs" />
2929
<Compile Include="RoslynHelpers.fs" />
3030
<Compile Include="DocumentationUtil.fs" />
31+
<Compile Include="Diagnostics.fs" />
3132
<Compile Include="Lsp/Client.fs" />
3233
<Compile Include="State/ServerState.fs" />
3334
<Compile Include="State/ServerRequestContext.fs" />

src/CSharpLanguageServer/Program.fs

Lines changed: 53 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -10,65 +10,76 @@ open Serilog.Events
1010

1111
open CSharpLanguageServer.Types
1212
open CSharpLanguageServer.Lsp
13+
open CSharpLanguageServer.Diagnostics
14+
1315

1416
type CLIArguments =
1517
| [<AltCommandLine("-v")>] Version
1618
| [<AltCommandLine("-l")>] LogLevel of level:string
1719
| [<AltCommandLine("-s")>] Solution of solution:string
20+
| Diagnose
1821
with
1922
interface IArgParserTemplate with
2023
member s.Usage =
2124
match s with
22-
| Version -> "display versioning information"
23-
| Solution _ -> ".sln file to load (relative to CWD)"
24-
| LogLevel _ -> "log level, <log|info|warning|error>; default is `log`"
25+
| Version -> "Display versioning information"
26+
| Solution _ -> "Specify .sln file to load (relative to CWD)"
27+
| LogLevel _ -> "Set log level, <log|info|warning|error>; default is `log`"
28+
| Diagnose -> "Run diagnostics"
29+
30+
31+
let configureLogger (logLevelArg: string): unit =
32+
System.Console.Error.WriteLine("configureLogger; logLevelArg={0}", logLevelArg)
33+
let logLevel =
34+
match logLevelArg with
35+
| "error" -> LogEventLevel.Error
36+
| "warning" -> LogEventLevel.Warning
37+
| "info" -> LogEventLevel.Information
38+
| "log" -> LogEventLevel.Verbose
39+
| _ -> LogEventLevel.Information
40+
41+
let logConfig =
42+
LoggerConfiguration()
43+
.MinimumLevel.ControlledBy(LoggingLevelSwitch(logLevel))
44+
.Enrich.FromLogContext()
45+
.WriteTo.Async(fun conf ->
46+
conf.Console(
47+
outputTemplate =
48+
"[{Timestamp:HH:mm:ss.fff} {Level:u3}] [{SourceContext}] {Message:lj}{NewLine}{Exception}",
49+
// Redirect all logs to stderr since stdout is used to communicate with client.
50+
standardErrorFromLevel = Nullable<_>(LogEventLevel.Verbose),
51+
theme = Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme.Code
52+
)
53+
|> ignore)
54+
55+
Log.Logger <- logConfig.CreateLogger()
56+
2557

2658
[<EntryPoint>]
2759
let entry args =
28-
try
29-
let argParser = ArgumentParser.Create<CLIArguments>(programName = "csharp-ls")
30-
let serverArgs = argParser.Parse args
60+
let argParser = ArgumentParser.Create<CLIArguments>(programName = "csharp-ls")
61+
let serverArgs = argParser.Parse args
62+
63+
let settings = {
64+
ServerSettings.Default with
65+
SolutionPath = serverArgs.TryGetResult <@ Solution @>
66+
LogLevel = serverArgs.TryGetResult(<@ LogLevel @>) |> Option.defaultValue "log"
67+
}
3168

32-
serverArgs.TryGetResult(<@ CLIArguments.Version @>)
69+
try
70+
serverArgs.TryGetResult <@ Version @>
3371
|> Option.iter (fun _ -> printfn "csharp-ls, %s"
3472
(Assembly.GetExecutingAssembly().GetName().Version |> string)
3573
exit 0)
3674

37-
let logLevelArg =
38-
serverArgs.TryGetResult(<@ CLIArguments.LogLevel @>)
39-
|> Option.defaultValue "log"
40-
41-
let logLevel =
42-
match logLevelArg with
43-
| "error" -> LogEventLevel.Error
44-
| "warning" -> LogEventLevel.Warning
45-
| "info" -> LogEventLevel.Information
46-
| "log" -> LogEventLevel.Verbose
47-
| _ -> LogEventLevel.Information
48-
49-
let logConfig =
50-
LoggerConfiguration()
51-
.MinimumLevel.ControlledBy(LoggingLevelSwitch(logLevel))
52-
.Enrich.FromLogContext()
53-
.WriteTo.Async(fun conf ->
54-
conf.Console(
55-
outputTemplate =
56-
"[{Timestamp:HH:mm:ss.fff} {Level:u3}] [{SourceContext}] {Message:lj}{NewLine}{Exception}",
57-
// Redirect all logs to stderr since stdout is used to communicate with client.
58-
standardErrorFromLevel = Nullable<_>(LogEventLevel.Verbose),
59-
theme = Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme.Code
60-
)
61-
|> ignore)
62-
63-
Log.Logger <- logConfig.CreateLogger()
64-
65-
let settings = {
66-
ServerSettings.Default with
67-
SolutionPath = serverArgs.TryGetResult(<@ CLIArguments.Solution @>)
68-
LogLevel = logLevelArg
69-
}
70-
71-
Server.start settings
75+
match serverArgs.TryGetResult <@ Diagnose @> with
76+
| Some _ ->
77+
configureLogger "log"
78+
diagnoseSolution settings
79+
80+
| _ ->
81+
configureLogger settings.LogLevel
82+
Server.start settings
7283
with
7384
| :? ArguParseException as ex ->
7485
eprintfn "%s" ex.Message

0 commit comments

Comments
 (0)