@@ -281,6 +281,8 @@ class SKDCustomData: public SKDObject {
281
281
return SOURCEKITD_VARIANT_TYPE_ARRAY;
282
282
case CustomBufferKind::RawData:
283
283
return SOURCEKITD_VARIANT_TYPE_DATA;
284
+ case CustomBufferKind::CustomBufferKind_End:
285
+ llvm_unreachable (" Not a valid variant type" );
284
286
}
285
287
llvm::report_fatal_error (" sourcekitd object did not resolve to a known type" );
286
288
}
@@ -501,6 +503,82 @@ sourcekitd_request_dictionary_set_uid(sourcekitd_object_t dict,
501
503
static_cast <SKDObject *>(dict)->set (key, new SKDUID (uid));
502
504
}
503
505
506
+ sourcekitd_object_t
507
+ sourcekitd_request_dictionary_get_value (sourcekitd_object_t dict,
508
+ sourcekitd_uid_t key) {
509
+ return static_cast <sourcekitd_object_t >(static_cast <SKDObject *>(dict)->get (key).get ());
510
+ }
511
+
512
+ const char *sourcekitd_request_dictionary_get_string (sourcekitd_object_t dict,
513
+ sourcekitd_uid_t key) {
514
+ return static_cast <SKDObject *>(dict)->get (key)->getCString ();
515
+ }
516
+
517
+ int64_t sourcekitd_request_dictionary_get_int64 (sourcekitd_object_t dict,
518
+ sourcekitd_uid_t key) {
519
+ return *static_cast <SKDObject *>(dict)->get (key)->getInt64 ();
520
+ }
521
+
522
+ bool sourcekitd_request_dictionary_get_bool (sourcekitd_object_t dict,
523
+ sourcekitd_uid_t key) {
524
+ return static_cast <SKDObject *>(dict)->get (key)->getBool ();
525
+ }
526
+
527
+ sourcekitd_uid_t sourcekitd_request_dictionary_get_uid (sourcekitd_object_t dict,
528
+ sourcekitd_uid_t key) {
529
+ return static_cast <SKDObject *>(dict)->get (key)->getUID ();
530
+ }
531
+
532
+ size_t sourcekitd_request_array_get_count (sourcekitd_object_t array) {
533
+ return static_cast <SKDObject *>(array)->getCount ();
534
+ }
535
+
536
+ sourcekitd_object_t
537
+ sourcekitd_request_array_get_value (sourcekitd_object_t array, size_t index) {
538
+ return static_cast <sourcekitd_object_t >(static_cast <SKDObject *>(array)->get (index).get ());
539
+ }
540
+
541
+ const char *sourcekitd_request_array_get_string (sourcekitd_object_t array,
542
+ size_t index) {
543
+ return static_cast <SKDObject *>(array)->get (index)->getCString ();
544
+ }
545
+
546
+ int64_t sourcekitd_request_array_get_int64 (sourcekitd_object_t array,
547
+ size_t index) {
548
+ return *static_cast <SKDObject *>(array)->get (index)->getInt64 ();
549
+ }
550
+
551
+ bool sourcekitd_request_array_get_bool (sourcekitd_object_t array,
552
+ size_t index) {
553
+ return static_cast <SKDObject *>(array)->get (index)->getBool ();
554
+ }
555
+
556
+ sourcekitd_uid_t sourcekitd_request_array_get_uid (sourcekitd_object_t array,
557
+ size_t index) {
558
+ return static_cast <SKDObject *>(array)->get (index)->getUID ();
559
+ }
560
+
561
+ int64_t sourcekitd_request_int64_get_value (sourcekitd_object_t obj) {
562
+ return *static_cast <SKDObject *>(obj)->getInt64 ();
563
+ }
564
+
565
+ bool sourcekitd_request_bool_get_value (sourcekitd_object_t obj) {
566
+ return static_cast <SKDObject *>(obj)->getBool ();
567
+ }
568
+
569
+ size_t sourcekitd_request_string_get_length (sourcekitd_object_t obj) {
570
+ return static_cast <SKDString *>(obj)->getString ()->size ();
571
+ }
572
+
573
+ const char *sourcekitd_request_string_get_ptr (sourcekitd_object_t obj) {
574
+ return static_cast <SKDString *>(obj)->getCString ();
575
+ }
576
+
577
+ sourcekitd_uid_t sourcekitd_request_uid_get_value (sourcekitd_object_t obj) {
578
+ return static_cast <SKDUID *>(obj)->getUID ();
579
+ }
580
+
581
+
504
582
sourcekitd_object_t
505
583
sourcekitd_request_array_create (const sourcekitd_object_t *objects,
506
584
size_t count) {
@@ -836,6 +914,12 @@ sourcekitd::createErrorRequestFailed(StringRef Description) {
836
914
Description));
837
915
}
838
916
917
+ sourcekitd_response_t
918
+ sourcekitd::createErrorRequestInterrupted (StringRef Description) {
919
+ return retained (new SKDError (SOURCEKITD_ERROR_CONNECTION_INTERRUPTED,
920
+ Description));
921
+ }
922
+
839
923
sourcekitd_response_t
840
924
sourcekitd::createErrorRequestCancelled () {
841
925
return retained (new SKDError (SOURCEKITD_ERROR_REQUEST_CANCELLED,
@@ -857,10 +941,11 @@ static sourcekitd_variant_type_t SKDVar_get_type(sourcekitd_variant_t var) {
857
941
858
942
static bool SKDVar_array_apply (
859
943
sourcekitd_variant_t array,
860
- llvm::function_ref<bool (size_t , sourcekitd_variant_t )> applier) {
944
+ sourcekitd_variant_array_applier_f_t applier,
945
+ void *context) {
861
946
return dyn_cast<SKDArray>(SKD_OBJ (array))->apply ([&](size_t Index,
862
947
SKDObjectRef Object){
863
- return applier (Index, variantFromSKDObject (Object));
948
+ return applier (Index, variantFromSKDObject (Object), context );
864
949
});
865
950
}
866
951
@@ -906,10 +991,11 @@ static double SKDVar_double_get_value(sourcekitd_variant_t obj) {
906
991
907
992
static bool SKDVar_dictionary_apply (
908
993
sourcekitd_variant_t dict,
909
- llvm::function_ref<bool (sourcekitd_uid_t , sourcekitd_variant_t )> applier) {
994
+ sourcekitd_variant_dictionary_applier_f_t applier,
995
+ void *context) {
910
996
return dyn_cast<SKDDictionary>(SKD_OBJ (dict))->apply ([&](sourcekitd_uid_t Key,
911
997
SKDObjectRef Object){
912
- return applier (Key, variantFromSKDObject (Object));
998
+ return applier (Key, variantFromSKDObject (Object), context );
913
999
});
914
1000
}
915
1001
@@ -1051,8 +1137,156 @@ static sourcekitd_variant_t variantFromSKDObject(SKDObjectRef Object) {
1051
1137
return {{ (uintptr_t )getVariantFunctionsForRawData (),
1052
1138
(uintptr_t )DataObject->getDataPtr (),
1053
1139
(uintptr_t )DataObject->getDataSize () }};
1140
+ case CustomBufferKind::CustomBufferKind_End:
1141
+ llvm_unreachable (" Not a valid variant type" );
1054
1142
}
1055
1143
}
1056
1144
1057
1145
return {{ (uintptr_t )&SKDVariantFuncs, (uintptr_t )Object.get (), 0 }};
1058
1146
}
1147
+
1148
+ sourcekitd_response_t
1149
+ sourcekitd_response_error_create (sourcekitd_error_t kind,
1150
+ const char *description) {
1151
+ SKDError *error = new SKDError (kind, description);
1152
+ return retained (error);
1153
+ }
1154
+
1155
+ sourcekitd_response_t
1156
+ sourcekitd_response_dictionary_create (const sourcekitd_uid_t *keys,
1157
+ const sourcekitd_response_t *values,
1158
+ size_t count) {
1159
+ // Request and response dictionaries are represented by the same type.
1160
+ return sourcekitd_request_dictionary_create (keys, values, count);
1161
+ }
1162
+
1163
+ void sourcekitd_response_dictionary_set_value (sourcekitd_response_t dict,
1164
+ sourcekitd_uid_t key,
1165
+ sourcekitd_response_t value) {
1166
+ static_cast <SKDObject *>(dict)->set (key, static_cast <SKDObject *>(value));
1167
+ }
1168
+
1169
+ void sourcekitd_response_dictionary_set_string (sourcekitd_response_t dict,
1170
+ sourcekitd_uid_t key,
1171
+ const char *string) {
1172
+ static_cast <SKDObject *>(dict)->set (key, new SKDString (std::string (string)));
1173
+ }
1174
+
1175
+ void sourcekitd_response_dictionary_set_stringbuf (sourcekitd_response_t dict,
1176
+ sourcekitd_uid_t key,
1177
+ const char *buf,
1178
+ size_t length) {
1179
+ llvm::SmallString<512 > SS;
1180
+ SS += StringRef (buf, length);
1181
+ sourcekitd_response_dictionary_set_string (dict, key, SS.c_str ());
1182
+ }
1183
+
1184
+ void sourcekitd_response_dictionary_set_int64 (sourcekitd_response_t dict,
1185
+ sourcekitd_uid_t key,
1186
+ int64_t val) {
1187
+ static_cast <SKDObject *>(dict)->set (key, new SKDInt64 (val));
1188
+ }
1189
+
1190
+ void sourcekitd_response_dictionary_set_bool (sourcekitd_response_t dict,
1191
+ sourcekitd_uid_t key, bool val) {
1192
+ static_cast <SKDObject *>(dict)->set (key, new SKDBool (val));
1193
+ }
1194
+
1195
+ void sourcekitd_response_dictionary_set_double (sourcekitd_response_t dict,
1196
+ sourcekitd_uid_t key,
1197
+ double val) {
1198
+ static_cast <SKDObject *>(dict)->set (key, new SKDDouble (val));
1199
+ }
1200
+
1201
+ void sourcekitd_response_dictionary_set_uid (sourcekitd_response_t dict,
1202
+ sourcekitd_uid_t key,
1203
+ sourcekitd_uid_t uid) {
1204
+ static_cast <SKDObject *>(dict)->set (key, new SKDUID (uid));
1205
+ }
1206
+
1207
+ sourcekitd_response_t
1208
+ sourcekitd_response_array_create (const sourcekitd_response_t *objects,
1209
+ size_t count) {
1210
+ // Request and response arrays are represented by the same type.
1211
+ return sourcekitd_request_array_create (objects, count);
1212
+ }
1213
+
1214
+ void sourcekitd_response_array_set_value (sourcekitd_response_t array,
1215
+ size_t index,
1216
+ sourcekitd_response_t value) {
1217
+ static_cast <SKDObject *>(array)->set (index, static_cast <SKDObject *>(value));
1218
+ }
1219
+
1220
+ void sourcekitd_response_array_set_string (sourcekitd_response_t array,
1221
+ size_t index, const char *string) {
1222
+ static_cast <SKDObject *>(array)->set (index,
1223
+ new SKDString (std::string (string)));
1224
+ }
1225
+
1226
+ void sourcekitd_response_array_set_stringbuf (sourcekitd_response_t array,
1227
+ size_t index, const char *buf,
1228
+ size_t length) {
1229
+ llvm::SmallString<512 > SS;
1230
+ SS += StringRef (buf, length);
1231
+ sourcekitd_response_array_set_string (array, index, SS.c_str ());
1232
+ }
1233
+
1234
+ void sourcekitd_response_array_set_int64 (sourcekitd_response_t array,
1235
+ size_t index, int64_t val) {
1236
+ static_cast <SKDObject *>(array)->set (index, new SKDInt64 (val));
1237
+ }
1238
+
1239
+ void sourcekitd_response_array_set_double (sourcekitd_response_t array,
1240
+ size_t index, double val) {
1241
+ static_cast <SKDObject *>(array)->set (index, new SKDDouble (val));
1242
+ }
1243
+
1244
+ void sourcekitd_response_array_set_uid (sourcekitd_response_t array,
1245
+ size_t index, sourcekitd_uid_t uid) {
1246
+ static_cast <SKDObject *>(array)->set (index, new SKDUID (uid));
1247
+ }
1248
+
1249
+ sourcekitd_response_t sourcekitd_response_retain (sourcekitd_response_t object) {
1250
+ return retained (static_cast <SKDObject *>(object));
1251
+ }
1252
+
1253
+ sourcekitd_variant_type_t sourcekitd_request_get_type (sourcekitd_object_t obj) {
1254
+ if (!obj) {
1255
+ return SOURCEKITD_VARIANT_TYPE_NULL;
1256
+ }
1257
+ switch (static_cast <SKDObject *>(obj)->getKind ()) {
1258
+ case SKDObject::ObjectKind::Dictionary:
1259
+ return SOURCEKITD_VARIANT_TYPE_DICTIONARY;
1260
+ case SKDObject::ObjectKind::Array:
1261
+ return SOURCEKITD_VARIANT_TYPE_ARRAY;
1262
+ case SKDObject::ObjectKind::String:
1263
+ return SOURCEKITD_VARIANT_TYPE_STRING;
1264
+ case SKDObject::ObjectKind::Int64:
1265
+ return SOURCEKITD_VARIANT_TYPE_INT64;
1266
+ case SKDObject::ObjectKind::UID:
1267
+ return SOURCEKITD_VARIANT_TYPE_UID;
1268
+ case SKDObject::ObjectKind::Bool:
1269
+ return SOURCEKITD_VARIANT_TYPE_BOOL;
1270
+ case SKDObject::ObjectKind::Double:
1271
+ return SOURCEKITD_VARIANT_TYPE_DOUBLE;
1272
+ case SKDObject::ObjectKind::CustomData:
1273
+ return static_cast <SKDObject *>(obj)->getVariantType ();
1274
+ case SKDObject::ObjectKind::Error:
1275
+ llvm_unreachable (" Should not be part of a request" );
1276
+ }
1277
+ }
1278
+
1279
+ void sourcekitd_response_dictionary_set_custom_buffer (
1280
+ sourcekitd_response_t dict, sourcekitd_uid_t key, const void *ptr,
1281
+ size_t size) {
1282
+ #ifndef NDEBUG
1283
+ assert (size >= sizeof (uint64_t ));
1284
+ auto bufKind = *(const uint64_t *)ptr;
1285
+ assert (bufKind >= (uint64_t )CustomBufferKind::CustomBufferKind_End);
1286
+ #endif
1287
+ std::unique_ptr<llvm::WritableMemoryBuffer> Buf;
1288
+ Buf = llvm::WritableMemoryBuffer::getNewUninitMemBuffer (size);
1289
+ memcpy (Buf->getBufferStart (), ptr, size);
1290
+ static_cast <SKDObject *>(dict)->set (key,
1291
+ new SKDCustomData (std::move (Buf)));
1292
+ }
0 commit comments