blob: c5a838deb564bc1f6455e6b91a70b87bfed67255 [file] [log] [blame]
//===--- DocSupportAnnotationArray.cpp ------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
#include "sourcekitd/DocSupportAnnotationArray.h"
#include "sourcekitd/CompactArray.h"
#include "SourceKit/Core/LangSupport.h"
#include "llvm/Support/MemoryBuffer.h"
#include "DictionaryKeys.h"
using namespace SourceKit;
using namespace sourcekitd;
struct DocSupportAnnotationArrayBuilder::Implementation {
CompactArrayBuilder<UIdent,
Optional<StringRef>,
Optional<StringRef>,
unsigned,
unsigned> Builder;
};
DocSupportAnnotationArrayBuilder::DocSupportAnnotationArrayBuilder()
: Impl(*new Implementation()) {
}
DocSupportAnnotationArrayBuilder::~DocSupportAnnotationArrayBuilder() {
delete &Impl;
}
void DocSupportAnnotationArrayBuilder::add(const DocEntityInfo &Info) {
Optional<StringRef> NameOpt;
if (!Info.Name.empty())
NameOpt = Info.Name;
Optional<StringRef> USROpt;
if (!Info.USR.empty())
USROpt = Info.USR;
Impl.Builder.addEntry(Info.Kind,
NameOpt,
USROpt,
Info.Offset,
Info.Length);
}
std::unique_ptr<llvm::MemoryBuffer>
DocSupportAnnotationArrayBuilder::createBuffer() {
return Impl.Builder.createBuffer(CustomBufferKind::DocSupportAnnotationArray);
}
namespace {
class DocSupportAnnotationArray {
public:
typedef CompactArrayReader<sourcekitd_uid_t,
const char *,
const char *,
unsigned,
unsigned> CompactArrayReaderTy;
static bool
dictionary_apply(void *Buf, size_t Index,
llvm::function_ref<bool(sourcekitd_uid_t,
sourcekitd_variant_t)> applier) {
CompactArrayReaderTy Reader(Buf);
sourcekitd_uid_t Kind;
const char *Name;
const char *USR;
unsigned Offset;
unsigned Length;
Reader.readEntries(Index,
Kind,
Name,
USR,
Offset,
Length);
#define APPLY(K, Ty, Field) \
do { \
sourcekitd_uid_t key = SKDUIDFromUIdent(K); \
sourcekitd_variant_t var = make##Ty##Variant(Field); \
if (!applier(key, var)) return false; \
} while (0)
APPLY(KeyKind, UID, Kind);
if (Name) {
APPLY(KeyName, String, Name);
}
if (USR) {
APPLY(KeyUSR, String, USR);
}
APPLY(KeyOffset, Int, Offset);
APPLY(KeyLength, Int, Length);
return true;
}
};
} // end anonymous namespace
VariantFunctions *
sourcekitd::getVariantFunctionsForDocSupportAnnotationArray() {
return &CompactArrayFuncs<DocSupportAnnotationArray>::Funcs;
}