mirror of
				https://github.com/MaskRay/ccls.git
				synced 2025-11-03 22:04:24 +00:00 
			
		
		
		
	codeAction: use codeActionProvider: CodeActionOptions and respect CodeActionParams::range
This commit is contained in:
		
							parent
							
								
									38227e2bd5
								
							
						
					
					
						commit
						385eb582c8
					
				@ -97,6 +97,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 {
 | 
			
		||||
 | 
			
		||||
@ -51,11 +51,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;
 | 
			
		||||
@ -64,7 +64,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;
 | 
			
		||||
@ -72,7 +74,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 {
 | 
			
		||||
@ -81,7 +83,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 {
 | 
			
		||||
@ -90,9 +92,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);
 | 
			
		||||
 | 
			
		||||
@ -189,8 +189,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