Skip to content

Commit 60d9618

Browse files
committed
Add "Diagnose" argument
1 parent 791b8d3 commit 60d9618

File tree

3 files changed

+77
-27
lines changed

3 files changed

+77
-27
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" />
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
namespace CSharpLanguageServer
2+
3+
open CSharpLanguageServer.Types
4+
open CSharpLanguageServer.Logging
5+
6+
module Diagnostics =
7+
let private logger = Logging.getLoggerByName "Diagnostics"
8+
9+
let diagnoseSolution (settings: ServerSettings): int =
10+
logger.debug (
11+
Log.setMessage "diagnoseSolution: loading solution {sln}"
12+
>> Log.addContext "sln" settings.SolutionPath
13+
)
14+
15+
logger.error (
16+
Log.setMessage "diagnoseSolution: loading solution {sln}"
17+
>> Log.addContext "sln" settings.SolutionPath
18+
)
19+
20+
let exitCode = 0
21+
exitCode

src/CSharpLanguageServer/Program.fs

Lines changed: 55 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,53 +8,81 @@ open Microsoft.Extensions.Logging
88

99
open CSharpLanguageServer.Types
1010
open CSharpLanguageServer.Lsp
11+
<<<<<<< HEAD
1112
open CSharpLanguageServer.Logging
13+
=======
14+
open CSharpLanguageServer.Diagnostics
15+
16+
>>>>>>> 756634c (Add "Diagnose" argument)
1217

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

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

31-
serverArgs.TryGetResult(<@ CLIArguments.Version @>)
71+
try
72+
serverArgs.TryGetResult <@ Version @>
3273
|> Option.iter (fun _ -> printfn "csharp-ls, %s"
3374
(Assembly.GetExecutingAssembly().GetName().Version |> string)
3475
exit 0)
3576

36-
let logLevelArg =
37-
serverArgs.TryGetResult(<@ CLIArguments.LogLevel @>)
38-
|> Option.defaultValue "log"
39-
40-
let logLevel =
41-
match logLevelArg with
42-
| "error" -> LogLevel.Error
43-
| "warning" -> LogLevel.Warning
44-
| "info" -> LogLevel.Information
45-
| "debug" -> LogLevel.Debug
46-
| "trace" -> LogLevel.Trace
47-
| _ -> LogLevel.Information
48-
49-
Logging.setupLogging logLevel
77+
match serverArgs.TryGetResult <@ Diagnose @> with
78+
| Some _ ->
79+
configureLogger "log"
80+
diagnoseSolution settings
5081

51-
let settings = {
52-
ServerSettings.Default with
53-
SolutionPath = serverArgs.TryGetResult(<@ CLIArguments.Solution @>)
54-
LogLevel = logLevelArg
55-
}
82+
| _ ->
83+
configureLogger settings.LogLevel
84+
Server.start settings
5685

57-
Server.start settings
5886
with
5987
| :? ArguParseException as ex ->
6088
eprintfn "%s" ex.Message

0 commit comments

Comments
 (0)