blob: 024cdf6c7967d74248f60d9b6e8b93c9e119b33a [file] [log] [blame]
/*===-- indexstore/indexstore.h - Index Store C API ----------------- C -*-===*\
|* *|
|* The LLVM Compiler Infrastructure *|
|* *|
|* This file is distributed under the University of Illinois Open Source *|
|* License. See LICENSE.TXT for details. *|
|* *|
|*===----------------------------------------------------------------------===*|
|* *|
|* This header provides a C API for the index store. *|
|* *|
\*===----------------------------------------------------------------------===*/
#ifndef LLVM_CLANG_C_INDEXSTORE_INDEXSTORE_H
#define LLVM_CLANG_C_INDEXSTORE_INDEXSTORE_H
#include <stdint.h>
#include <stddef.h>
#include <ctime>
/**
* \brief The version constants for the Index Store C API.
* INDEXSTORE_VERSION_MINOR should increase when there are API additions.
* INDEXSTORE_VERSION_MAJOR is intended for "major" source/ABI breaking changes.
*/
#define INDEXSTORE_VERSION_MAJOR 0
#define INDEXSTORE_VERSION_MINOR 9
#define INDEXSTORE_VERSION_ENCODE(major, minor) ( \
((major) * 10000) \
+ ((minor) * 1))
#define INDEXSTORE_VERSION INDEXSTORE_VERSION_ENCODE( \
INDEXSTORE_VERSION_MAJOR, \
INDEXSTORE_VERSION_MINOR )
#define INDEXSTORE_VERSION_STRINGIZE_(major, minor) \
#major"."#minor
#define INDEXSTORE_VERSION_STRINGIZE(major, minor) \
INDEXSTORE_VERSION_STRINGIZE_(major, minor)
#define INDEXSTORE_VERSION_STRING INDEXSTORE_VERSION_STRINGIZE( \
INDEXSTORE_VERSION_MAJOR, \
INDEXSTORE_VERSION_MINOR)
#ifdef __cplusplus
# define INDEXSTORE_BEGIN_DECLS extern "C" {
# define INDEXSTORE_END_DECLS }
#else
# define INDEXSTORE_BEGIN_DECLS
# define INDEXSTORE_END_DECLS
#endif
#ifndef INDEXSTORE_PUBLIC
# if defined (_MSC_VER)
# define INDEXSTORE_PUBLIC __declspec(dllimport)
# else
# define INDEXSTORE_PUBLIC
# endif
#endif
#ifndef __has_feature
# define __has_feature(x) 0
#endif
#if __has_feature(blocks)
# define INDEXSTORE_HAS_BLOCKS 1
#else
# define INDEXSTORE_HAS_BLOCKS 0
#endif
INDEXSTORE_BEGIN_DECLS
typedef void *indexstore_error_t;
INDEXSTORE_PUBLIC const char *
indexstore_error_get_description(indexstore_error_t);
INDEXSTORE_PUBLIC void
indexstore_error_dispose(indexstore_error_t);
typedef struct {
const char *data;
size_t length;
} indexstore_string_ref_t;
INDEXSTORE_PUBLIC unsigned
indexstore_format_version(void);
typedef void *indexstore_t;
INDEXSTORE_PUBLIC indexstore_t
indexstore_store_create(const char *store_path, indexstore_error_t *error);
INDEXSTORE_PUBLIC void
indexstore_store_dispose(indexstore_t);
#if INDEXSTORE_HAS_BLOCKS
INDEXSTORE_PUBLIC bool
indexstore_store_units_apply(indexstore_t, unsigned sorted,
bool(^applier)(indexstore_string_ref_t unit_name));
#endif
typedef void *indexstore_unit_event_notification_t;
typedef void *indexstore_unit_event_t;
INDEXSTORE_PUBLIC size_t
indexstore_unit_event_notification_get_events_count(indexstore_unit_event_notification_t);
INDEXSTORE_PUBLIC indexstore_unit_event_t
indexstore_unit_event_notification_get_event(indexstore_unit_event_notification_t, size_t index);
INDEXSTORE_PUBLIC bool
indexstore_unit_event_notification_is_initial(indexstore_unit_event_notification_t);
typedef enum {
INDEXSTORE_UNIT_EVENT_ADDED = 1,
INDEXSTORE_UNIT_EVENT_REMOVED = 2,
INDEXSTORE_UNIT_EVENT_MODIFIED = 3,
INDEXSTORE_UNIT_EVENT_DIRECTORY_DELETED = 4,
} indexstore_unit_event_kind_t;
INDEXSTORE_PUBLIC indexstore_unit_event_kind_t
indexstore_unit_event_get_kind(indexstore_unit_event_t);
INDEXSTORE_PUBLIC indexstore_string_ref_t
indexstore_unit_event_get_unit_name(indexstore_unit_event_t);
INDEXSTORE_PUBLIC timespec
indexstore_unit_event_get_modification_time(indexstore_unit_event_t);
#if INDEXSTORE_HAS_BLOCKS
typedef void (^indexstore_unit_event_handler_t)(indexstore_unit_event_notification_t);
INDEXSTORE_PUBLIC void
indexstore_store_set_unit_event_handler(indexstore_t,
indexstore_unit_event_handler_t handler);
#endif
typedef struct {
/// If true, \c indexstore_store_start_unit_event_listening will block until
/// the initial set of units is passed to the unit event handler, otherwise
/// the function will return and the initial set will be passed asynchronously.
bool wait_initial_sync;
} indexstore_unit_event_listen_options_t;
INDEXSTORE_PUBLIC bool
indexstore_store_start_unit_event_listening(indexstore_t,
indexstore_unit_event_listen_options_t *,
size_t listen_options_struct_size,
indexstore_error_t *error);
INDEXSTORE_PUBLIC void
indexstore_store_stop_unit_event_listening(indexstore_t);
INDEXSTORE_PUBLIC void
indexstore_store_discard_unit(indexstore_t, const char *unit_name);
INDEXSTORE_PUBLIC void
indexstore_store_discard_record(indexstore_t, const char *record_name);
INDEXSTORE_PUBLIC void
indexstore_store_purge_stale_data(indexstore_t);
/// Determines the unit name from the \c output_path and writes it out in the
/// \c name_buf buffer. It doesn't write more than \c buf_size.
/// \returns the length of the name. If this is larger than \c buf_size, the
/// caller should call the function again with a buffer of the appropriate size.
INDEXSTORE_PUBLIC size_t
indexstore_store_get_unit_name_from_output_path(indexstore_t store,
const char *output_path,
char *name_buf,
size_t buf_size);
/// \returns true if an error occurred, false otherwise.
INDEXSTORE_PUBLIC bool
indexstore_store_get_unit_modification_time(indexstore_t store,
const char *unit_name,
int64_t *seconds,
int64_t *nanoseconds,
indexstore_error_t *error);
typedef void *indexstore_symbol_t;
typedef enum {
INDEXSTORE_SYMBOL_KIND_UNKNOWN = 0,
INDEXSTORE_SYMBOL_KIND_MODULE = 1,
INDEXSTORE_SYMBOL_KIND_NAMESPACE = 2,
INDEXSTORE_SYMBOL_KIND_NAMESPACEALIAS = 3,
INDEXSTORE_SYMBOL_KIND_MACRO = 4,
INDEXSTORE_SYMBOL_KIND_ENUM = 5,
INDEXSTORE_SYMBOL_KIND_STRUCT = 6,
INDEXSTORE_SYMBOL_KIND_CLASS = 7,
INDEXSTORE_SYMBOL_KIND_PROTOCOL = 8,
INDEXSTORE_SYMBOL_KIND_EXTENSION = 9,
INDEXSTORE_SYMBOL_KIND_UNION = 10,
INDEXSTORE_SYMBOL_KIND_TYPEALIAS = 11,
INDEXSTORE_SYMBOL_KIND_FUNCTION = 12,
INDEXSTORE_SYMBOL_KIND_VARIABLE = 13,
INDEXSTORE_SYMBOL_KIND_FIELD = 14,
INDEXSTORE_SYMBOL_KIND_ENUMCONSTANT = 15,
INDEXSTORE_SYMBOL_KIND_INSTANCEMETHOD = 16,
INDEXSTORE_SYMBOL_KIND_CLASSMETHOD = 17,
INDEXSTORE_SYMBOL_KIND_STATICMETHOD = 18,
INDEXSTORE_SYMBOL_KIND_INSTANCEPROPERTY = 19,
INDEXSTORE_SYMBOL_KIND_CLASSPROPERTY = 20,
INDEXSTORE_SYMBOL_KIND_STATICPROPERTY = 21,
INDEXSTORE_SYMBOL_KIND_CONSTRUCTOR = 22,
INDEXSTORE_SYMBOL_KIND_DESTRUCTOR = 23,
INDEXSTORE_SYMBOL_KIND_CONVERSIONFUNCTION = 24,
INDEXSTORE_SYMBOL_KIND_PARAMETER = 25,
INDEXSTORE_SYMBOL_KIND_COMMENTTAG = 1000,
} indexstore_symbol_kind_t;
typedef enum {
INDEXSTORE_SYMBOL_SUBKIND_NONE = 0,
INDEXSTORE_SYMBOL_SUBKIND_CXXCOPYCONSTRUCTOR = 1,
INDEXSTORE_SYMBOL_SUBKIND_CXXMOVECONSTRUCTOR = 2,
INDEXSTORE_SYMBOL_SUBKIND_ACCESSORGETTER = 3,
INDEXSTORE_SYMBOL_SUBKIND_ACCESSORSETTER = 4,
INDEXSTORE_SYMBOL_SUBKIND_SWIFTACCESSORWILLSET = 1000,
INDEXSTORE_SYMBOL_SUBKIND_SWIFTACCESSORDIDSET = 1001,
INDEXSTORE_SYMBOL_SUBKIND_SWIFTACCESSORADDRESSOR = 1002,
INDEXSTORE_SYMBOL_SUBKIND_SWIFTACCESSORMUTABLEADDRESSOR = 1003,
INDEXSTORE_SYMBOL_SUBKIND_SWIFTEXTENSIONOFSTRUCT = 1004,
INDEXSTORE_SYMBOL_SUBKIND_SWIFTEXTENSIONOFCLASS = 1005,
INDEXSTORE_SYMBOL_SUBKIND_SWIFTEXTENSIONOFENUM = 1006,
INDEXSTORE_SYMBOL_SUBKIND_SWIFTEXTENSIONOFPROTOCOL = 1007,
INDEXSTORE_SYMBOL_SUBKIND_SWIFTPREFIXOPERATOR = 1008,
INDEXSTORE_SYMBOL_SUBKIND_SWIFTPOSTFIXOPERATOR = 1009,
INDEXSTORE_SYMBOL_SUBKIND_SWIFTINFIXOPERATOR = 1010,
INDEXSTORE_SYMBOL_SUBKIND_SWIFTSUBSCRIPT = 1011,
INDEXSTORE_SYMBOL_SUBKIND_SWIFTASSOCIATEDTYPE = 1012,
INDEXSTORE_SYMBOL_SUBKIND_SWIFTGENERICTYPEPARAM = 1013,
} indexstore_symbol_subkind_t;
typedef enum {
INDEXSTORE_SYMBOL_PROPERTY_GENERIC = 1 << 0,
INDEXSTORE_SYMBOL_PROPERTY_TEMPLATE_PARTIAL_SPECIALIZATION = 1 << 1,
INDEXSTORE_SYMBOL_PROPERTY_TEMPLATE_SPECIALIZATION = 1 << 2,
INDEXSTORE_SYMBOL_PROPERTY_UNITTEST = 1 << 3,
INDEXSTORE_SYMBOL_PROPERTY_IBANNOTATED = 1 << 4,
INDEXSTORE_SYMBOL_PROPERTY_IBOUTLETCOLLECTION = 1 << 5,
INDEXSTORE_SYMBOL_PROPERTY_GKINSPECTABLE = 1 << 6,
INDEXSTORE_SYMBOL_PROPERTY_LOCAL = 1 << 7,
} indexstore_symbol_property_t;
typedef enum {
INDEXSTORE_SYMBOL_LANG_C = 0,
INDEXSTORE_SYMBOL_LANG_OBJC = 1,
INDEXSTORE_SYMBOL_LANG_CXX = 2,
INDEXSTORE_SYMBOL_LANG_SWIFT = 100,
} indexstore_symbol_language_t;
typedef enum {
INDEXSTORE_SYMBOL_ROLE_DECLARATION = 1 << 0,
INDEXSTORE_SYMBOL_ROLE_DEFINITION = 1 << 1,
INDEXSTORE_SYMBOL_ROLE_REFERENCE = 1 << 2,
INDEXSTORE_SYMBOL_ROLE_READ = 1 << 3,
INDEXSTORE_SYMBOL_ROLE_WRITE = 1 << 4,
INDEXSTORE_SYMBOL_ROLE_CALL = 1 << 5,
INDEXSTORE_SYMBOL_ROLE_DYNAMIC = 1 << 6,
INDEXSTORE_SYMBOL_ROLE_ADDRESSOF = 1 << 7,
INDEXSTORE_SYMBOL_ROLE_IMPLICIT = 1 << 8,
// Relation roles.
INDEXSTORE_SYMBOL_ROLE_REL_CHILDOF = 1 << 9,
INDEXSTORE_SYMBOL_ROLE_REL_BASEOF = 1 << 10,
INDEXSTORE_SYMBOL_ROLE_REL_OVERRIDEOF = 1 << 11,
INDEXSTORE_SYMBOL_ROLE_REL_RECEIVEDBY = 1 << 12,
INDEXSTORE_SYMBOL_ROLE_REL_CALLEDBY = 1 << 13,
INDEXSTORE_SYMBOL_ROLE_REL_EXTENDEDBY = 1 << 14,
INDEXSTORE_SYMBOL_ROLE_REL_ACCESSOROF = 1 << 15,
INDEXSTORE_SYMBOL_ROLE_REL_CONTAINEDBY = 1 << 16,
INDEXSTORE_SYMBOL_ROLE_REL_IBTYPEOF = 1 << 17,
INDEXSTORE_SYMBOL_ROLE_REL_SPECIALIZATIONOF = 1 << 18,
} indexstore_symbol_role_t;
INDEXSTORE_PUBLIC indexstore_symbol_language_t
indexstore_symbol_get_language(indexstore_symbol_t);
INDEXSTORE_PUBLIC indexstore_symbol_kind_t
indexstore_symbol_get_kind(indexstore_symbol_t);
INDEXSTORE_PUBLIC indexstore_symbol_subkind_t
indexstore_symbol_get_subkind(indexstore_symbol_t);
INDEXSTORE_PUBLIC uint64_t
indexstore_symbol_get_properties(indexstore_symbol_t);
INDEXSTORE_PUBLIC uint64_t
indexstore_symbol_get_roles(indexstore_symbol_t);
INDEXSTORE_PUBLIC uint64_t
indexstore_symbol_get_related_roles(indexstore_symbol_t);
INDEXSTORE_PUBLIC indexstore_string_ref_t
indexstore_symbol_get_name(indexstore_symbol_t);
INDEXSTORE_PUBLIC indexstore_string_ref_t
indexstore_symbol_get_usr(indexstore_symbol_t);
INDEXSTORE_PUBLIC indexstore_string_ref_t
indexstore_symbol_get_codegen_name(indexstore_symbol_t);
typedef void *indexstore_symbol_relation_t;
INDEXSTORE_PUBLIC uint64_t
indexstore_symbol_relation_get_roles(indexstore_symbol_relation_t);
INDEXSTORE_PUBLIC indexstore_symbol_t
indexstore_symbol_relation_get_symbol(indexstore_symbol_relation_t);
typedef void *indexstore_occurrence_t;
INDEXSTORE_PUBLIC indexstore_symbol_t
indexstore_occurrence_get_symbol(indexstore_occurrence_t);
#if INDEXSTORE_HAS_BLOCKS
INDEXSTORE_PUBLIC bool
indexstore_occurrence_relations_apply(indexstore_occurrence_t,
bool(^applier)(indexstore_symbol_relation_t symbol_rel));
#endif
INDEXSTORE_PUBLIC uint64_t
indexstore_occurrence_get_roles(indexstore_occurrence_t);
INDEXSTORE_PUBLIC void
indexstore_occurrence_get_line_col(indexstore_occurrence_t,
unsigned *line, unsigned *column);
typedef void *indexstore_record_reader_t;
INDEXSTORE_PUBLIC indexstore_record_reader_t
indexstore_record_reader_create(indexstore_t store, const char *record_name,
indexstore_error_t *error);
INDEXSTORE_PUBLIC void
indexstore_record_reader_dispose(indexstore_record_reader_t);
#if INDEXSTORE_HAS_BLOCKS
/// Goes through the symbol data and passes symbols to \c receiver, for the
/// symbol data that \c filter returns true on.
///
/// This allows allocating memory only for the record symbols that the caller is
/// interested in.
INDEXSTORE_PUBLIC bool
indexstore_record_reader_search_symbols(indexstore_record_reader_t,
bool(^filter)(indexstore_symbol_t symbol, bool *stop),
void(^receiver)(indexstore_symbol_t symbol));
/// \param nocache if true, avoids allocating memory for the symbols.
/// Useful when the caller does not intend to keep \c indexstore_record_reader_t
/// for more queries.
INDEXSTORE_PUBLIC bool
indexstore_record_reader_symbols_apply(indexstore_record_reader_t,
bool nocache,
bool(^applier)(indexstore_symbol_t symbol));
INDEXSTORE_PUBLIC bool
indexstore_record_reader_occurrences_apply(indexstore_record_reader_t,
bool(^applier)(indexstore_occurrence_t occur));
INDEXSTORE_PUBLIC bool
indexstore_record_reader_occurrences_in_line_range_apply(indexstore_record_reader_t,
unsigned line_start,
unsigned line_count,
bool(^applier)(indexstore_occurrence_t occur));
/// \param symbols if non-zero \c symbols_count, indicates the list of symbols
/// that we want to get occurrences for. An empty array indicates that we want
/// occurrences for all symbols.
/// \param related_symbols Same as \c symbols but for related symbols.
INDEXSTORE_PUBLIC bool
indexstore_record_reader_occurrences_of_symbols_apply(indexstore_record_reader_t,
indexstore_symbol_t *symbols, size_t symbols_count,
indexstore_symbol_t *related_symbols, size_t related_symbols_count,
bool(^applier)(indexstore_occurrence_t occur));
#endif
typedef void *indexstore_unit_reader_t;
INDEXSTORE_PUBLIC indexstore_unit_reader_t
indexstore_unit_reader_create(indexstore_t store, const char *unit_name,
indexstore_error_t *error);
INDEXSTORE_PUBLIC void
indexstore_unit_reader_dispose(indexstore_unit_reader_t);
INDEXSTORE_PUBLIC indexstore_string_ref_t
indexstore_unit_reader_get_provider_identifier(indexstore_unit_reader_t);
INDEXSTORE_PUBLIC indexstore_string_ref_t
indexstore_unit_reader_get_provider_version(indexstore_unit_reader_t);
INDEXSTORE_PUBLIC void
indexstore_unit_reader_get_modification_time(indexstore_unit_reader_t,
int64_t *seconds,
int64_t *nanoseconds);
INDEXSTORE_PUBLIC bool
indexstore_unit_reader_is_system_unit(indexstore_unit_reader_t);
INDEXSTORE_PUBLIC bool
indexstore_unit_reader_is_module_unit(indexstore_unit_reader_t);
INDEXSTORE_PUBLIC bool
indexstore_unit_reader_is_debug_compilation(indexstore_unit_reader_t);
INDEXSTORE_PUBLIC bool
indexstore_unit_reader_has_main_file(indexstore_unit_reader_t);
INDEXSTORE_PUBLIC indexstore_string_ref_t
indexstore_unit_reader_get_main_file(indexstore_unit_reader_t);
INDEXSTORE_PUBLIC indexstore_string_ref_t
indexstore_unit_reader_get_module_name(indexstore_unit_reader_t);
INDEXSTORE_PUBLIC indexstore_string_ref_t
indexstore_unit_reader_get_working_dir(indexstore_unit_reader_t);
INDEXSTORE_PUBLIC indexstore_string_ref_t
indexstore_unit_reader_get_output_file(indexstore_unit_reader_t);
INDEXSTORE_PUBLIC indexstore_string_ref_t
indexstore_unit_reader_get_sysroot_path(indexstore_unit_reader_t);
INDEXSTORE_PUBLIC indexstore_string_ref_t
indexstore_unit_reader_get_target(indexstore_unit_reader_t);
typedef void *indexstore_unit_dependency_t;
typedef void *indexstore_unit_include_t;
typedef enum {
INDEXSTORE_UNIT_DEPENDENCY_UNIT = 1,
INDEXSTORE_UNIT_DEPENDENCY_RECORD = 2,
INDEXSTORE_UNIT_DEPENDENCY_FILE = 3,
} indexstore_unit_dependency_kind_t;
INDEXSTORE_PUBLIC indexstore_unit_dependency_kind_t
indexstore_unit_dependency_get_kind(indexstore_unit_dependency_t);
INDEXSTORE_PUBLIC bool
indexstore_unit_dependency_is_system(indexstore_unit_dependency_t);
INDEXSTORE_PUBLIC indexstore_string_ref_t
indexstore_unit_dependency_get_filepath(indexstore_unit_dependency_t);
INDEXSTORE_PUBLIC indexstore_string_ref_t
indexstore_unit_dependency_get_modulename(indexstore_unit_dependency_t);
INDEXSTORE_PUBLIC indexstore_string_ref_t
indexstore_unit_dependency_get_name(indexstore_unit_dependency_t);
INDEXSTORE_PUBLIC time_t
indexstore_unit_dependency_get_modification_time(indexstore_unit_dependency_t);
INDEXSTORE_PUBLIC size_t
indexstore_unit_dependency_get_file_size(indexstore_unit_dependency_t);
INDEXSTORE_PUBLIC indexstore_string_ref_t
indexstore_unit_include_get_source_path(indexstore_unit_include_t);
INDEXSTORE_PUBLIC indexstore_string_ref_t
indexstore_unit_include_get_target_path(indexstore_unit_include_t);
INDEXSTORE_PUBLIC unsigned
indexstore_unit_include_get_source_line(indexstore_unit_include_t);
#if INDEXSTORE_HAS_BLOCKS
INDEXSTORE_PUBLIC bool
indexstore_unit_reader_dependencies_apply(indexstore_unit_reader_t,
bool(^applier)(indexstore_unit_dependency_t));
INDEXSTORE_PUBLIC bool
indexstore_unit_reader_includes_apply(indexstore_unit_reader_t,
bool(^applier)(indexstore_unit_include_t));
#endif
INDEXSTORE_END_DECLS
#endif