mirror of
https://github.com/apple/sourcekit-lsp.git
synced 2026-06-24 12:21:58 +02:00
223a88cb8c
- **`sourcekit/workspace/symbolNames`** — returns a flat, deduplicated list of every symbol name in the workspace index (source and indexed system modules). Clients use this to drive their search UI locally. - **`sourcekit/workspace/symbolInfo`** — given a list of exact symbol names, returns `WorkspaceSymbolItem` for each occurrence across all workspaces, for display in the search result list. Source-file symbols get `SymbolInformation` with a `file://` location. SDK/stdlib symbols get a `WorkspaceSymbol` with `location: .uri(…)` The client must call `workspaceSymbol/resolve` after the user selects an SDK/stdlib symbol to obtain the concrete interface location. - **`workspaceSymbol/resolve`** — resolves the deferred `WorkspaceSymbol` location from `sourcekit/workspace/symbolInfo`. Parses the `?module=` value into `moduleName`/`groupName`, finds a real source file via `mainFiles(containing:)`, calls `openGeneratedInterface`, and returns the symbol with `location` replaced by a full `sourcekit-lsp://generated-swift-interface/` URI + range (or a temp `file://` path for clients without `workspace/getReferenceDocument` support).
46 lines
1.5 KiB
Swift
46 lines
1.5 KiB
Swift
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2026 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See https://swift.org/LICENSE.txt for license information
|
|
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
extension Array where Element: Comparable {
|
|
/// Whether the array's elements are in strictly ascending order with no duplicates.
|
|
package var isSortedAndUnique: Bool {
|
|
@_specialize(where Element == String)
|
|
get {
|
|
self.indices.dropFirst().allSatisfy { i in
|
|
self[self.index(before: i)] < self[i]
|
|
}
|
|
}
|
|
}
|
|
|
|
/// Sorts the array in place and removes duplicate elements.
|
|
@_specialize(where Element == String)
|
|
package mutating func sortAndDedupe() {
|
|
guard self.count > 1 else {
|
|
return
|
|
}
|
|
let remaining = withUnsafeMutableBufferPointer { buf -> Int in
|
|
buf.sort()
|
|
var writeIdx = buf.startIndex
|
|
for readIdx in buf.indices.dropFirst() {
|
|
if buf[readIdx] == buf[writeIdx] {
|
|
continue
|
|
}
|
|
buf.formIndex(after: &writeIdx)
|
|
buf.swapAt(writeIdx, readIdx)
|
|
}
|
|
buf.formIndex(after: &writeIdx)
|
|
return buf.distance(from: writeIdx, to: buf.endIndex)
|
|
}
|
|
self.removeLast(remaining)
|
|
}
|
|
}
|