Skip to content

Commit 38c62cf

Browse files
authored
Merge pull request #18426 from ahoppen/sourcekit-raw-data
[sourcekitd] Add support for transferring raw data
2 parents 7d45ef5 + d920a66 commit 38c62cf

13 files changed

+187
-9
lines changed

tools/SourceKit/tools/sourcekitd/bin/sourcekitd.exports

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,5 +62,7 @@ sourcekitd_variant_get_type
6262
sourcekitd_variant_json_description_copy
6363
sourcekitd_variant_string_get_length
6464
sourcekitd_variant_string_get_ptr
65+
sourcekitd_variant_data_get_size
66+
sourcekitd_variant_data_get_ptr
6567
sourcekitd_variant_int64_get_value
6668
sourcekitd_variant_uid_get_value

tools/SourceKit/tools/sourcekitd/include/sourcekitd/CompactArray.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,9 @@ VariantFunctions CompactVariantFuncs<T>::Funcs = {
190190
nullptr/*Annot_string_get_length*/,
191191
nullptr/*Annot_string_get_ptr*/,
192192
nullptr/*Annot_int64_get_value*/,
193-
nullptr/*Annot_uid_get_value*/
193+
nullptr/*Annot_uid_get_value*/,
194+
nullptr/*Annot_data_get_size*/,
195+
nullptr/*Annot_data_get_ptr*/,
194196
};
195197

196198
template <typename T>
@@ -235,7 +237,9 @@ VariantFunctions CompactArrayFuncs<T>::Funcs = {
235237
nullptr/*AnnotArray_string_get_length*/,
236238
nullptr/*AnnotArray_string_get_ptr*/,
237239
nullptr/*AnnotArray_int64_get_value*/,
238-
nullptr/*AnnotArray_uid_get_value*/
240+
nullptr/*AnnotArray_uid_get_value*/,
241+
nullptr/*Annot_data_get_size*/,
242+
nullptr/*Annot_data_get_ptr*/,
239243
};
240244

241245
}

tools/SourceKit/tools/sourcekitd/include/sourcekitd/Internal.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ enum class CustomBufferKind {
5959
InheritedTypesArray,
6060
DocStructureElementArray,
6161
AttributesArray,
62+
RawData
6263
};
6364

6465
class ResponseBuilder {
@@ -219,6 +220,8 @@ struct VariantFunctions {
219220
const char *(*string_get_ptr)(sourcekitd_variant_t obj);
220221
int64_t (*int64_get_value)(sourcekitd_variant_t obj);
221222
sourcekitd_uid_t (*uid_get_value)(sourcekitd_variant_t obj);
223+
size_t (*data_get_size)(sourcekitd_variant_t obj);
224+
const void *(*data_get_ptr)(sourcekitd_variant_t obj);
222225
};
223226

224227
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//===--- RawData.h - =-------------------------------------------*- C++ -*-===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2018 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
#ifndef LLVM_SOURCEKITD_RAW_DATA_H
14+
#define LLVM_SOURCEKITD_RAW_DATA_H
15+
16+
#include "sourcekitd/Internal.h"
17+
18+
namespace sourcekitd {
19+
20+
VariantFunctions *getVariantFunctionsForRawData();
21+
22+
} // end namespace sourcekitd
23+
24+
#endif // LLVM_SOURCEKITD_RAW_DATA_H

tools/SourceKit/tools/sourcekitd/include/sourcekitd/RequestResponsePrinterBase.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,11 @@ class RequestResponsePrinterBase {
103103
OSColor(OS, UIDColor) << UID;
104104
}
105105
}
106+
107+
void visitData(const void *Data, size_t Size) {
108+
// FIXME: We should probably print the real data here
109+
OS << "<data>";
110+
}
106111
};
107112

108113
}

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
/// The policy about the sourcekitd API is to keep it source and ABI compatible,
2626
/// thus SOURCEKITD_VERSION_MAJOR is expected to remain stable.
2727
#define SOURCEKITD_VERSION_MAJOR 0
28-
#define SOURCEKITD_VERSION_MINOR 3
28+
#define SOURCEKITD_VERSION_MINOR 4
2929

3030
#define SOURCEKITD_VERSION_ENCODE(major, minor) ( \
3131
((major) * 10000) \
@@ -309,7 +309,10 @@ typedef enum {
309309
SOURCEKITD_VARIANT_TYPE_INT64 = 3,
310310
SOURCEKITD_VARIANT_TYPE_STRING = 4,
311311
SOURCEKITD_VARIANT_TYPE_UID = 5,
312-
SOURCEKITD_VARIANT_TYPE_BOOL = 6
312+
SOURCEKITD_VARIANT_TYPE_BOOL = 6,
313+
// Reserved for future addition
314+
// SOURCEKITD_VARIANT_TYPE_DOUBLE = 7,
315+
SOURCEKITD_VARIANT_TYPE_DATA = 8,
313316
} sourcekitd_variant_type_t;
314317

315318
typedef enum {
@@ -517,6 +520,14 @@ SOURCEKITD_PUBLIC SOURCEKITD_WARN_RESULT
517520
const char *
518521
sourcekitd_variant_string_get_ptr(sourcekitd_variant_t obj);
519522

523+
SOURCEKITD_PUBLIC SOURCEKITD_WARN_RESULT
524+
size_t
525+
sourcekitd_variant_data_get_size(sourcekitd_variant_t obj);
526+
527+
SOURCEKITD_PUBLIC SOURCEKITD_WARN_RESULT
528+
const void *
529+
sourcekitd_variant_data_get_ptr(sourcekitd_variant_t obj);
530+
520531
SOURCEKITD_PUBLIC SOURCEKITD_WARN_RESULT
521532
sourcekitd_uid_t
522533
sourcekitd_variant_uid_get_value(sourcekitd_variant_t obj);

tools/SourceKit/tools/sourcekitd/lib/API/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ set(sourcekitdAPI_sources
88
CompactArray.cpp
99
DocStructureArray.cpp
1010
DocSupportAnnotationArray.cpp
11+
RawData.cpp
1112
Requests.cpp
1213
sourcekitdAPI-Common.cpp
1314
TokenAnnotationsArray.cpp

tools/SourceKit/tools/sourcekitd/lib/API/DocStructureArray.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -579,7 +579,9 @@ VariantFunctions DocStructureArrayFuncs::funcs = {
579579
nullptr /*AnnotArray_string_get_length*/,
580580
nullptr /*AnnotArray_string_get_ptr*/,
581581
nullptr /*AnnotArray_int64_get_value*/,
582-
nullptr /*AnnotArray_uid_get_value*/
582+
nullptr /*AnnotArray_uid_get_value*/,
583+
nullptr /*Annot_data_get_size*/,
584+
nullptr /*Annot_data_get_ptr*/,
583585
};
584586

585587
VariantFunctions *sourcekitd::getVariantFunctionsForDocStructureElementArray() {
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
//===--- RawData.cpp ------------------------------------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2018 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
#include "sourcekitd/RawData.h"
14+
15+
using namespace sourcekitd;
16+
17+
struct RawDataFuncs {
18+
static sourcekitd_variant_type_t get_type(sourcekitd_variant_t var) {
19+
return SOURCEKITD_VARIANT_TYPE_DATA;
20+
}
21+
22+
static size_t data_get_size(sourcekitd_variant_t variant) {
23+
return variant.data[2];
24+
}
25+
26+
static const void *data_get_ptr(sourcekitd_variant_t variant) {
27+
return reinterpret_cast<void *>(variant.data[1]);
28+
}
29+
30+
static VariantFunctions Funcs;
31+
};
32+
33+
VariantFunctions RawDataFuncs::Funcs = {
34+
get_type,
35+
nullptr /*AnnotArray_array_apply*/,
36+
nullptr /*AnnotArray_array_get_bool*/,
37+
nullptr /*Annot_array_array_get_count*/,
38+
nullptr /*AnnotArray_array_get_int64*/,
39+
nullptr /*AnnotArray_array_get_string*/,
40+
nullptr /*AnnotArray_array_get_uid*/,
41+
nullptr /*AnnotArray_array_get_value*/,
42+
nullptr /*AnnotArray_bool_get_value*/,
43+
nullptr /*AnnotArray_dictionary_apply*/,
44+
nullptr /*AnnotArray_dictionary_get_bool*/,
45+
nullptr /*AnnotArray_dictionary_get_int64*/,
46+
nullptr /*AnnotArray_dictionary_get_string*/,
47+
nullptr /*AnnotArray_dictionary_get_value*/,
48+
nullptr /*AnnotArray_dictionary_get_uid*/,
49+
nullptr /*AnnotArray_string_get_length*/,
50+
nullptr /*AnnotArray_string_get_ptr*/,
51+
nullptr /*AnnotArray_int64_get_value*/,
52+
nullptr /*AnnotArray_uid_get_value*/,
53+
data_get_size,
54+
data_get_ptr,
55+
};
56+
57+
VariantFunctions *sourcekitd::getVariantFunctionsForRawData() {
58+
return &RawDataFuncs::Funcs;
59+
}

tools/SourceKit/tools/sourcekitd/lib/API/TokenAnnotationsArray.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,9 @@ VariantFunctions CompactVariantFuncs<TokenAnnotationsArray>::Funcs = {
218218
nullptr/*Annot_string_get_length*/,
219219
nullptr/*Annot_string_get_ptr*/,
220220
nullptr/*Annot_int64_get_value*/,
221-
nullptr/*Annot_uid_get_value*/
221+
nullptr/*Annot_uid_get_value*/,
222+
nullptr/*Annot_data_get_size*/,
223+
nullptr/*Annot_data_get_ptr*/,
222224
};
223225

224226
} // namespace sourcekitd

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,11 @@ class VariantVisitor {
115115
const char *Ptr = sourcekitd_uid_get_string_ptr(UID);
116116
return static_cast<ImplClass*>(this)->visitUID(StringRef(Ptr, Len));
117117
}
118+
case SOURCEKITD_VARIANT_TYPE_DATA: {
119+
const void *Data = sourcekitd_variant_data_get_ptr(Obj);
120+
size_t Size = sourcekitd_variant_data_get_size(Obj);
121+
return static_cast<ImplClass*>(this)->visitData(Data, Size);
122+
}
118123
}
119124
}
120125
};
@@ -566,6 +571,26 @@ sourcekitd_variant_string_get_ptr(sourcekitd_variant_t obj) {
566571
return (const char *)obj.data[1];
567572
}
568573

574+
size_t
575+
sourcekitd_variant_data_get_size(sourcekitd_variant_t obj) {
576+
if (auto fn = VAR_FN(obj, data_get_size))
577+
return fn(obj);
578+
579+
// Default implementation:
580+
// We store the byte's length in data[2] and its data in data[1]
581+
return obj.data[2];
582+
}
583+
584+
const void *
585+
sourcekitd_variant_data_get_ptr(sourcekitd_variant_t obj) {
586+
if (auto fn = VAR_FN(obj, data_get_ptr))
587+
return fn(obj);
588+
589+
// Default implementation:
590+
// We store the byte's length in data[2] and its data in data[1]
591+
return reinterpret_cast<void *>(obj.data[1]);
592+
}
593+
569594
sourcekitd_uid_t
570595
sourcekitd_variant_uid_get_value(sourcekitd_variant_t obj) {
571596
if (auto fn = VAR_FN(obj, uid_get_value))

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

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "sourcekitd/CodeCompletionResultsArray.h"
1717
#include "sourcekitd/DocStructureArray.h"
1818
#include "sourcekitd/DocSupportAnnotationArray.h"
19+
#include "sourcekitd/RawData.h"
1920
#include "sourcekitd/TokenAnnotationsArray.h"
2021
#include "sourcekitd/Logging.h"
2122
#include "SourceKit/Core/LLVM.h"
@@ -74,6 +75,8 @@ class SKDObject : public ThreadSafeRefCountedBaseVPTR {
7475
virtual Optional<StringRef> getString() const { return None; }
7576
virtual const char *getCString() const { return nullptr; }
7677
virtual bool getBool() const { return false; }
78+
virtual const void *getDataPtr() const { return nullptr; }
79+
virtual size_t getDataSize() const { return 0; }
7780
};
7881

7982
class SKDDictionary: public SKDObject {
@@ -255,6 +258,8 @@ class SKDCustomData: public SKDObject {
255258
case CustomBufferKind::DocStructureElementArray:
256259
case CustomBufferKind::AttributesArray:
257260
return SOURCEKITD_VARIANT_TYPE_ARRAY;
261+
case CustomBufferKind::RawData:
262+
return SOURCEKITD_VARIANT_TYPE_DATA;
258263
}
259264
llvm::report_fatal_error("sourcekitd object did not resolve to a known type");
260265
}
@@ -263,10 +268,14 @@ class SKDCustomData: public SKDObject {
263268
return BufferKind;
264269
}
265270

266-
const void *getDataPtr() const {
271+
const void *getDataPtr() const override {
267272
return BufferPtr->getBuffer().data();
268273
}
269274

275+
size_t getDataSize() const override {
276+
return BufferPtr->getBuffer().size();
277+
}
278+
270279
static bool classof(const SKDObject *O) {
271280
return O->getKind() == ObjectKind::CustomData;
272281
}
@@ -915,6 +924,13 @@ static sourcekitd_uid_t SKDVar_uid_get_value(sourcekitd_variant_t obj) {
915924
return SKD_OBJ(obj)->getUID();
916925
}
917926

927+
static const void *SKDVar_data_get_ptr(sourcekitd_variant_t obj) {
928+
return SKD_OBJ(obj)->getDataPtr();
929+
}
930+
931+
static size_t SKDVar_data_get_size(sourcekitd_variant_t obj) {
932+
return SKD_OBJ(obj)->getDataSize();
933+
}
918934

919935
static VariantFunctions SKDVariantFuncs = {
920936
SKDVar_get_type,
@@ -935,7 +951,9 @@ static VariantFunctions SKDVariantFuncs = {
935951
SKDVar_string_get_length,
936952
SKDVar_string_get_ptr,
937953
SKDVar_int64_get_value,
938-
SKDVar_uid_get_value
954+
SKDVar_uid_get_value,
955+
SKDVar_data_get_size,
956+
SKDVar_data_get_ptr,
939957
};
940958

941959
static sourcekitd_variant_t variantFromSKDObject(SKDObjectRef Object) {
@@ -965,6 +983,10 @@ static sourcekitd_variant_t variantFromSKDObject(SKDObjectRef Object) {
965983
case CustomBufferKind::AttributesArray:
966984
return {{ (uintptr_t)getVariantFunctionsForAttributesArray(),
967985
(uintptr_t)DataObject->getDataPtr(), 0 }};
986+
case CustomBufferKind::RawData:
987+
return {{ (uintptr_t)getVariantFunctionsForRawData(),
988+
(uintptr_t)DataObject->getDataPtr(),
989+
(uintptr_t)DataObject->getDataSize() }};
968990
}
969991
}
970992

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

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "sourcekitd/DocStructureArray.h"
1616
#include "sourcekitd/DocSupportAnnotationArray.h"
1717
#include "sourcekitd/TokenAnnotationsArray.h"
18+
#include "sourcekitd/RawData.h"
1819
#include "sourcekitd/RequestResponsePrinterBase.h"
1920
#include "SourceKit/Support/UIdent.h"
2021
#include "llvm/ADT/ArrayRef.h"
@@ -586,6 +587,7 @@ sourcekitd_response_get_value(sourcekitd_response_t resp) {
586587
((CustomBufferKind)*(const uint64_t*)xpc_data_get_bytes_ptr(xobj))
587588
#define CUSTOM_BUF_START(xobj) \
588589
((const void*)(((const uint64_t*)xpc_data_get_bytes_ptr(xobj))+1))
590+
#define CUSTOM_BUF_SIZE(xobj) (xpc_data_get_length(xobj) - sizeof(uint64_t))
589591

590592
static sourcekitd_variant_type_t XPCVar_get_type(sourcekitd_variant_t var) {
591593
xpc_object_t obj = XPC_OBJ(var);
@@ -620,6 +622,8 @@ static sourcekitd_variant_type_t XPCVar_get_type(sourcekitd_variant_t var) {
620622
case CustomBufferKind::DocStructureElementArray:
621623
case CustomBufferKind::AttributesArray:
622624
return SOURCEKITD_VARIANT_TYPE_ARRAY;
625+
case CustomBufferKind::RawData:
626+
return SOURCEKITD_VARIANT_TYPE_DATA;
623627
}
624628
}
625629

@@ -709,6 +713,14 @@ static const char *XPCVar_string_get_ptr(sourcekitd_variant_t obj) {
709713
return xpc_string_get_string_ptr(XPC_OBJ(obj));
710714
}
711715

716+
static size_t XPCVar_data_get_size(sourcekitd_variant_t obj) {
717+
return xpc_data_get_length(XPC_OBJ(obj));
718+
}
719+
720+
static const void *XPCVar_data_get_ptr(sourcekitd_variant_t obj) {
721+
return xpc_data_get_bytes_ptr(XPC_OBJ(obj));
722+
}
723+
712724
static int64_t XPCVar_int64_get_value(sourcekitd_variant_t obj) {
713725
return xpc_int64_get_value(XPC_OBJ(obj));
714726
}
@@ -737,7 +749,9 @@ static VariantFunctions XPCVariantFuncs = {
737749
XPCVar_string_get_length,
738750
XPCVar_string_get_ptr,
739751
XPCVar_int64_get_value,
740-
XPCVar_uid_get_value
752+
XPCVar_uid_get_value,
753+
XPCVar_data_get_size,
754+
XPCVar_data_get_ptr,
741755
};
742756

743757
static sourcekitd_variant_t variantFromXPCObject(xpc_object_t obj) {
@@ -767,6 +781,10 @@ static sourcekitd_variant_t variantFromXPCObject(xpc_object_t obj) {
767781
case CustomBufferKind::AttributesArray:
768782
return {{ (uintptr_t)getVariantFunctionsForAttributesArray(),
769783
(uintptr_t)CUSTOM_BUF_START(obj), 0 }};
784+
case sourcekitd::CustomBufferKind::RawData:
785+
return {{ (uintptr_t)getVariantFunctionsForRawData(),
786+
(uintptr_t)CUSTOM_BUF_START(obj),
787+
(uintptr_t)CUSTOM_BUF_SIZE(obj) }};
770788
}
771789
}
772790

0 commit comments

Comments
 (0)