Alex Hoppen 44a095c8aa Use an AtomicInt32 to count pendingUnitCount instead of using AsyncQueue
Adding an item to `AsyncQueue<Serial>` is linear in the number of pending queue items, thus adding n items to an `AsyncQueue` before any can execute is in O(n^2). This decision was made intentionally because the primary use case for `AsyncQueue` was to track pending LSP requests, of which we don’t expect to have too many pending requests at any given time.

`SourceKitIndexDelegate` was also using `AsyncQueue` to track the number of pending units to be processed and eg. after indexing SourceKit-LSP, I have seen this grow up to ~20,000. With the quadratic behavior, this explodes time-wise.

Turns out that we don’t actually need to use a queue here at all, an atomic is sufficient and much faster.

Independently, we should consider mitigating the quadratic behavior of `AsyncQueue<Serial>` or `AsyncQueue` in general.

Fixes #1541
rdar://130844901
2024-10-08 17:35:13 -07:00
2024-06-04 15:14:56 -07:00
2022-08-03 19:12:43 +02:00
2023-10-10 13:44:47 -07:00
2023-11-01 11:12:08 -07:00
2018-11-13 15:50:48 -08:00

SourceKit-LSP

SourceKit-LSP is an implementation of the Language Server Protocol (LSP) for Swift and C-based languages. It provides intelligent editor functionality like code-completion and jump-to-definition to editors that support LSP. SourceKit-LSP is built on top of sourcekitd and clangd for high-fidelity language support, and provides a powerful source code index as well as cross-language support. SourceKit-LSP supports projects that use the Swift Package Manager and projects that generate a compile_commands.json file, such as CMake.

Getting Started

https://www.swift.org/tools has a list of popular editors that support LSP and can thus be hooked up to SourceKit-LSP to provide intelligent editor functionality as well as set-up guides.

Reporting Issues

If you should hit any issues while using SourceKit-LSP, we appreciate bug reports on GitHub Issue.

Important

SourceKit-LSP does not update its global index in the background or build Swift modules in the background. Thus, a lot of cross-module or global functionality is limited if the project hasn't been built recently. To update the index or rebuild the Swift modules, build the project.

Contributing

If you want to contribute code to SourceKit-LSP, see CONTRIBUTING.md for more information.

Description
Language Server Protocol implementation for Swift and C-based languages
Readme 14 MiB
Languages
Swift 97.3%
C 1.3%
CMake 0.7%
Python 0.7%