Commit Graph

106 Commits

Author SHA1 Message Date
Paul LeMarquand
310891108b Report workspace/triggerReindex server capability
Report to clients that the server supports the
`workspace/triggerReindex` request. This lets clients expose this
functionality only if SourceKit-LSP is configured to support it.
2024-07-16 13:04:01 -04:00
Alex Hoppen
0fa7ffcee3 Allow specification of SourceKitLSPOptions in the initialize request
This allows editors to provide UI elements to toggle SourceKit-LSP options.

# Conflicts:
#	Sources/SourceKitLSP/Swift/SwiftLanguageService.swift
2024-06-28 22:55:53 +02:00
Alex Hoppen
68bff7f216 Make background indexing a proper option in SourceKitLSPOptions
This allows us to flip the default in the future more easily. It also allows users to disable background indexing when it’s enabled by default.

rdar://130280855

# Conflicts:
#	Tests/SourceKitLSPTests/BackgroundIndexingTests.swift
2024-06-28 22:36:11 +02:00
Alex Hoppen
3e9c682cc9 Allow configuring of SourceKit-LSP’s options using .sourcekit-lsp configuration files
The idea here is to unify the different ways in which we can currently set options on SourceKit-LSP in a scalable way: Environment variables, command line arguments to `sourcekit-lsp` and initialization options.

The idea is that a user can define a `~/.sourcekit-lsp/.sourcekit-lsp` file (we store logs in `~/.sourcekit-lsp/logs` on non-Darwin platforms), which will be used as the default configuration for all SourceKit-LSP instances. They can also place a `.sourcekit-lsp` file in the root of a workspace to configure SourceKit-LSP for that project specifically, eg. setting arguments that need to be passed to `swift build` for that project and which thus also need to be set on SourceKit-LSP.

For compatibility reasons, I’m mapping the existing command line options into the new options structure for now. I hope to delete the command line arguments in the future and solely rely on `.sourcekit-lsp` configuration files.

Environment variable will be migrated to `.sourcekit-lsp` in a follow-up commit.

# Conflicts:
#	Sources/SourceKitLSP/SourceKitLSPServer+Options.swift
#	Sources/SourceKitLSP/Swift/SwiftLanguageService.swift
#	Sources/sourcekit-lsp/SourceKitLSP.swift
#	Tests/SourceKitLSPTests/BackgroundIndexingTests.swift
#	Tests/SourceKitLSPTests/ExecuteCommandTests.swift
2024-06-28 22:35:15 +02:00
Alex Hoppen
1a2e004838 Remove configuration options from WorkspaceFolder
This extension was added for VS Code but never used. Let’s remove it in favor of workspace-specific configuration files.

# Conflicts:
#	Sources/SourceKitLSP/SourceKitLSPServer.swift
2024-06-28 22:20:41 +02:00
Alex Hoppen
0f44f033e7 Merge pull request #1526 from ahoppen/6.0/re-index
[6.0] Add a request to re-index all files in SourceKit-LSP
2024-06-27 21:50:32 +02:00
Alex Hoppen
4de0ba54c5 Translate the semantic token legend used by clangd to the semantic token legend used by SourceKit-LSP
clangd uses a completely different semantic token legend than SourceKit-LSP (it doesn’t even adhere to the ordering of the pre-defined token types) but we were passing index offsets from clangd through assuming that clangd uses the same legend, which was incorrect.

When retrieving semantic tokens from clangd, translate the semantic tokens from clangd’s legend to SourceKit-LSP’s legend.

rdar://129895062
2024-06-27 05:31:05 +02:00
Alex Hoppen
0f8b6a5d2a Add a request to re-index all files in SourceKit-LSP
Users should not need to rely on this request. The index should always be updated automatically in the background. Having to invoke this request manes there is a bug in SourceKit-LSP's automatic re-indexing. It does, however, offer a workaround to re-index files when such a bug occurs where otherwise there would be no workaround.

rdar://127476221
Resolves #1263
2024-06-27 05:14:58 +02:00
Alex Hoppen
63b0107dc4 Log path of the toolchain used to opening a document
I don’t know why we logged the toolchain’s identifier twice. That didn’t make much sense.
2024-06-26 06:35:42 +02:00
Alex Hoppen
18d1944fab Merge pull request #1506 from ahoppen/6.0/watch-package-resolved 2024-06-24 17:06:04 -07:00
Alex Hoppen
02092ee50a Merge pull request #1505 from ahoppen/6.0/work-done-progress-token-prefix 2024-06-24 17:05:01 -07:00
Alex Hoppen
5929cf93af Watch for changes to Package.resolved
We need to watch for changes to `Package.resolved` so that we can update the dependency checkouts in `.index-build` when the user runs `swift package update`.

rdar://130103181
2024-06-22 07:01:41 -07:00
Alex Hoppen
228e5782d6 Allow prefixing of the token for a WorkDoneProgress with a custom string
This allows VS Code to detect when sourcekitd has crashed and prompt the user to gather a diagnostic report + file an issue about the crash.

rdar://129678779
Fixes #1476
2024-06-22 06:57:59 -07:00
Alex Hoppen
8642768902 Fix a few Swift concurrency warnings 2024-06-18 18:07:22 -07:00
Alex Hoppen
0c42c01d44 Show protocol requirements satisfied in extensions in jump-to-definition
The key issue here was that we were looking at the symbol occurrence that had the `overrideOf` role and were using this symbol occurrence to also check that it’s a child of one of the receiver types. But if the protocol requirement is satisfied in an extension, we have an implicit symbol occurrence at the location where the protocol requirement is stated but the real declaration’s occurrence is inside the extension. The fix here is to just extract the USR from the `overrideOf` relation and then do another index lookup to find the symbol’s definition.

rdar://129412428
2024-06-12 09:30:36 -07:00
Alex Hoppen
518aac47d5 Merge pull request #1459 from ahoppen/testable-methods
Change methods that were only public for testing purposes to be `@_spi(Testing)`
2024-06-12 09:26:45 -07:00
Alex Hoppen
d96f2fb2b7 Merge pull request #1467 from ahoppen/debounce-index-progress
Debounce the creation of work done progress for indexing and package reloading
2024-06-12 09:22:38 -07:00
Alex Hoppen
c9e6348302 Merge pull request #1447 from ahoppen/atomics-not-unsafe
Change all variables that are `Atomic*` types to not be `nonisolated(unsafe)`
2024-06-12 09:12:31 -07:00
Alex Hoppen
97ef5f46d7 Merge pull request #1460 from ahoppen/generated-interface-improvements
A couple of improvements for generated interfaces
2024-06-11 19:06:22 -07:00
Alex Hoppen
33d803f1d1 Change methods that were only public for testing purposes to be @_spi(Testing)
Fixes #876
Fixes #877
rdar://116705648
rdar://116705669
2024-06-11 19:03:26 -07:00
Alex Hoppen
91a08160b5 Merge pull request #1474 from ahoppen/logging-doc
Add a document to describe which log level to use
2024-06-11 15:24:05 -07:00
Alex Hoppen
7f90508e51 Add a document to describe which log level to use
Also change a few log levels and make all log messages consistently start with an uppercase letter.
2024-06-11 12:01:50 -07:00
Alex Hoppen
3fc03e9f0d Debounced the Reloading Package work done progress 2024-06-08 14:36:20 -07:00
Alex Hoppen
202d723c77 When performing jump-to-definition on a method implementing a protocol requirement, jump to the requirement
rdar://129412482
2024-06-08 10:29:18 -07:00
Alex Hoppen
2a0f8c79b9 A couple of improvements for generated interfaces
- Rename methods to highlight that we’re talking about generated interfaces here, not `.swiftinterface` files
- Don’t open the generated interface in `documentManager`. Opening documents in `documentManager` should only be done by the `textDocument/didOpen` notification from the LSP client. Otherwise we might indefinitely keep the document in the document manager
- After getting the generated interface from sourcekitd, close the document in sourcekitd again. We don’t provide semantic functionality in the generated interface yet, so we can’t interact with the generated interface path. Before, we left it open in sourcekitd indefinitely.
- A couple of code simplifications.

Fixes #878
rdar://116705653
2024-06-08 07:56:19 -07:00
Alex Hoppen
8c62fb5cd2 Return after handling a CancelRequestNotification
We were dispatching the notification to `messageHandlingQueue`, which then didn’t do anything with it. That’s not necessary.
2024-06-07 10:19:57 -07:00
Alex Hoppen
c43cffd044 Change all variables that are Atomic* types to not be nonisolated(unsafe)
Since the `Atomic*` types can not be marked as `Sendable` (because they aren’t C structs), we can change the variables to constants and can remove `nonisolated(unsafe)`.
2024-06-07 08:49:10 -07:00
Alex Hoppen
ce7f36e9ec Let the build system determine which toolchain to use for a document
This allows us to fix a toolchain when using a `SwiftPMBuildSystem`, which is critical to ensure that a target gets prepared using the same toolchain that is used to index it and that is used for sourcekitd.
2024-06-06 09:33:00 -07:00
Alex Hoppen
556fd333b5 Heap allocate our atomics
We used C atomics but these were allocated as Swift variables. Even thought they were atomic, concurrent accesses to them could violate Swift’s exclusivity laws, raising thread sanitizer errors.

Allocate the C atomics using malloc to fix this problem.

rdar://129170128
2024-06-05 23:27:47 -07:00
Alex Hoppen
0f553067c4 Merge pull request #1421 from ahoppen/track-recently-finished-requests
Keep track of recently finished requests
2024-06-04 15:17:41 -07:00
Alex Hoppen
9c13dbbe24 Merge pull request #1420 from ahoppen/reduce-some-logging
Demote two log messages issued on the `error` level
2024-06-04 11:21:33 -07:00
Alex Hoppen
922d94b366 Merge pull request #1410 from ahoppen/swift-utilities
Create a `SwiftUtilities` module
2024-06-04 09:53:48 -07:00
Alex Hoppen
ece8634be5 Keep track of recently finished requests
This is only used so we don't log an error when receiving a `CancelRequestNotification` for a request that has just returned a response.
2024-06-04 07:58:16 -07:00
Alex Hoppen
560d3e9daa Merge pull request #1414 from ahoppen/no-cancel-if-removing-diag-from-cache
Don’t cancel in-progress diagnostic generation when calling `DiagnosticReportManager.removeItemsFromCache`
2024-06-04 07:24:16 -07:00
Alex Hoppen
b479b2e874 Create a SwiftExtensions module
This allows us to share common Swift utility functions between SourceKit-LSP and LSPLogging.
2024-06-04 07:06:44 -07:00
Alex Hoppen
32852afd1f Demote two log messages issued on the error level
Just two cases where we were logging an error that wasn’t strictly necessary and was just spamming the log at the high log levels.
2024-06-03 23:15:38 -07:00
Alex Hoppen
fff9eb569e Merge pull request #1382 from ahoppen/stream-index-log
Instead of sending a message to the index log when an indexing task finishes, stream results as they come in
2024-06-03 19:33:29 -07:00
Alex Hoppen
d04bf84893 Don’t cancel in-progress diagnostic generation when calling DiagnosticReportManager.removeItemsFromCache
This was causing a non-deterministic test failure: When target preparation finishes while a diagnostic request is in progress, it will re-open the document, which calls `DiagnosticReportManager.removeItemsFromCache` for that document’s URI. With the old implementation, we would thus cancel the diagnostics sourcekitd request and return a cancelled error to the diagnostics LSP request.

While doing this, I also realized that there was a race condition: Document re-opening would happen outside of the SourceKit-LSP message handling queue and could thus run concurrently to any other request. This means that a sourcekitd request could run after `reopenDocument` had closed the document but before it was opened again. Introduce an internal reopen request that can be handled on the main message handling queue and thus doesn’t have this problem
2024-06-03 17:51:23 -07:00
Alex Hoppen
09ad77ba8d Instead of sending a message to the index log when an indexing task finishes, stream results as they come in
This also means that you can use the index log to view which tasks are currently being executed.

Since we only have a single log stream we can write to, I decided to prefix every line in the index log with two colored emojis that an easy visual association of every log line to the task that generated them.
2024-06-03 13:21:54 -07:00
Alex Hoppen
b60acde260 Merge pull request #1406 from ahoppen/cancellation-logging-scope
Set the logging scope for notification handling one level higher so it’s also set for cancel notifications
2024-06-03 11:12:27 -07:00
Alex Hoppen
9388caf16c Merge pull request #1396 from ahoppen/container-in-call-hierarchy-name
Show container name in call hierarchy item name instead of detail field
2024-06-03 08:32:09 -07:00
Alex Hoppen
63c144226c Set the logging scope for notification handling one level higher so it’s also set for cancel notifications 2024-06-03 08:21:26 -07:00
Alex Hoppen
175e85e6f4 Merge pull request #1398 from ahoppen/separate-index-log-in-client
Add an extension to the LogMessageNotification to add a message to a specific log in the client
2024-06-01 22:32:16 -07:00
Alex Hoppen
c44ee45c67 Add an extension to the LogMessageNotification to add a message to a specific log in the client
If the editor has support for this LSP extension, it can create a separate output view for the index log.

For example, in VS Code, we could have one output view for the standard LSP logging (which are the messages between VS Code and SourceKit-LSP if verbose logging is enabled in VS Code) and a separate log that shows information about background indexing.

rdar://128572032
2024-06-01 17:14:05 -07:00
Alex Hoppen
532a37bb33 Show container name in call hierarchy item name instead of detail field
The container name isn’t displayed very prominently and it’s easy to miss. I think the call hierarchy looks nicer when we prepend the container name with language-specific logic.

rdar://128396648
2024-06-01 16:53:40 -07:00
Alex Hoppen
eb304c4759 Add a general notion of experimental features to sourcekit-lsp
Background indexing probably won’t be the last experimental feature in sourcekit-lsp that we want to gate behind a feature flag. Instead of adding new parameters ad-hoc, introduce a general notion of experimental features.
2024-06-01 08:35:31 -07:00
Alex Hoppen
58d448a678 Create all notification/request handling signposts in the same logging category
This shows up nicer in Instruments because it doesn’t open a new lane for every signpost. Instead, they all share the same lane. Concurrent signposts are still shown as overlapping.
2024-05-31 00:10:11 -07:00
Lokesh.T.R
087ea64ed3 Rename note to notification throughout the codebase wherever necessary 2024-05-29 17:58:04 +00:00
Alex Hoppen
c2bf81cfcd Merge pull request #1360 from ahoppen/show-background-indexing-not-supported-message
Show message if background indexing is enabled but the workspace doesn’t support background indexing
2024-05-29 09:40:41 -07:00
Alex Hoppen
0f86e01cab Merge pull request #1349 from ahoppen/address-review-comments-1322-1329
Address review comments from #1322 and #1329
2024-05-28 17:30:15 -07:00