diff --git a/src/indexer.cc b/src/indexer.cc index 8929762d..954597d0 100644 --- a/src/indexer.cc +++ b/src/indexer.cc @@ -163,9 +163,6 @@ StorageClass GetStorageClass(CX_StorageClass storage) { return StorageClass::Auto; case CX_SC_Register: return StorageClass::Register; - default: - assert(0); - return StorageClass::Invalid; } } diff --git a/src/ipc.cc b/src/ipc.cc index 01029af8..ba7cee11 100644 --- a/src/ipc.cc +++ b/src/ipc.cc @@ -96,11 +96,9 @@ const char* IpcIdToString(IpcId id) { return "$cquery/indexFile"; case IpcId::CqueryWait: return "$cquery/wait"; - - default: - assert(false && "missing IpcId string name"); - exit(1); } + + CQUERY_UNREACHABLE("missing IpcId string name"); } BaseIpcMessage::BaseIpcMessage(IpcId method_id) : method_id(method_id) {} diff --git a/src/messages/text_document_definition.cc b/src/messages/text_document_definition.cc index fdeeefb2..0fd0ab5a 100644 --- a/src/messages/text_document_definition.cc +++ b/src/messages/text_document_definition.cc @@ -126,6 +126,7 @@ struct TextDocumentDefinitionHandler lsLocation result; result.uri = lsDocumentUri::FromPath(include.resolved_path); out.result.push_back(result); + has_symbol = true; break; } } @@ -135,6 +136,9 @@ struct TextDocumentDefinitionHandler const std::string& buffer = working_file->buffer_content; std::string query = LexWordAroundPos(position, buffer); + // For symbols whose detailed names contain |query| as a substring, + // we use the tuple to find the best match. std::tuple best_score = {INT_MAX, true, 0}; int best_i = -1; for (int i = 0; i < (int)db->symbols.size(); ++i) { diff --git a/src/port.cc b/src/port.cc new file mode 100644 index 00000000..7f5d5be2 --- /dev/null +++ b/src/port.cc @@ -0,0 +1,10 @@ +#include "port.h" + +#include +#include + +void cquery_unreachable_internal(const char* msg, const char* file, int line) { + fprintf(stderr, "unreachable %s:%d %s\n", file, line, msg); + CQUERY_BUILTIN_UNREACHABLE; + abort(); +} diff --git a/src/port.h b/src/port.h index d2a1db03..fbb152cc 100644 --- a/src/port.h +++ b/src/port.h @@ -1,7 +1,27 @@ #pragma once +#ifndef __has_builtin +# define __has_builtin(x) 0 +#endif + #if defined(__GNUC__) #define ATTRIBUTE_UNUSED __attribute__((unused)) #else #define ATTRIBUTE_UNUSED #endif + +// TODO GCC +#if __has_builtin(__builtin_unreachable) +#define CQUERY_BUILTIN_UNREACHABLE __builtin_unreachable() +#elif defined(_MSC_VER) +#define CQUERY_BUILTIN_UNREACHABLE __assume(false) +#else +#define CQUERY_BUILTIN_UNREACHABLE +#endif + +void cquery_unreachable_internal(const char* msg, const char* file, int line); +#ifndef NDEBUG +#define CQUERY_UNREACHABLE(msg) cquery_unreachable_internal(msg, __FILE__, __LINE__) +#else +#define CQUERY_UNREACHABLE(msg) +#endif