mirror of
https://github.com/MaskRay/ccls.git
synced 2024-11-24 08:35:08 +00:00
codeAction: use codeActionProvider: CodeActionOptions and respect CodeActionParams::range
This commit is contained in:
parent
eacbc1e1e7
commit
9ffbf3c52e
@ -109,6 +109,12 @@ struct lsRange {
|
||||
bool operator<(const lsRange &o) const {
|
||||
return !(start == o.start) ? start < o.start : end < o.end;
|
||||
}
|
||||
bool Includes(const lsRange &o) const {
|
||||
return start <= o.start && o.end <= end;
|
||||
}
|
||||
bool Intersects(const lsRange &o) const {
|
||||
return start < o.end && o.start < end;
|
||||
}
|
||||
};
|
||||
|
||||
struct Location {
|
||||
|
@ -63,11 +63,11 @@ struct ServerCap {
|
||||
// for
|
||||
// '::' and '>' for '->'. See
|
||||
// https://github.com/Microsoft/language-server-protocol/issues/138.
|
||||
std::vector<std::string> triggerCharacters = {".", ":", ">", "#",
|
||||
"<", "\"", "/"};
|
||||
std::vector<const char *> triggerCharacters = {".", ":", ">", "#",
|
||||
"<", "\"", "/"};
|
||||
} completionProvider;
|
||||
struct SignatureHelpOptions {
|
||||
std::vector<std::string> triggerCharacters = {"(", ","};
|
||||
std::vector<const char *> triggerCharacters = {"(", ","};
|
||||
} signatureHelpProvider;
|
||||
bool definitionProvider = true;
|
||||
bool typeDefinitionProvider = true;
|
||||
@ -76,7 +76,9 @@ struct ServerCap {
|
||||
bool documentHighlightProvider = true;
|
||||
bool documentSymbolProvider = true;
|
||||
bool workspaceSymbolProvider = true;
|
||||
bool codeActionProvider = true;
|
||||
struct CodeActionOptions {
|
||||
std::vector<const char *> codeActionKinds = {"quickfix"};
|
||||
} codeActionProvider;
|
||||
struct CodeLensOptions {
|
||||
bool resolveProvider = false;
|
||||
} codeLensProvider;
|
||||
@ -84,7 +86,7 @@ struct ServerCap {
|
||||
bool documentRangeFormattingProvider = true;
|
||||
struct DocumentOnTypeFormattingOptions {
|
||||
std::string firstTriggerCharacter = "}";
|
||||
std::vector<std::string> moreTriggerCharacter;
|
||||
std::vector<const char *> moreTriggerCharacter;
|
||||
} documentOnTypeFormattingProvider;
|
||||
bool renameProvider = true;
|
||||
struct DocumentLinkOptions {
|
||||
@ -93,7 +95,7 @@ struct ServerCap {
|
||||
bool foldingRangeProvider = true;
|
||||
// The server provides execute command support.
|
||||
struct ExecuteCommandOptions {
|
||||
std::vector<std::string> commands{std::string(ccls_xref)};
|
||||
std::vector<const char *> commands = {ccls_xref};
|
||||
} executeCommandProvider;
|
||||
struct Workspace {
|
||||
struct WorkspaceFolders {
|
||||
@ -102,9 +104,10 @@ struct ServerCap {
|
||||
} workspaceFolders;
|
||||
} workspace;
|
||||
};
|
||||
MAKE_REFLECT_STRUCT(ServerCap::CodeActionOptions, codeActionKinds);
|
||||
MAKE_REFLECT_STRUCT(ServerCap::CodeLensOptions, resolveProvider);
|
||||
MAKE_REFLECT_STRUCT(ServerCap::CompletionOptions, resolveProvider,
|
||||
triggerCharacters);
|
||||
MAKE_REFLECT_STRUCT(ServerCap::CodeLensOptions, resolveProvider);
|
||||
MAKE_REFLECT_STRUCT(ServerCap::DocumentLinkOptions, resolveProvider);
|
||||
MAKE_REFLECT_STRUCT(ServerCap::DocumentOnTypeFormattingOptions,
|
||||
firstTriggerCharacter, moreTriggerCharacter);
|
||||
|
@ -33,21 +33,24 @@ MAKE_REFLECT_STRUCT(CodeAction, title, kind, edit);
|
||||
}
|
||||
void MessageHandler::textDocument_codeAction(CodeActionParam ¶m,
|
||||
ReplyOnce &reply) {
|
||||
WorkingFile *wfile =
|
||||
WorkingFile *wf =
|
||||
wfiles->GetFileByFilename(param.textDocument.uri.GetPath());
|
||||
if (!wfile) {
|
||||
if (!wf)
|
||||
return;
|
||||
}
|
||||
std::vector<CodeAction> result;
|
||||
std::vector<Diagnostic> diagnostics;
|
||||
wfiles->DoAction([&]() { diagnostics = wfile->diagnostics_; });
|
||||
wfiles->DoAction([&]() { diagnostics = wf->diagnostics_; });
|
||||
for (Diagnostic &diag : diagnostics)
|
||||
if (diag.fixits_.size()) {
|
||||
if (diag.fixits_.size() &&
|
||||
(param.range.Intersects(diag.range) ||
|
||||
llvm::any_of(diag.fixits_, [&](const TextEdit &edit) {
|
||||
return param.range.Intersects(edit.range);
|
||||
}))) {
|
||||
CodeAction &cmd = result.emplace_back();
|
||||
cmd.title = "FixIt: " + diag.message;
|
||||
auto &edit = cmd.edit.documentChanges.emplace_back();
|
||||
edit.textDocument.uri = param.textDocument.uri;
|
||||
edit.textDocument.version = wfile->version;
|
||||
edit.textDocument.version = wf->version;
|
||||
edit.edits = diag.fixits_;
|
||||
}
|
||||
reply(result);
|
||||
|
@ -201,8 +201,7 @@ void MessageHandler::textDocument_documentSymbol(Reader &reader,
|
||||
// range.
|
||||
if (sym.extent.Valid())
|
||||
if (auto range1 = GetLsRange(wfile, sym.extent);
|
||||
range1 && range1->start <= range->start &&
|
||||
range->end <= range1->end)
|
||||
range1 && range1->Includes(*range))
|
||||
ds->range = *range1;
|
||||
}
|
||||
std::vector<const void *> def_ptrs;
|
||||
|
Loading…
Reference in New Issue
Block a user