Files
Rintaro Ishizaki 223a88cb8c Add workspace/symbolNames and workspace/symbolInfo LSP extensions (#2619)
- **`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).
2026-05-12 22:21:17 -07:00

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)
}
}