@@ -1292,20 +1292,7 @@ extension SourceKitServer {
1292
1292
1293
1293
// If this symbol is a module then generate a textual interface
1294
1294
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)
1309
1296
return
1310
1297
}
1311
1298
@@ -1320,6 +1307,14 @@ extension SourceKitServer {
1320
1307
1321
1308
switch extractedResult {
1322
1309
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
+ }
1323
1318
let locs = resolved. map ( \. location)
1324
1319
// If we're unable to handle the definition request using our index, see if the
1325
1320
// language service can handle it (e.g. clangd can provide AST based definitions).
@@ -1339,6 +1334,32 @@ extension SourceKitServer {
1339
1334
languageService. symbolInfo ( request)
1340
1335
}
1341
1336
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
+
1342
1363
func implementation(
1343
1364
_ req: Request < ImplementationRequest > ,
1344
1365
workspace: Workspace ,
0 commit comments