mirror of
				https://github.com/MaskRay/ccls.git
				synced 2025-10-30 20:22:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			56 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "message_handler.h"
 | |
| #include "query_utils.h"
 | |
| #include "queue_manager.h"
 | |
| 
 | |
| namespace {
 | |
| MethodType kMethodType = "$ccls/vars";
 | |
| 
 | |
| struct In_CclsVars : public RequestInMessage {
 | |
|   MethodType GetMethodType() const override { return kMethodType; }
 | |
| 
 | |
|   lsTextDocumentPositionParams params;
 | |
| };
 | |
| MAKE_REFLECT_STRUCT(In_CclsVars, id, params);
 | |
| REGISTER_IN_MESSAGE(In_CclsVars);
 | |
| 
 | |
| struct Handler_CclsVars : BaseMessageHandler<In_CclsVars> {
 | |
|   MethodType GetMethodType() const override { return kMethodType; }
 | |
| 
 | |
|   void Run(In_CclsVars* request) override {
 | |
|     QueryFile* file;
 | |
|     if (!FindFileOrFail(db, project, request->id,
 | |
|                         request->params.textDocument.uri.GetPath(), &file)) {
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     WorkingFile* working_file =
 | |
|         working_files->GetFileByFilename(file->def->path);
 | |
| 
 | |
|     Out_LocationList out;
 | |
|     out.id = request->id;
 | |
|     for (SymbolRef sym :
 | |
|          FindSymbolsAtLocation(working_file, file, request->params.position)) {
 | |
|       Usr usr = sym.usr;
 | |
|       switch (sym.kind) {
 | |
|         default:
 | |
|           break;
 | |
|         case SymbolKind::Var: {
 | |
|           const QueryVar::Def* def = db->GetVar(sym).AnyDef();
 | |
|           if (!def || !def->type)
 | |
|             continue;
 | |
|           usr = def->type;
 | |
|           [[fallthrough]];
 | |
|         }
 | |
|         case SymbolKind::Type:
 | |
|           out.result = GetLsLocationExs(
 | |
|               db, working_files,
 | |
|               GetDeclarations(db->usr2var, db->Type(usr).instances));
 | |
|           break;
 | |
|       }
 | |
|     }
 | |
|     QueueManager::WriteStdout(kMethodType, out);
 | |
|   }
 | |
| };
 | |
| REGISTER_MESSAGE_HANDLER(Handler_CclsVars);
 | |
| }  // namespace
 |