sourcekitd_uid_t sourcekitd::SKDUIDFromUIdent(UIdent UID) { if (void *Tag = UID.getTag()) return reinterpret_cast<sourcekitd_uid_t>(Tag); if (UidMappingHandler) { sourcekitd_uid_t skduid = UidMappingHandler(UID.c_str()); if (skduid) { UID.setTag(skduid); return skduid; } } return reinterpret_cast<sourcekitd_uid_t>(UID.getAsOpaqueValue()); }
sourcekitd_uid_t sourcekitd::SKDUIDFromUIdent(UIdent UID) { if (void *Tag = UID.getTag()) return reinterpret_cast<sourcekitd_uid_t>(Tag); // FIXME: The following should run in the synchronous dispatch queue of the // connection. But does it matter, since if MainConnection is null or gets // destroyed it means the client crashed ? xpc_connection_t peer = MainConnection; if (!peer) return nullptr; xpc_object_t contents = xpc_array_create(nullptr, 0); xpc_array_set_uint64(contents, XPC_ARRAY_APPEND, (uint64_t)xpc::Message::UIDSynchronization); xpc_array_set_string(contents, XPC_ARRAY_APPEND, UID.c_str()); xpc_object_t msg = xpc_dictionary_create(nullptr, nullptr, 0); xpc_dictionary_set_value(msg, xpc::KeyInternalMsg, contents); xpc_release(contents); xpc_object_t reply = xpc_connection_send_message_with_reply_sync(peer, msg); xpc_release(msg); if (xpc_get_type(reply) == XPC_TYPE_ERROR) { xpc_release(reply); return nullptr; } assert(xpc_get_type(reply) == XPC_TYPE_DICTIONARY); uint64_t val = xpc_dictionary_get_uint64(reply, xpc::KeyMsgResponse); xpc_release(reply); sourcekitd_uid_t skduid = sourcekitd_uid_t(val); UID.setTag(skduid); UIDMap.set(skduid, UID); return skduid; }