Skip to content

Commit 473ecf7

Browse files
committed
fix(language-server): add debug logging of gitignore handling available by setting env var CONTEXTIVE_DEBUG_LOG
1 parent f58f25c commit 473ecf7

10 files changed

Lines changed: 67 additions & 48 deletions

File tree

src/language-server/Contextive.LanguageServer.Tests/Component/FileScannerTests.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ open OmniSharp.Extensions.LanguageServer.Protocol
1010
let private EXPECTED_GLOSSARY_FILE_GLOB =
1111
[| "**/*.glossary.yml"; "**/*.glossary.yaml" |]
1212

13-
let private fileScanner = FileScanner.fileScanner ignore
13+
let private fileScanner = FileScanner.fileScanner Logger.Logger.Noop
1414

1515
[<Tests>]
1616
let tests =

src/language-server/Contextive.LanguageServer.Tests/Component/GlossaryManagerTests.fs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ let newTestLogger () =
1616

1717
{| loggedMessages = loggedMessagesStore
1818
logger =
19-
{ Logger.info =
20-
fun msg ->
21-
loggedMessagesStore.Add(msg)
22-
CA.received awaiter msg
23-
Logger.error = fun _ -> () } |},
19+
{ Logger.Logger.Noop with
20+
info =
21+
fun msg ->
22+
loggedMessagesStore.Add(msg)
23+
CA.received awaiter msg } |},
2424
awaiter
2525

2626

@@ -38,7 +38,7 @@ let newCreateGlossary () =
3838

3939
let newInitGlossary () =
4040
{ GlossaryManager.FileScanner = fun _ -> []
41-
GlossaryManager.Log = { info = noop1; error = noop1 }
41+
GlossaryManager.Log = Logger.Logger.Noop
4242
GlossaryManager.DefaultGlossaryPathResolver = fun _ -> async.Return <| Error FileError.NotYetLoaded
4343
GlossaryManager.RegisterWatchedFiles = fun _ _ -> noop }
4444

@@ -188,8 +188,8 @@ let tests =
188188
glossary
189189
{ newInitGlossary () with
190190
Log =
191-
{ info = noop1
192-
error = CA.received errorAwaiter }
191+
{ Logger.Logger.Noop with
192+
error = CA.received errorAwaiter }
193193
DefaultGlossaryPathResolver =
194194
fun () -> Error(FileError.PathInvalid "testing error") |> async.Return }
195195

@@ -535,8 +535,8 @@ let tests =
535535
glossary
536536
{ newInitGlossary () with
537537
Log =
538-
{ info = CA.received startupAwaiter
539-
error = noop1 }
538+
{ Logger.Logger.Noop with
539+
info = CA.received startupAwaiter }
540540
DefaultGlossaryPathResolver = fun () -> path |> pc |> Ok |> async.Return }
541541

542542
GlossaryManager.reloadDefaultGlossaryFile glossary ()

src/language-server/Contextive.LanguageServer.Tests/Component/GlossaryTests.fs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ let tests =
4848

4949
{ Glossary.StartGlossary.Path = pc "path1"
5050
Glossary.StartGlossary.Log =
51-
{ info = CA.received awaiter
52-
error = fun _ -> () } }
51+
{ Logger.Noop with
52+
info = CA.received awaiter } }
5353
|> Glossary.start fileReader
5454
|> ignore
5555

@@ -66,10 +66,10 @@ let tests =
6666
Glossary.start fileReader
6767
<| { Path = pc "path1"
6868
Log =
69-
{ info = fun _ -> ()
70-
error = CA.received awaiter } }
69+
{ Logger.Noop with
70+
error = CA.received awaiter } }
7171

72-
do! CA.expectMessage awaiter "Error loading glossary file: Parsing Error: parsing error."
72+
do! CA.expectMessage awaiter $"Error loading glossary file 'path1': Parsing Error: parsing error."
7373
}
7474

7575
testAsync "When reloading a glossary it should read the file at the path provided when it was created" {

src/language-server/Contextive.LanguageServer.Tests/E2e/InitializationTests.fs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,14 @@ let tests =
126126
Window.showMessageHandlerBuilder
127127
<| Window.notificationHandler<ShowMessageParams> showErrorAwaiter ]
128128

129-
let expectedResult = Some "Error loading glossary file: Glossary file not found."
129+
let expectedResult =
130+
Some
131+
$"""Error loading glossary file '{IO.Path.Combine(IO.Directory.GetCurrentDirectory(), "fixtures/non_existent_folder_tests", pathValue)}': Glossary file not found."""
132+
133+
let! client, reply, _ =
134+
TestClientWithCustomInitWait(config, Some "Error loading glossary file")
135+
|> initAndWaitForReply
130136

131-
let! client, reply, _ = TestClientWithCustomInitWait(config, expectedResult) |> initAndWaitForReply
132137
use _ = client
133138

134139
let! receivedMessage = ConditionAwaiter.waitForAny showErrorAwaiter

src/language-server/Contextive.LanguageServer.Tests/E2e/WatchedFilesTests.fs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,11 +191,12 @@ let tests =
191191
let definitionsFileUri =
192192
Path.Combine(Directory.GetCurrentDirectory(), relativePath, Guid.NewGuid().ToString())
193193

194-
let expectedResult = "Error loading glossary file: Watched Glossary file not found."
194+
let expectedResult =
195+
$"Error loading glossary file '{definitionsFileUri}': Watched Glossary file not found."
195196

196197
didChangeWatchedFiles client definitionsFileUri
197198

198-
let! reply = expectedResult |> ServerLog.waitForLogMessage logAwaiter.Value
199+
let! reply = "Error loading glossary file" |> ServerLog.waitForLogMessage logAwaiter.Value
199200
let! receivedMessage = ConditionAwaiter.waitForAnyTimeout 100 showErrorAwaiter
200201

201202
test <@ reply.Value = expectedResult @>

src/language-server/Contextive.LanguageServer/Contextive.LanguageServer.fsproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@
3434
</ItemGroup>
3535
<ItemGroup>
3636
<Compile Include="RemoteFileReader.fs" />
37-
<Compile Include="FileScanner.fs" />
3837
<Compile Include="Globs.fs" />
3938
<Compile Include="Logger.fs" />
39+
<Compile Include="FileScanner.fs" />
4040
<Compile Include="Glossary.fs" />
4141
<Compile Include="GlossaryManager.fs" />
42-
<Compile Include="Seq.fs" />
42+
<Compile Include="Seq.fs" />
4343
<Compile Include="Rendering.fs" />
4444
<Compile Include="LocalFileReader.fs" />
4545
<Compile Include="FileReader.fs" />
@@ -48,7 +48,7 @@
4848
<Compile Include="GlossaryFileInitializer.fs" />
4949
<Compile Include="Configuration.fs" />
5050
<Compile Include="DefaultGlossaryFileProvider.fs" />
51-
<Compile Include="WatchedFiles.fs" />
51+
<Compile Include="WatchedFiles.fs" />
5252
<Compile Include="TextDocument.fs" />
5353
<Compile Include="Hover.fs" />
5454
<Compile Include="Completion.fs" />

src/language-server/Contextive.LanguageServer/FileScanner.fs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ open Microsoft.Extensions.FileSystemGlobbing
44
open Microsoft.Extensions.FileSystemGlobbing.Abstractions
55
open System.IO
66
open System
7+
open Contextive.LanguageServer.Logger
78

89
let private stripComments (ignorePattern: string) =
910
ignorePattern.Split "#" |> Seq.head |> _.Trim()
@@ -33,28 +34,29 @@ let fileScanPathsWithIgnore (globs: string seq) (basePath: string) (ignoreList:
3334
matcher.Execute(DirectoryInfoWrapper(DirectoryInfo basePath)).Files
3435
|> Seq.map (fun m -> Path.Combine(basePath, m.Path))
3536

36-
let private fileScanPath (logger: string -> unit) (globs: string array) (basePath: string) =
37+
let private fileScanPath (logger: Logger) (globs: string array) (basePath: string) =
3738
let excludePatterns = Path.Combine(basePath, ".gitignore") |> loadGitIgnore basePath
3839

39-
logger $"""Found initial exclude patterns in the root .gitignore {sprintf "%A" (List.ofSeq excludePatterns)}"""
40+
logger.debug
41+
$"""Found initial exclude patterns in the root .gitignore {sprintf "%A" (List.ofSeq excludePatterns)}"""
4042

4143
let gitIgnoreFiles =
4244
fileScanPathsWithIgnore [| """**/\.gitignore""" |] basePath excludePatterns
4345

44-
logger $"""Found more gitIgnore files: {sprintf "%A" (List.ofSeq gitIgnoreFiles)}"""
46+
logger.debug $"""Found more gitIgnore files: {sprintf "%A" (List.ofSeq gitIgnoreFiles)}"""
4547

4648
let excludePatterns =
4749
gitIgnoreFiles
4850
|> Seq.collect (loadGitIgnore basePath)
4951
|> Seq.append excludePatterns
5052
|> Array.ofSeq
5153

52-
logger $"""Full list of exclude patterns from all gitIgnores {sprintf "%A" (List.ofSeq excludePatterns)}"""
54+
logger.debug $"""Full list of exclude patterns from all gitIgnores {sprintf "%A" (List.ofSeq excludePatterns)}"""
5355

54-
logger "Starting scan..."
56+
logger.info "Starting scan..."
5557
let files = fileScanPathsWithIgnore globs basePath excludePatterns
56-
logger $"""Found files {sprintf "%A" (List.ofSeq files)}"""
58+
logger.info $"""Found files {sprintf "%A" (List.ofSeq files)}"""
5759
files
5860

59-
let fileScanner (logger: string -> unit) (basePaths: string seq) glob =
61+
let fileScanner (logger: Logger) (basePaths: string seq) glob =
6062
basePaths |> Seq.collect (fileScanPath logger glob)

src/language-server/Contextive.LanguageServer/Glossary.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ module Handlers =
6161
| FileNotFound Default -> state.Log.info "No glossary file configured, and default file not found."
6262
| _ ->
6363
let errorMessage = fileErrorMessage fileError
64-
let msg = $"Error loading glossary file: {errorMessage}."
64+
let msg = $"Error loading glossary file '{p.Path}': {errorMessage}."
6565
state.Log.info msg
6666

6767
match fileError with

src/language-server/Contextive.LanguageServer/Logger.fs

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,39 @@ module Contextive.LanguageServer.Logger
33
open OmniSharp.Extensions.LanguageServer.Protocol.Server
44
open OmniSharp.Extensions.LanguageServer.Protocol.Window
55

6+
let DEBUG_LOG =
7+
System.Environment.GetEnvironmentVariable "CONTEXTIVE_DEBUG_LOG"
8+
|> System.String.IsNullOrEmpty
9+
|> not
10+
611
let private noop1 _ = ()
712

813
type Logger =
9-
{ info: string -> unit
14+
{ debug: string -> unit
15+
info: string -> unit
1016
error: string -> unit }
1117

12-
static member Noop = { info = noop1; error = noop1 }
18+
static member Noop =
19+
{ debug = noop1
20+
info = noop1
21+
error = noop1 }
1322

1423
let forLanguageServer (s: ILanguageServer) =
15-
{ info =
24+
{ debug =
25+
fun (m: string) ->
26+
Serilog.Log.Logger.Debug m
27+
28+
if DEBUG_LOG then
29+
s.Window.Log m
30+
info =
1631
fun (m: string) ->
17-
s.Window.Log(m)
18-
Serilog.Log.Logger.Information(m)
32+
s.Window.Log m
33+
Serilog.Log.Logger.Information m
1934
error =
2035
fun (m: string) ->
21-
s.Window.LogError(m)
36+
s.Window.LogError m
2237

2338
if s.Window.ClientSettings.Capabilities.Window.ShowMessage.IsSupported then
2439
s.Window.ShowWarning m
2540

26-
Serilog.Log.Logger.Error(m) }
41+
Serilog.Log.Logger.Error m }

src/language-server/Contextive.LanguageServer/Server.fs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,24 @@ let assembly = Assembly.GetExecutingAssembly()
1616
let name = assembly.GetName().Name
1717

1818
let version =
19-
assembly
20-
.GetCustomAttribute<AssemblyInformationalVersionAttribute>()
21-
.InformationalVersion
19+
assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion
2220

2321
module private Startup =
2422
open GlossaryManager
2523

2624
let onStartupConfigureServer (glossaryManager: GlossaryManager.T) =
2725
OnLanguageServerStartedDelegate(fun (s: ILanguageServer) _cancellationToken ->
2826
async {
29-
s.Window.LogInfo $"Starting {name} v{version}..."
27+
let log = Logger.forLanguageServer s
28+
log.info $"Starting {name} v{version}..."
3029

3130
let! defaultGlossaryPathResolver = DefaultGlossaryFileProvider.getDefaultGlossaryFilePathResolver s
3231

33-
let fileScanner = Configuration.getWorkspaceFolders s |> FileScanner.fileScanner s.Window.LogInfo
32+
let fileScanner = Configuration.getWorkspaceFolders s |> FileScanner.fileScanner log
3433

3534
{ FileScanner = fileScanner
3635
DefaultGlossaryPathResolver = defaultGlossaryPathResolver
37-
Log = Logger.forLanguageServer s
36+
Log = log
3837
RegisterWatchedFiles = WatchedFiles.register s }
3938
|> init glossaryManager
4039

@@ -59,10 +58,7 @@ let private configureServer (input: Stream) (output: Stream) (opts: LanguageServ
5958
.OnStarted(Startup.onStartupConfigureServer glossaryManager)
6059
.WithConfigurationSection(DefaultGlossaryFileProvider.ConfigSection) // Add back in when implementing didConfigurationChanged handling
6160
.ConfigureLogging(fun z ->
62-
z
63-
.AddLanguageProtocolLogging()
64-
.AddSerilog(Log.Logger)
65-
.SetMinimumLevel(LogLevel.Trace)
61+
z.AddLanguageProtocolLogging().AddSerilog(Log.Logger).SetMinimumLevel(LogLevel.Trace)
6662
|> ignore)
6763
.WithServerInfo(ServerInfo(Name = name, Version = version))
6864

0 commit comments

Comments
 (0)