From a833b0cb22b503e71d8eb1cc791b570bda0ab67d Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Sun, 10 Feb 2019 18:17:07 +0800 Subject: [PATCH] Add initialization option `capabilities.*` and index.maxInitializerLines indexer.cc: use index.maxInitializerLines instead of kInitializerMaxLines messages/initialize.cc: some ServerCapabilities are toggable: documentOnTypeFormattingProvider.firstTriggerCharacter foldingRangeProvider workspace.workspaceFolders.supported --- src/config.hh | 42 ++++++++++++++++++++++++++++++++------ src/indexer.cc | 6 ++---- src/messages/initialize.cc | 28 +++++++++++-------------- 3 files changed, 50 insertions(+), 26 deletions(-) diff --git a/src/config.hh b/src/config.hh index 073071db..e1d44c78 100644 --- a/src/config.hh +++ b/src/config.hh @@ -42,6 +42,25 @@ struct Config { // member has changed. SerializeFormat cacheFormat = SerializeFormat::Binary; + struct ServerCap { + struct DocumentOnTypeFormattingOptions { + std::string firstTriggerCharacter = "}"; + std::vector moreTriggerCharacter; + } documentOnTypeFormattingProvider; + + // Set to false if you don't want folding ranges. + bool foldingRangeProvider = true; + + struct Workspace { + struct WorkspaceFolders { + // Set to false if you don't want workspace folders. + bool supported = true; + + bool changeNotifications = true; + } workspaceFolders; + } workspace; + } capabilities; + struct Clang { // Arguments that should be excluded, e.g. ["-fopenmp", "-Wall"] // @@ -207,6 +226,10 @@ struct Config { std::vector initialBlacklist; std::vector initialWhitelist; + // If a variable initializer/macro replacement-list has fewer than this many + // lines, include the initializer in detailed_name. + int maxInitializerLines = 5; + // If not 0, a file will be indexed in each tranlation unit that includes it. int multiVersion = 0; @@ -255,6 +278,13 @@ struct Config { int maxNum = 2000; } xref; }; +REFLECT_STRUCT(Config::ServerCap::DocumentOnTypeFormattingOptions, + firstTriggerCharacter, moreTriggerCharacter); +REFLECT_STRUCT(Config::ServerCap::Workspace::WorkspaceFolders, supported, + changeNotifications); +REFLECT_STRUCT(Config::ServerCap::Workspace, workspaceFolders); +REFLECT_STRUCT(Config::ServerCap, documentOnTypeFormattingProvider, + foldingRangeProvider, workspace); REFLECT_STRUCT(Config::Clang, excludeArgs, extraArgs, pathMappings, resourceDir); REFLECT_STRUCT(Config::ClientCapability, hierarchicalDocumentSymbolSupport, @@ -269,17 +299,17 @@ REFLECT_STRUCT(Config::Diagnostics, blacklist, onChange, onOpen, onSave, spellChecking, whitelist) REFLECT_STRUCT(Config::Highlight, largeFileSize, lsRanges, blacklist, whitelist) REFLECT_STRUCT(Config::Index, blacklist, comments, initialBlacklist, - initialWhitelist, multiVersion, multiVersionBlacklist, - multiVersionWhitelist, onChange, threads, trackDependency, - whitelist); + initialWhitelist, maxInitializerLines, multiVersion, + multiVersionBlacklist, multiVersionWhitelist, onChange, threads, + trackDependency, whitelist); REFLECT_STRUCT(Config::Request, timeout); REFLECT_STRUCT(Config::Session, maxNum); REFLECT_STRUCT(Config::WorkspaceSymbol, caseSensitivity, maxNum, sort); REFLECT_STRUCT(Config::Xref, maxNum); REFLECT_STRUCT(Config, compilationDatabaseCommand, compilationDatabaseDirectory, - cacheDirectory, cacheFormat, clang, client, codeLens, completion, - diagnostics, highlight, index, request, session, workspaceSymbol, - xref); + cacheDirectory, cacheFormat, capabilities, clang, client, + codeLens, completion, diagnostics, highlight, index, request, + session, workspaceSymbol, xref); extern Config *g_config; diff --git a/src/indexer.cc b/src/indexer.cc index 0b3401a4..9a7adea2 100644 --- a/src/indexer.cc +++ b/src/indexer.cc @@ -29,8 +29,6 @@ using namespace clang; namespace ccls { namespace { -constexpr int kInitializerMaxLines = 3; - GroupMatch *multiVersionMatcher; struct File { @@ -586,7 +584,7 @@ public: if (L.isMacroID() || !SM.isBeforeInTranslationUnit(L, R.getBegin())) return; StringRef Buf = GetSourceInRange(SM, Lang, R); - Twine Init = Buf.count('\n') <= kInitializerMaxLines - 1 + Twine Init = Buf.count('\n') <= g_config->index.maxInitializerLines - 1 ? Buf.size() && Buf[0] == ':' ? Twine(" ", Buf) : Twine(" = ", Buf) : Twine(); @@ -1085,7 +1083,7 @@ public: var.def.short_name_size = Name.size(); StringRef Buf = GetSourceInRange(SM, Lang, R); var.def.hover = - Intern(Buf.count('\n') <= kInitializerMaxLines - 1 + Intern(Buf.count('\n') <= g_config->index.maxInitializerLines - 1 ? Twine("#define ", GetSourceInRange(SM, Lang, R)).str() : Twine("#define ", Name).str()); } diff --git a/src/messages/initialize.cc b/src/messages/initialize.cc index 7cccd1b8..1a3c40fc 100644 --- a/src/messages/initialize.cc +++ b/src/messages/initialize.cc @@ -76,10 +76,8 @@ struct ServerCap { } codeLensProvider; bool documentFormattingProvider = true; bool documentRangeFormattingProvider = true; - struct DocumentOnTypeFormattingOptions { - std::string firstTriggerCharacter = "}"; - std::vector moreTriggerCharacter; - } documentOnTypeFormattingProvider; + Config::ServerCap::DocumentOnTypeFormattingOptions + documentOnTypeFormattingProvider; bool renameProvider = true; struct DocumentLinkOptions { bool resolveProvider = true; @@ -89,28 +87,18 @@ struct ServerCap { struct ExecuteCommandOptions { std::vector commands = {ccls_xref}; } executeCommandProvider; - struct Workspace { - struct WorkspaceFolders { - bool supported = true; - bool changeNotifications = true; - } workspaceFolders; - } workspace; + Config::ServerCap::Workspace workspace; }; REFLECT_STRUCT(ServerCap::CodeActionOptions, codeActionKinds); REFLECT_STRUCT(ServerCap::CodeLensOptions, resolveProvider); REFLECT_STRUCT(ServerCap::CompletionOptions, resolveProvider, triggerCharacters); REFLECT_STRUCT(ServerCap::DocumentLinkOptions, resolveProvider); -REFLECT_STRUCT(ServerCap::DocumentOnTypeFormattingOptions, - firstTriggerCharacter, moreTriggerCharacter); REFLECT_STRUCT(ServerCap::ExecuteCommandOptions, commands); REFLECT_STRUCT(ServerCap::SaveOptions, includeText); REFLECT_STRUCT(ServerCap::SignatureHelpOptions, triggerCharacters); REFLECT_STRUCT(ServerCap::TextDocumentSyncOptions, openClose, change, willSave, willSaveWaitUntil, save); -REFLECT_STRUCT(ServerCap::Workspace::WorkspaceFolders, supported, - changeNotifications); -REFLECT_STRUCT(ServerCap::Workspace, workspaceFolders); REFLECT_STRUCT(ServerCap, textDocumentSync, hoverProvider, completionProvider, signatureHelpProvider, declarationProvider, definitionProvider, implementationProvider, typeDefinitionProvider, @@ -318,7 +306,15 @@ void Initialize(MessageHandler *m, InitializeParam ¶m, ReplyOnce &reply) { // Send initialization before starting indexers, so we don't send a // status update too early. - reply(InitializeResult{}); + { + InitializeResult result; + auto &c = result.capabilities; + c.documentOnTypeFormattingProvider = + g_config->capabilities.documentOnTypeFormattingProvider; + c.foldingRangeProvider = g_config->capabilities.foldingRangeProvider; + c.workspace = g_config->capabilities.workspace; + reply(result); + } // Set project root. EnsureEndsInSlash(project_path);