@@ -10,65 +10,76 @@ open Serilog.Events
10
10
11
11
open CSharpLanguageServer.Types
12
12
open CSharpLanguageServer.Lsp
13
+ open CSharpLanguageServer.Diagnostics
14
+
13
15
14
16
type CLIArguments =
15
17
| [<AltCommandLine( " -v" ) >] Version
16
18
| [<AltCommandLine( " -l" ) >] LogLevel of level : string
17
19
| [<AltCommandLine( " -s" ) >] Solution of solution : string
20
+ | Diagnose
18
21
with
19
22
interface IArgParserTemplate with
20
23
member s.Usage =
21
24
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
+
25
57
26
58
[<EntryPoint>]
27
59
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
+ }
31
68
32
- serverArgs.TryGetResult(<@ CLIArguments.Version @>)
69
+ try
70
+ serverArgs.TryGetResult <@ Version @>
33
71
|> Option.iter ( fun _ -> printfn " csharp-ls, %s "
34
72
( Assembly.GetExecutingAssembly() .GetName() .Version |> string)
35
73
exit 0 )
36
74
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
72
83
with
73
84
| :? ArguParseException as ex ->
74
85
eprintfn " %s " ex.Message
0 commit comments