Skip to content

Commit 627af11

Browse files
authored
Merge pull request #1053 from ahoppen/ahoppen/generate-uids
Generate sourcekitd UIDs instead of manually maintaining the list
2 parents b83bfbd + b5fd79f commit 627af11

17 files changed

+1786
-713
lines changed

Sources/SourceKitD/sourcekitd_uids.swift

Lines changed: 1373 additions & 463 deletions
Large diffs are not rendered by default.
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
%{
2+
from gyb_sourcekit_support.UIDs import UID_KEYS, UID_REQUESTS, UID_KINDS, KEY, REQUEST, KIND
3+
# Ignore the following admonition it applies to the resulting .swift file only
4+
}%
5+
//// Automatically Generated From UIDs.swift.gyb.
6+
//// Do Not Edit Directly! To regenerate run Utilities/generate-uids.py
7+
//===----------------------------------------------------------------------===//
8+
//
9+
// This source file is part of the Swift.org open source project
10+
//
11+
// Copyright (c) 2014 - 2024 Apple Inc. and the Swift project authors
12+
// Licensed under Apache License v2.0 with Runtime Library Exception
13+
//
14+
// See https://swift.org/LICENSE.txt for license information
15+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
16+
//
17+
//===----------------------------------------------------------------------===//
18+
%{
19+
def variable_name(name):
20+
if name == 'Operator':
21+
return '`operator`'
22+
word_index = 0
23+
threshold_index = 1
24+
for c in name:
25+
if c.islower():
26+
if word_index > threshold_index:
27+
word_index -= 1
28+
break
29+
word_index += 1
30+
if word_index == 0:
31+
return name
32+
return name[:word_index].lower() + name[word_index:]
33+
34+
# We should automatically generate these.
35+
ADDITIONAL_KEYS = [
36+
# Maintained from translateCodeCompletionOptions in SwiftCompletion.cpp#
37+
KEY('SortByName', 'key.codecomplete.sort.byname'),
38+
KEY('UseImportDepth', 'key.codecomplete.sort.useimportdepth'),
39+
KEY('GroupOverloads', 'key.codecomplete.group.overloads'),
40+
KEY('GroupStems', 'key.codecomplete.group.stems'),
41+
KEY('FilterText', 'key.codecomplete.filtertext'),
42+
KEY('RequestLimit', 'key.codecomplete.requestlimit'),
43+
KEY('RequestStart', 'key.codecomplete.requeststart'),
44+
KEY('HideUnderscores', 'key.codecomplete.hideunderscores'),
45+
KEY('HideLowPriority', 'key.codecomplete.hidelowpriority'),
46+
KEY('HideByName', 'key.codecomplete.hidebyname'),
47+
KEY('IncludeExactMatch', 'key.codecomplete.includeexactmatch'),
48+
KEY('AddInnerResults', 'key.codecomplete.addinnerresults'),
49+
KEY('AddInnerOperators', 'key.codecomplete.addinneroperators'),
50+
KEY('AddInitsToTopLevel', 'key.codecomplete.addinitstotoplevel'),
51+
KEY('FuzzyMatching', 'key.codecomplete.fuzzymatching'),
52+
KEY('TopNonLiteral', 'key.codecomplete.showtopnonliteralresults'),
53+
KEY('ContextWeight', 'key.codecomplete.sort.contextweight'),
54+
KEY('FuzzyWeight', 'key.codecomplete.sort.fuzzyweight'),
55+
KEY('PopularityBonus', 'key.codecomplete.sort.popularitybonus'),
56+
KEY('AnnotatedDescription', 'key.codecomplete.annotateddescription'),
57+
KEY('IncludeObjectLiterals', 'key.codecomplete.includeobjectliterals'),
58+
59+
# Maintained from applyFormatOptions in SwiftEditor.cpp
60+
KEY('UseTabs', 'key.editor.format.usetabs'),
61+
KEY('IndentWidth', 'key.editor.format.indentwidth'),
62+
KEY('TabWidth', 'key.editor.format.tabwidth'),
63+
KEY('IndentSwitchCase', 'key.editor.format.indent_switch_case'),
64+
]
65+
66+
# We should automatically generate these.
67+
ADDITIONAL_VALUES = [
68+
# Maintained from SwiftToSourceKitCompletionAdapter::handleResult in SwiftCompletion.cpp
69+
KIND('CompletionKindKeyword', 'source.lang.swift.keyword'),
70+
KIND('CompletionKindPattern', 'source.lang.swift.pattern'),
71+
72+
# Maintained from SwiftEditor.cpp
73+
KIND('SemaDiagStage', 'source.diagnostic.stage.swift.sema'),
74+
KIND('ParseDiagStage', 'source.diagnostic.stage.swift.parse'),
75+
76+
# Maintained from sourcekitd.cpp
77+
KIND('SemaDisabledNotification', 'source.notification.sema_disabled'),
78+
79+
# Maintained from initializeService in Requests.cpp
80+
KIND('SemaEnabledNotification', 'source.notification.sema_enabled'),
81+
KIND('DocumentUpdateNotification', 'source.notification.editor.documentupdate'),
82+
]
83+
84+
TYPES_AND_KEYS = [
85+
('sourcekitd_keys', UID_KEYS + ADDITIONAL_KEYS),
86+
('sourcekitd_requests', UID_REQUESTS),
87+
('sourcekitd_values', UID_KINDS + ADDITIONAL_VALUES),
88+
]
89+
}%
90+
91+
import Csourcekitd
92+
% for (struct_type, uids) in TYPES_AND_KEYS:
93+
94+
public struct ${struct_type} {
95+
% for key in uids:
96+
/// `${key.externalName}`
97+
public let ${variable_name(key.internalName)}: sourcekitd_uid_t
98+
% end
99+
100+
public init(api: sourcekitd_functions_t) {
101+
% for key in uids:
102+
${variable_name(key.internalName)} = api.uid_get_from_cstr("${key.externalName}")!
103+
% end
104+
}
105+
}
106+
% end

Sources/SourceKitLSP/Rename.swift

Lines changed: 49 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -134,17 +134,17 @@ fileprivate enum SyntacticRenamePieceKind {
134134
/// - `a` in `foo(a:)`
135135
case selectorArgumentLabel
136136

137-
init?(_ uid: sourcekitd_uid_t, keys: sourcekitd_keys) {
137+
init?(_ uid: sourcekitd_uid_t, values: sourcekitd_values) {
138138
switch uid {
139-
case keys.renameRangeBase: self = .baseName
140-
case keys.renameRangeCallArgColon: self = .callArgumentColon
141-
case keys.renameRangeCallArgCombined: self = .callArgumentCombined
142-
case keys.renameRangeCallArgLabel: self = .callArgumentLabel
143-
case keys.renameRangeDeclArgLabel: self = .declArgumentLabel
144-
case keys.renameRangeKeywordBase: self = .keywordBaseName
145-
case keys.renameRangeNoncollapsibleParam: self = .noncollapsibleParameterName
146-
case keys.renameRangeParam: self = .parameterName
147-
case keys.renameRangeSelectorArgLabel: self = .selectorArgumentLabel
139+
case values.renameRangeBase: self = .baseName
140+
case values.renameRangeCallArgColon: self = .callArgumentColon
141+
case values.renameRangeCallArgCombined: self = .callArgumentCombined
142+
case values.renameRangeCallArgLabel: self = .callArgumentLabel
143+
case values.renameRangeDeclArgLabel: self = .declArgumentLabel
144+
case values.renameRangeKeywordBase: self = .keywordBaseName
145+
case values.renameRangeNoncollapsibleParam: self = .noncollapsibleParameterName
146+
case values.renameRangeParam: self = .parameterName
147+
case values.renameRangeSelectorArgLabel: self = .selectorArgumentLabel
148148
default: return nil
149149
}
150150
}
@@ -171,11 +171,16 @@ fileprivate struct SyntacticRenamePiece {
171171
let parameterIndex: Int?
172172

173173
/// Create a `SyntacticRenamePiece` from a `sourcekitd` response.
174-
init?(_ dict: SKDResponseDictionary, in snapshot: DocumentSnapshot, keys: sourcekitd_keys) {
174+
init?(
175+
_ dict: SKDResponseDictionary,
176+
in snapshot: DocumentSnapshot,
177+
keys: sourcekitd_keys,
178+
values: sourcekitd_values
179+
) {
175180
guard let line: Int = dict[keys.line],
176181
let column: Int = dict[keys.column],
177-
let endLine: Int = dict[keys.endline],
178-
let endColumn: Int = dict[keys.endcolumn],
182+
let endLine: Int = dict[keys.endLine],
183+
let endColumn: Int = dict[keys.endColumn],
179184
let kind: sourcekitd_uid_t = dict[keys.kind]
180185
else {
181186
return nil
@@ -186,13 +191,13 @@ fileprivate struct SyntacticRenamePiece {
186191
else {
187192
return nil
188193
}
189-
guard let kind = SyntacticRenamePieceKind(kind, keys: keys) else {
194+
guard let kind = SyntacticRenamePieceKind(kind, values: values) else {
190195
return nil
191196
}
192197

193198
self.range = start..<end
194199
self.kind = kind
195-
self.parameterIndex = dict[keys.argindex] as Int?
200+
self.parameterIndex = dict[keys.argIndex] as Int?
196201
}
197202
}
198203

@@ -219,15 +224,15 @@ fileprivate enum SyntacticRenameNameContext {
219224
/// The matched ranges are within a comment.
220225
case comment
221226

222-
init?(_ uid: sourcekitd_uid_t, keys: sourcekitd_keys) {
227+
init?(_ uid: sourcekitd_uid_t, values: sourcekitd_values) {
223228
switch uid {
224-
case keys.sourceEditKindActive: self = .activeCode
225-
case keys.sourceEditKindComment: self = .comment
226-
case keys.sourceEditKindInactive: self = .inactiveCode
227-
case keys.sourceEditKindMismatch: self = .mismatch
228-
case keys.sourceEditKindSelector: self = .selector
229-
case keys.sourceEditKindString: self = .string
230-
case keys.sourceEditKindUnknown: self = .unmatched
229+
case values.editActive: self = .activeCode
230+
case values.editComment: self = .comment
231+
case values.editInactive: self = .inactiveCode
232+
case values.editMismatch: self = .mismatch
233+
case values.editSelector: self = .selector
234+
case values.editString: self = .string
235+
case values.editUnknown: self = .unmatched
231236
default: return nil
232237
}
233238
}
@@ -240,13 +245,18 @@ fileprivate struct SyntacticRenameName {
240245
let pieces: [SyntacticRenamePiece]
241246
let category: SyntacticRenameNameContext
242247

243-
init?(_ dict: SKDResponseDictionary, in snapshot: DocumentSnapshot, keys: sourcekitd_keys) {
248+
init?(
249+
_ dict: SKDResponseDictionary,
250+
in snapshot: DocumentSnapshot,
251+
keys: sourcekitd_keys,
252+
values: sourcekitd_values
253+
) {
244254
guard let ranges: SKDResponseArray = dict[keys.ranges] else {
245255
return nil
246256
}
247-
self.pieces = ranges.compactMap { SyntacticRenamePiece($0, in: snapshot, keys: keys) }
257+
self.pieces = ranges.compactMap { SyntacticRenamePiece($0, in: snapshot, keys: keys, values: values) }
248258
guard let categoryUid: sourcekitd_uid_t = dict[keys.category],
249-
let category = SyntacticRenameNameContext(categoryUid, keys: keys)
259+
let category = SyntacticRenameNameContext(categoryUid, values: values)
250260
else {
251261
return nil
252262
}
@@ -360,10 +370,10 @@ extension SwiftLanguageServer {
360370

361371
let req = sourcekitd.dictionary([
362372
keys.request: sourcekitd.requests.nameTranslation,
363-
keys.sourcefile: snapshot.uri.pseudoPath,
364-
keys.compilerargs: await self.buildSettings(for: snapshot.uri)?.compilerArgs as [SKDValue]?,
373+
keys.sourceFile: snapshot.uri.pseudoPath,
374+
keys.compilerArgs: await self.buildSettings(for: snapshot.uri)?.compilerArgs as [SKDValue]?,
365375
keys.offset: offset,
366-
keys.namekind: sourcekitd.values.namekindSwift,
376+
keys.nameKind: sourcekitd.values.nameSwift,
367377
keys.baseName: name.baseName,
368378
keys.argNames: sourcekitd.array(name.parameters.map { $0.stringOrWildcard }),
369379
])
@@ -417,10 +427,10 @@ extension SwiftLanguageServer {
417427
}
418428
let req = sourcekitd.dictionary([
419429
keys.request: sourcekitd.requests.nameTranslation,
420-
keys.sourcefile: snapshot.uri.pseudoPath,
421-
keys.compilerargs: await self.buildSettings(for: snapshot.uri)?.compilerArgs as [SKDValue]?,
430+
keys.sourceFile: snapshot.uri.pseudoPath,
431+
keys.compilerArgs: await self.buildSettings(for: snapshot.uri)?.compilerArgs as [SKDValue]?,
422432
keys.offset: offset,
423-
keys.namekind: sourcekitd.values.namekindObjC,
433+
keys.nameKind: sourcekitd.values.nameObjc,
424434
])
425435

426436
if isObjectiveCSelector {
@@ -790,7 +800,7 @@ extension SwiftLanguageServer {
790800
let location = sourcekitd.dictionary([
791801
keys.line: renameLocation.line,
792802
keys.column: renameLocation.utf8Column,
793-
keys.nameType: renameLocation.usage.uid(keys: keys),
803+
keys.nameType: renameLocation.usage.uid(values: values),
794804
])
795805
return sourcekitd.dictionary([
796806
keys.locations: [location],
@@ -800,20 +810,20 @@ extension SwiftLanguageServer {
800810
)
801811

802812
let skreq = sourcekitd.dictionary([
803-
keys.request: requests.find_syntactic_rename_ranges,
804-
keys.sourcefile: snapshot.uri.pseudoPath,
813+
keys.request: requests.findRenameRanges,
814+
keys.sourceFile: snapshot.uri.pseudoPath,
805815
// find-syntactic-rename-ranges is a syntactic sourcekitd request that doesn't use the in-memory file snapshot.
806816
// We need to send the source text again.
807-
keys.sourcetext: snapshot.text,
808-
keys.renamelocations: locations,
817+
keys.sourceText: snapshot.text,
818+
keys.renameLocations: locations,
809819
])
810820

811821
let syntacticRenameRangesResponse = try await sourcekitd.send(skreq, fileContents: snapshot.text)
812-
guard let categorizedRanges: SKDResponseArray = syntacticRenameRangesResponse[keys.categorizedranges] else {
822+
guard let categorizedRanges: SKDResponseArray = syntacticRenameRangesResponse[keys.categorizedRanges] else {
813823
throw ResponseError.internalError("sourcekitd did not return categorized ranges")
814824
}
815825

816-
return categorizedRanges.compactMap { SyntacticRenameName($0, in: snapshot, keys: keys) }
826+
return categorizedRanges.compactMap { SyntacticRenameName($0, in: snapshot, keys: keys, values: values) }
817827
}
818828

819829
public func rename(_ request: RenameRequest) async throws -> (edits: WorkspaceEdit, usr: String?) {

Sources/SourceKitLSP/Swift/CodeCompletionSession.swift

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -177,13 +177,13 @@ class CodeCompletionSession {
177177
}
178178

179179
let req = sourcekitd.dictionary([
180-
keys.request: sourcekitd.requests.codecomplete_open,
180+
keys.request: sourcekitd.requests.codeCompleteOpen,
181181
keys.offset: utf8StartOffset,
182182
keys.name: uri.pseudoPath,
183-
keys.sourcefile: uri.pseudoPath,
184-
keys.sourcetext: snapshot.text,
185-
keys.codecomplete_options: optionsDictionary(filterText: filterText, options: options),
186-
keys.compilerargs: compileCommand?.compilerArgs as [SKDValue]?,
183+
keys.sourceFile: uri.pseudoPath,
184+
keys.sourceText: snapshot.text,
185+
keys.codeCompleteOptions: optionsDictionary(filterText: filterText, options: options),
186+
keys.compilerArgs: compileCommand?.compilerArgs as [SKDValue]?,
187187
])
188188

189189
let dict = try await sourcekitd.send(req, fileContents: snapshot.text)
@@ -214,10 +214,10 @@ class CodeCompletionSession {
214214

215215
logger.info("Updating code completion session: \(self, privacy: .private) filter=\(filterText)")
216216
let req = sourcekitd.dictionary([
217-
keys.request: sourcekitd.requests.codecomplete_update,
217+
keys.request: sourcekitd.requests.codeCompleteUpdate,
218218
keys.offset: utf8StartOffset,
219219
keys.name: uri.pseudoPath,
220-
keys.codecomplete_options: optionsDictionary(filterText: filterText, options: options),
220+
keys.codeCompleteOptions: optionsDictionary(filterText: filterText, options: options),
221221
])
222222

223223
let dict = try await sourcekitd.send(req, fileContents: snapshot.text)
@@ -240,15 +240,14 @@ class CodeCompletionSession {
240240
) -> SKDRequestDictionary {
241241
let dict = sourcekitd.dictionary([
242242
// Sorting and priority options.
243-
keys.codecomplete_hideunderscores: 0,
244-
keys.codecomplete_hidelowpriority: 0,
245-
keys.codecomplete_hidebyname: 0,
246-
keys.codecomplete_addinneroperators: 0,
247-
keys.codecomplete_callpatternheuristics: 0,
248-
keys.codecomplete_showtopnonliteralresults: 0,
243+
keys.hideUnderscores: 0,
244+
keys.hideLowPriority: 0,
245+
keys.hideByName: 0,
246+
keys.addInnerOperators: 0,
247+
keys.topNonLiteral: 0,
249248
// Filtering options.
250-
keys.codecomplete_filtertext: filterText,
251-
keys.codecomplete_requestlimit: options.maxResults,
249+
keys.filterText: filterText,
250+
keys.requestLimit: options.maxResults,
252251
])
253252
return dict
254253
}
@@ -260,7 +259,7 @@ class CodeCompletionSession {
260259
break
261260
case .open:
262261
let req = sourcekitd.dictionary([
263-
keys.request: sourcekitd.requests.codecomplete_close,
262+
keys.request: sourcekitd.requests.codeCompleteClose,
264263
keys.offset: utf8StartOffset,
265264
keys.name: snapshot.uri.pseudoPath,
266265
])
@@ -287,9 +286,9 @@ class CodeCompletionSession {
287286
}
288287

289288
var filterName: String? = value[keys.name]
290-
let insertText: String? = value[keys.sourcetext]
291-
let typeName: String? = value[sourcekitd.keys.typename]
292-
let docBrief: String? = value[sourcekitd.keys.doc_brief]
289+
let insertText: String? = value[keys.sourceText]
290+
let typeName: String? = value[sourcekitd.keys.typeName]
291+
let docBrief: String? = value[sourcekitd.keys.docBrief]
293292

294293
let text = insertText.map {
295294
rewriteSourceKitPlaceholders(inString: $0, clientSupportsSnippets: clientSupportsSnippets)
@@ -298,7 +297,7 @@ class CodeCompletionSession {
298297

299298
let textEdit: TextEdit?
300299
if let text = text {
301-
let utf8CodeUnitsToErase: Int = value[sourcekitd.keys.num_bytes_to_erase] ?? 0
300+
let utf8CodeUnitsToErase: Int = value[sourcekitd.keys.numBytesToErase] ?? 0
302301

303302
textEdit = self.computeCompletionTextEdit(
304303
completionPos: completionPos,
@@ -329,7 +328,7 @@ class CodeCompletionSession {
329328
}
330329

331330
// Map SourceKit's not_recommended field to LSP's deprecated
332-
let notRecommended = (value[sourcekitd.keys.not_recommended] as Int?).map({ $0 != 0 })
331+
let notRecommended = (value[sourcekitd.keys.notRecommended] as Int?).map({ $0 != 0 })
333332

334333
let kind: sourcekitd_uid_t? = value[sourcekitd.keys.kind]
335334
result.items.append(

0 commit comments

Comments
 (0)