Skip to content

Commit e30bdac

Browse files
committed
Generate swiftinterface for symbol lookup
When a symbol definition returns it is in a swiftinterface file, create textual version of swiftinterface and return that in response.
1 parent ec6b1d8 commit e30bdac

File tree

1 file changed

+35
-14
lines changed

1 file changed

+35
-14
lines changed

Sources/SourceKitLSP/SourceKitServer.swift

+35-14
Original file line numberDiff line numberDiff line change
@@ -1292,20 +1292,7 @@ extension SourceKitServer {
12921292

12931293
// If this symbol is a module then generate a textual interface
12941294
if case .success(let symbols) = result, let symbol = symbols.first, symbol.kind == .module, let name = symbol.name {
1295-
let openInterface = OpenInterfaceRequest(textDocument: req.params.textDocument, name: name)
1296-
let request = Request(openInterface, id: req.id, clientID: ObjectIdentifier(self),
1297-
cancellation: req.cancellationToken, reply: { (result: Result<OpenInterfaceRequest.Response, ResponseError>) in
1298-
switch result {
1299-
case .success(let interfaceDetails?):
1300-
let loc = Location(uri: interfaceDetails.uri, range: Range(Position(line: 0, utf16index: 0)))
1301-
req.reply(.locations([loc]))
1302-
case .success(nil):
1303-
req.reply(.failure(.unknown("Could not generate Swift Interface for \(name)")))
1304-
case .failure(let error):
1305-
req.reply(.failure(error))
1306-
}
1307-
})
1308-
languageService.openInterface(request)
1295+
self.respondWithInterface(req, moduleName: name, languageService: languageService)
13091296
return
13101297
}
13111298

@@ -1320,6 +1307,14 @@ extension SourceKitServer {
13201307

13211308
switch extractedResult {
13221309
case .success(let resolved):
1310+
// if first resolved location is in `.swiftinterface` file. Use moduleName to return
1311+
// textual interface
1312+
if let firstResolved = resolved.first,
1313+
let moduleName = firstResolved.occurrence?.location.moduleName,
1314+
firstResolved.location.uri.fileURL?.pathExtension == "swiftinterface" {
1315+
self.respondWithInterface(req, moduleName: moduleName, languageService: languageService)
1316+
return
1317+
}
13231318
let locs = resolved.map(\.location)
13241319
// If we're unable to handle the definition request using our index, see if the
13251320
// language service can handle it (e.g. clangd can provide AST based definitions).
@@ -1339,6 +1334,32 @@ extension SourceKitServer {
13391334
languageService.symbolInfo(request)
13401335
}
13411336

1337+
func respondWithInterface(
1338+
_ req: Request<DefinitionRequest>,
1339+
moduleName: String,
1340+
languageService: ToolchainLanguageServer
1341+
) {
1342+
var moduleName = moduleName
1343+
// Stdlib Swift modules are all in the "Swift" module, but their symbols return a module name `Swift.***`.
1344+
if moduleName.hasPrefix("Swift.") {
1345+
moduleName = "Swift"
1346+
}
1347+
let openInterface = OpenInterfaceRequest(textDocument: req.params.textDocument, name: moduleName)
1348+
let request = Request(openInterface, id: req.id, clientID: ObjectIdentifier(self),
1349+
cancellation: req.cancellationToken, reply: { (result: Result<OpenInterfaceRequest.Response, ResponseError>) in
1350+
switch result {
1351+
case .success(let interfaceDetails?):
1352+
let loc = Location(uri: interfaceDetails.uri, range: Range(Position(line: 0, utf16index: 0)))
1353+
req.reply(.locations([loc]))
1354+
case .success(nil):
1355+
req.reply(.failure(.unknown("Could not generate Swift Interface for \(moduleName)")))
1356+
case .failure(let error):
1357+
req.reply(.failure(error))
1358+
}
1359+
})
1360+
languageService.openInterface(request)
1361+
}
1362+
13421363
func implementation(
13431364
_ req: Request<ImplementationRequest>,
13441365
workspace: Workspace,

0 commit comments

Comments
 (0)