Skip to content

Commit 21b729f

Browse files
committed
Fix test failures of SourceKit plugin on Linux
1 parent aeac681 commit 21b729f

File tree

4 files changed

+64
-10
lines changed

4 files changed

+64
-10
lines changed

tools/SourceKit/tools/sourcekitd/bin/InProc/sourcekitdInProc.exports

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,68 @@ sourcekitd_cancel_request
22
sourcekitd_request_handle_dispose
33
sourcekitd_initialize
44
sourcekitd_request_array_create
5+
sourcekitd_request_array_get_bool
6+
sourcekitd_request_array_get_count
7+
sourcekitd_request_array_get_int64
8+
sourcekitd_request_array_get_string
9+
sourcekitd_request_array_get_uid
10+
sourcekitd_request_array_get_value
511
sourcekitd_request_array_set_int64
612
sourcekitd_request_array_set_string
713
sourcekitd_request_array_set_stringbuf
814
sourcekitd_request_array_set_uid
915
sourcekitd_request_array_set_value
16+
sourcekitd_request_bool_get_value
1017
sourcekitd_request_create_from_yaml
1118
sourcekitd_request_description_copy
1219
sourcekitd_request_description_dump
1320
sourcekitd_request_dictionary_create
21+
sourcekitd_request_dictionary_get_bool
22+
sourcekitd_request_dictionary_get_int64
23+
sourcekitd_request_dictionary_get_string
24+
sourcekitd_request_dictionary_get_uid
25+
sourcekitd_request_dictionary_get_value
1426
sourcekitd_request_dictionary_set_int64
1527
sourcekitd_request_dictionary_set_string
1628
sourcekitd_request_dictionary_set_stringbuf
1729
sourcekitd_request_dictionary_set_uid
1830
sourcekitd_request_dictionary_set_value
31+
sourcekitd_request_get_type
1932
sourcekitd_request_int64_create
20-
sourcekitd_request_retain
33+
sourcekitd_request_int64_get_value
2134
sourcekitd_request_release
35+
sourcekitd_request_retain
2236
sourcekitd_request_string_create
37+
sourcekitd_request_string_get_length
38+
sourcekitd_request_string_get_ptr
2339
sourcekitd_request_uid_create
40+
sourcekitd_request_uid_get_value
41+
sourcekitd_response_array_create
42+
sourcekitd_response_array_set_int64
43+
sourcekitd_response_array_set_double
44+
sourcekitd_response_array_set_string
45+
sourcekitd_response_array_set_stringbuf
46+
sourcekitd_response_array_set_uid
47+
sourcekitd_response_array_set_value
2448
sourcekitd_response_description_copy
2549
sourcekitd_response_description_dump
2650
sourcekitd_response_description_dump_filedesc
51+
sourcekitd_response_dictionary_create
52+
sourcekitd_response_dictionary_set_bool
53+
sourcekitd_response_dictionary_set_double
54+
sourcekitd_response_dictionary_set_custom_buffer
55+
sourcekitd_response_dictionary_set_int64
56+
sourcekitd_response_dictionary_set_string
57+
sourcekitd_response_dictionary_set_stringbuf
58+
sourcekitd_response_dictionary_set_uid
59+
sourcekitd_response_dictionary_set_value
2760
sourcekitd_response_dispose
61+
sourcekitd_response_error_create
2862
sourcekitd_response_error_get_description
2963
sourcekitd_response_error_get_kind
3064
sourcekitd_response_get_value
3165
sourcekitd_response_is_error
66+
sourcekitd_response_retain
3267
sourcekitd_send_request
3368
sourcekitd_send_request_sync
3469
sourcekitd_set_interrupted_connection_handler
@@ -60,14 +95,14 @@ sourcekitd_variant_dictionary_get_bool
6095
sourcekitd_variant_dictionary_get_double
6196
sourcekitd_variant_dictionary_get_int64
6297
sourcekitd_variant_dictionary_get_string
63-
sourcekitd_variant_dictionary_get_value
6498
sourcekitd_variant_dictionary_get_uid
99+
sourcekitd_variant_dictionary_get_value
65100
sourcekitd_variant_get_type
66101
sourcekitd_variant_json_description_copy
67102
sourcekitd_variant_string_get_length
68103
sourcekitd_variant_string_get_ptr
69-
sourcekitd_variant_data_get_size
70104
sourcekitd_variant_data_get_ptr
105+
sourcekitd_variant_data_get_size
71106
sourcekitd_variant_int64_get_value
72107
sourcekitd_variant_uid_get_value
73108
sourcekitd_variant_functions_create

tools/SourceKit/tools/sourcekitd/include/sourcekitd/plugin.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,8 @@ typedef const char *(*sourcekitd_uid_get_string_ptr_t)(sourcekitd_uid_t);
191191
typedef void *sourcekitd_plugin_initialize_params_t;
192192
typedef void (*sourcekitd_plugin_initialize_t)(
193193
sourcekitd_plugin_initialize_params_t);
194+
typedef void (*sourcekitd_plugin_initialize_2_t)(
195+
sourcekitd_plugin_initialize_params_t, const char *sourcekit_path);
194196

195197
SOURCEKITD_PUBLIC SOURCEKITD_NONNULL_ALL bool
196198
sourcekitd_plugin_initialize_is_client_only(

tools/SourceKit/tools/sourcekitd/lib/API/sourcekitdAPI-Common.cpp

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "llvm/Support/raw_ostream.h"
2828
#include "llvm/Support/YAMLParser.h"
2929
#include <mutex>
30+
#include <dlfcn.h>
3031

3132
using namespace SourceKit;
3233
using namespace sourcekitd;
@@ -268,6 +269,8 @@ bool sourcekitd::shutdownClient() {
268269
return true;
269270
}
270271

272+
extern "C" const char __dso_handle[];
273+
271274
static void loadPlugin(StringRef plugin, PluginInitParams &pluginParams) {
272275
std::string err;
273276
auto *handle = swift::loadLibrary(plugin.str().c_str(), &err);
@@ -277,17 +280,27 @@ static void loadPlugin(StringRef plugin, PluginInitParams &pluginParams) {
277280
return;
278281
}
279282

283+
auto *plugin_init_2 = (sourcekitd_plugin_initialize_2_t)swift::getAddressOfSymbol(
284+
handle, "sourcekitd_plugin_initialize_2");
285+
if (plugin_init_2) {
286+
Dl_info dlinfo;
287+
dladdr(__dso_handle, &dlinfo);
288+
plugin_init_2(&pluginParams, dlinfo.dli_fname);
289+
return;
290+
}
291+
292+
// Fall back to the legacy sourcekitd_plugin_initialize function.
280293
auto *plugin_init = (sourcekitd_plugin_initialize_t)swift::getAddressOfSymbol(
281294
handle, "sourcekitd_plugin_initialize");
282-
if (!plugin_init) {
283-
LOG_WARN("plugin-loading",
284-
"plugin '"
285-
<< plugin
286-
<< "' missing expected symbol: sourcekitd_plugin_initialize");
295+
if (plugin_init) {
296+
plugin_init(&pluginParams);
287297
return;
288298
}
289299

290-
plugin_init(&pluginParams);
300+
LOG_WARN("plugin-loading",
301+
"plugin '"
302+
<< plugin
303+
<< "' missing expected symbol: sourcekitd_plugin_initialize_2 or sourcekitd_plugin_initialize");
291304
}
292305

293306
void sourcekitd::loadPlugins(ArrayRef<std::string> registeredPlugins,

tools/SourceKit/tools/sourcekitd/lib/API/sourcekitdAPI-InProc.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,11 @@ sourcekitd_request_dictionary_get_value(sourcekitd_object_t dict,
518518

519519
const char *sourcekitd_request_dictionary_get_string(sourcekitd_object_t dict,
520520
sourcekitd_uid_t key) {
521-
return static_cast<SKDObject *>(dict)->get(key)->getCString();
521+
auto value = static_cast<SKDObject *>(dict)->get(key);
522+
if (!value) {
523+
return nullptr;
524+
}
525+
return value->getCString();
522526
}
523527

524528
int64_t sourcekitd_request_dictionary_get_int64(sourcekitd_object_t dict,

0 commit comments

Comments
 (0)