mirror of
				https://github.com/MaskRay/ccls.git
				synced 2025-11-04 14:17:07 +00:00 
			
		
		
		
	wip
This commit is contained in:
		
							parent
							
								
									b7d9a0f815
								
							
						
					
					
						commit
						243ed8dfa5
					
				
							
								
								
									
										23
									
								
								indexer.cpp
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								indexer.cpp
									
									
									
									
									
								
							@ -87,9 +87,6 @@ IndexedTypeDef::IndexedTypeDef(TypeId id, const std::string& usr) : def(id, usr)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void IndexedTypeDef::AddUsage(Location loc, bool insert_if_not_present) {
 | 
					void IndexedTypeDef::AddUsage(Location loc, bool insert_if_not_present) {
 | 
				
			||||||
  if (is_system_def)
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  for (int i = uses.size() - 1; i >= 0; --i) {
 | 
					  for (int i = uses.size() - 1; i >= 0; --i) {
 | 
				
			||||||
    if (uses[i].IsEqualTo(loc)) {
 | 
					    if (uses[i].IsEqualTo(loc)) {
 | 
				
			||||||
      if (loc.interesting)
 | 
					      if (loc.interesting)
 | 
				
			||||||
@ -435,7 +432,7 @@ void indexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
 | 
				
			|||||||
    VarId var_id = db->ToVarId(decl->entityInfo->USR);
 | 
					    VarId var_id = db->ToVarId(decl->entityInfo->USR);
 | 
				
			||||||
    IndexedVarDef* var_def = db->Resolve(var_id);
 | 
					    IndexedVarDef* var_def = db->Resolve(var_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var_def->is_system_def = is_system_def;
 | 
					    var_def->is_bad_def = is_system_def;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // TODO: Eventually run with this if. Right now I want to iron out bugs this may shadow.
 | 
					    // TODO: Eventually run with this if. Right now I want to iron out bugs this may shadow.
 | 
				
			||||||
    // TODO: Verify this gets called multiple times
 | 
					    // TODO: Verify this gets called multiple times
 | 
				
			||||||
@ -482,7 +479,7 @@ void indexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
 | 
				
			|||||||
    FuncId func_id = db->ToFuncId(decl->entityInfo->USR);
 | 
					    FuncId func_id = db->ToFuncId(decl->entityInfo->USR);
 | 
				
			||||||
    IndexedFuncDef* func_def = db->Resolve(func_id);
 | 
					    IndexedFuncDef* func_def = db->Resolve(func_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    func_def->is_system_def = is_system_def;
 | 
					    func_def->is_bad_def = is_system_def;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // TODO: Eventually run with this if. Right now I want to iron out bugs this may shadow.
 | 
					    // TODO: Eventually run with this if. Right now I want to iron out bugs this may shadow.
 | 
				
			||||||
    //if (!decl->isRedeclaration) {
 | 
					    //if (!decl->isRedeclaration) {
 | 
				
			||||||
@ -599,7 +596,7 @@ void indexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
 | 
				
			|||||||
    TypeId type_id = db->ToTypeId(decl->entityInfo->USR);
 | 
					    TypeId type_id = db->ToTypeId(decl->entityInfo->USR);
 | 
				
			||||||
    IndexedTypeDef* type_def = db->Resolve(type_id);
 | 
					    IndexedTypeDef* type_def = db->Resolve(type_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    type_def->is_system_def = is_system_def;
 | 
					    type_def->is_bad_def = is_system_def;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (alias_of)
 | 
					    if (alias_of)
 | 
				
			||||||
      type_def->def.alias_of = alias_of.value();
 | 
					      type_def->def.alias_of = alias_of.value();
 | 
				
			||||||
@ -621,7 +618,7 @@ void indexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
 | 
				
			|||||||
    TypeId type_id = db->ToTypeId(decl->entityInfo->USR);
 | 
					    TypeId type_id = db->ToTypeId(decl->entityInfo->USR);
 | 
				
			||||||
    IndexedTypeDef* type_def = db->Resolve(type_id);
 | 
					    IndexedTypeDef* type_def = db->Resolve(type_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    type_def->is_system_def = is_system_def;
 | 
					    type_def->is_bad_def = is_system_def;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // TODO: Eventually run with this if. Right now I want to iron out bugs this may shadow.
 | 
					    // TODO: Eventually run with this if. Right now I want to iron out bugs this may shadow.
 | 
				
			||||||
    // TODO: For type section, verify if this ever runs for non definitions?
 | 
					    // TODO: For type section, verify if this ever runs for non definitions?
 | 
				
			||||||
@ -778,6 +775,14 @@ void indexEntityReference(CXClientData client_data, const CXIdxEntityRefInfo* re
 | 
				
			|||||||
    TypeId referenced_id = db->ToTypeId(ref->referencedEntity->USR);
 | 
					    TypeId referenced_id = db->ToTypeId(ref->referencedEntity->USR);
 | 
				
			||||||
    IndexedTypeDef* referenced_def = db->Resolve(referenced_id);
 | 
					    IndexedTypeDef* referenced_def = db->Resolve(referenced_id);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    // We will not get a declaration visit for forward declared types. Try to mark them as non-bad 
 | 
				
			||||||
 | 
					    // defs here so we will output usages/etc.
 | 
				
			||||||
 | 
					    if (referenced_def->is_bad_def) {
 | 
				
			||||||
 | 
					      bool is_system_def = clang_Location_isInSystemHeader(clang_getCursorLocation(ref->referencedEntity->cursor));
 | 
				
			||||||
 | 
					      Location loc = db->file_db->Resolve(ref->referencedEntity->cursor, false /*interesting*/);
 | 
				
			||||||
 | 
					      if (!is_system_def && loc.raw_file_id != -1)
 | 
				
			||||||
 | 
					        referenced_def->is_bad_def = false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
    // The following will generate two TypeRefs to Foo, both located at the
 | 
					    // The following will generate two TypeRefs to Foo, both located at the
 | 
				
			||||||
    // same spot (line 3, column 3). One of the parents will be set to
 | 
					    // same spot (line 3, column 3). One of the parents will be set to
 | 
				
			||||||
@ -942,7 +947,7 @@ void WriteToFile(const std::string& filename, const std::string& content) {
 | 
				
			|||||||
  file << content;
 | 
					  file << content;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main(int argc, char** argv) {
 | 
					int main55555(int argc, char** argv) {
 | 
				
			||||||
  // TODO: Assert that we need to be on clang >= 3.9.1
 | 
					  // TODO: Assert that we need to be on clang >= 3.9.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /*
 | 
					  /*
 | 
				
			||||||
@ -956,7 +961,7 @@ int main(int argc, char** argv) {
 | 
				
			|||||||
  DUMP_AST = false;
 | 
					  DUMP_AST = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (std::string path : GetFilesInFolder("tests")) {
 | 
					  for (std::string path : GetFilesInFolder("tests")) {
 | 
				
			||||||
    //if (path != "tests/declaration_vs_definition/class_member_static.cc") continue;
 | 
					    //if (path != "tests/usage/type_usage_declare_field.cc") continue;
 | 
				
			||||||
    //if (path != "tests/enums/enum_class_decl.cc") continue;
 | 
					    //if (path != "tests/enums/enum_class_decl.cc") continue;
 | 
				
			||||||
    //if (path != "tests/constructors/constructor.cc") continue;
 | 
					    //if (path != "tests/constructors/constructor.cc") continue;
 | 
				
			||||||
    //if (path == "tests/constructors/destructor.cc") continue;
 | 
					    //if (path == "tests/constructors/destructor.cc") continue;
 | 
				
			||||||
 | 
				
			|||||||
@ -225,7 +225,7 @@ struct FileDb {
 | 
				
			|||||||
    unsigned int line, column, offset;
 | 
					    unsigned int line, column, offset;
 | 
				
			||||||
    clang_getSpellingLocation(cx_loc, &file, &line, &column, &offset);
 | 
					    clang_getSpellingLocation(cx_loc, &file, &line, &column, &offset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    FileId file_id;
 | 
					    FileId file_id(-1, -1);
 | 
				
			||||||
    if (file != nullptr) {
 | 
					    if (file != nullptr) {
 | 
				
			||||||
      std::string path = clang::ToString(clang_getFileName(file));
 | 
					      std::string path = clang::ToString(clang_getFileName(file));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -356,7 +356,7 @@ struct IndexedTypeDef {
 | 
				
			|||||||
  // NOTE: Do not insert directly! Use AddUsage instead.
 | 
					  // NOTE: Do not insert directly! Use AddUsage instead.
 | 
				
			||||||
  std::vector<Location> uses;
 | 
					  std::vector<Location> uses;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  bool is_system_def = false;
 | 
					  bool is_bad_def = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  IndexedTypeDef(TypeId id, const std::string& usr);
 | 
					  IndexedTypeDef(TypeId id, const std::string& usr);
 | 
				
			||||||
  void AddUsage(Location loc, bool insert_if_not_present = true);
 | 
					  void AddUsage(Location loc, bool insert_if_not_present = true);
 | 
				
			||||||
@ -437,7 +437,7 @@ struct IndexedFuncDef {
 | 
				
			|||||||
  // All usages. For interesting usages, see callees.
 | 
					  // All usages. For interesting usages, see callees.
 | 
				
			||||||
  std::vector<Location> uses;
 | 
					  std::vector<Location> uses;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  bool is_system_def = false;
 | 
					  bool is_bad_def = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  IndexedFuncDef(FuncId id, const std::string& usr) : def(id, usr) {
 | 
					  IndexedFuncDef(FuncId id, const std::string& usr) : def(id, usr) {
 | 
				
			||||||
    assert(usr.size() > 0);
 | 
					    assert(usr.size() > 0);
 | 
				
			||||||
@ -500,7 +500,7 @@ struct IndexedVarDef {
 | 
				
			|||||||
  // Usages.
 | 
					  // Usages.
 | 
				
			||||||
  std::vector<Location> uses;
 | 
					  std::vector<Location> uses;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  bool is_system_def = false;
 | 
					  bool is_bad_def = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  IndexedVarDef(VarId id, const std::string& usr) : def(id, usr) {
 | 
					  IndexedVarDef(VarId id, const std::string& usr) : def(id, usr) {
 | 
				
			||||||
    assert(usr.size() > 0);
 | 
					    assert(usr.size() > 0);
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										18
									
								
								query.cc
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								query.cc
									
									
									
									
									
								
							@ -38,6 +38,9 @@ struct IdMap {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  template<typename TId>
 | 
					  template<typename TId>
 | 
				
			||||||
  inline TId GenericRemap(GroupMap<TId>* map, int64_t* next_id, TId from) {
 | 
					  inline TId GenericRemap(GroupMap<TId>* map, int64_t* next_id, TId from) {
 | 
				
			||||||
 | 
					    if (from.group == target_group)
 | 
				
			||||||
 | 
					      return from;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // PERF: If this function is a hot-spot we can pull the group computation
 | 
					    // PERF: If this function is a hot-spot we can pull the group computation
 | 
				
			||||||
    // out, ie,
 | 
					    // out, ie,
 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
@ -89,6 +92,11 @@ struct IdMap {
 | 
				
			|||||||
    std::vector<TId> result;
 | 
					    std::vector<TId> result;
 | 
				
			||||||
    result.reserve(from.size());
 | 
					    result.reserve(from.size());
 | 
				
			||||||
    for (TId id : from) {
 | 
					    for (TId id : from) {
 | 
				
			||||||
 | 
					      if (id.group == target_group) {
 | 
				
			||||||
 | 
					        result.push_back(id);
 | 
				
			||||||
 | 
					        continue;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // Lookup the id from the group or add it.
 | 
					      // Lookup the id from the group or add it.
 | 
				
			||||||
      auto it = group.find(id);
 | 
					      auto it = group.find(id);
 | 
				
			||||||
      if (it == group.end()) {
 | 
					      if (it == group.end()) {
 | 
				
			||||||
@ -489,7 +497,13 @@ void CompareGroups(
 | 
				
			|||||||
  while (prev_it != previous_data.end() && curr_it != current_data.end()) {
 | 
					  while (prev_it != previous_data.end() && curr_it != current_data.end()) {
 | 
				
			||||||
    // same id
 | 
					    // same id
 | 
				
			||||||
    if (prev_it->def.id == curr_it->def.id) {
 | 
					    if (prev_it->def.id == curr_it->def.id) {
 | 
				
			||||||
      on_found(&*prev_it, &*curr_it);
 | 
					      if (!prev_it->is_bad_def && !curr_it->is_bad_def)
 | 
				
			||||||
 | 
					        on_found(&*prev_it, &*curr_it);
 | 
				
			||||||
 | 
					      else if (prev_it->is_bad_def)
 | 
				
			||||||
 | 
					        on_added(&*curr_it);
 | 
				
			||||||
 | 
					      else if (curr_it->is_bad_def)
 | 
				
			||||||
 | 
					        on_removed(&*curr_it);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ++prev_it;
 | 
					      ++prev_it;
 | 
				
			||||||
      ++curr_it;
 | 
					      ++curr_it;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -606,7 +620,7 @@ void ApplyIndexUpdate(const IndexUpdate& update, QueryableDatabase* db) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int ma333in(int argc, char** argv) {
 | 
					int main(int argc, char** argv) {
 | 
				
			||||||
  // TODO: Unify UserToIdResolver and FileDb
 | 
					  // TODO: Unify UserToIdResolver and FileDb
 | 
				
			||||||
  UsrToIdResolver usr_to_id(1);
 | 
					  UsrToIdResolver usr_to_id(1);
 | 
				
			||||||
  FileDb file_db(1);
 | 
					  FileDb file_db(1);
 | 
				
			||||||
 | 
				
			|||||||
@ -101,7 +101,8 @@ void Serialize(Writer& writer, IndexedFile* file) {
 | 
				
			|||||||
  writer.Key("types");
 | 
					  writer.Key("types");
 | 
				
			||||||
  writer.StartArray();
 | 
					  writer.StartArray();
 | 
				
			||||||
  for (IndexedTypeDef& def : file->types) {
 | 
					  for (IndexedTypeDef& def : file->types) {
 | 
				
			||||||
    if (def.is_system_def) continue;
 | 
					    if (def.is_bad_def)
 | 
				
			||||||
 | 
					      continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    writer.StartObject();
 | 
					    writer.StartObject();
 | 
				
			||||||
    SERIALIZE("id", def.id);
 | 
					    SERIALIZE("id", def.id);
 | 
				
			||||||
@ -124,7 +125,8 @@ void Serialize(Writer& writer, IndexedFile* file) {
 | 
				
			|||||||
  writer.Key("functions");
 | 
					  writer.Key("functions");
 | 
				
			||||||
  writer.StartArray();
 | 
					  writer.StartArray();
 | 
				
			||||||
  for (IndexedFuncDef& def : file->funcs) {
 | 
					  for (IndexedFuncDef& def : file->funcs) {
 | 
				
			||||||
    if (def.is_system_def) continue;
 | 
					    if (def.is_bad_def)
 | 
				
			||||||
 | 
					      continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    writer.StartObject();
 | 
					    writer.StartObject();
 | 
				
			||||||
    SERIALIZE("id", def.id);
 | 
					    SERIALIZE("id", def.id);
 | 
				
			||||||
@ -148,7 +150,8 @@ void Serialize(Writer& writer, IndexedFile* file) {
 | 
				
			|||||||
  writer.Key("variables");
 | 
					  writer.Key("variables");
 | 
				
			||||||
  writer.StartArray();
 | 
					  writer.StartArray();
 | 
				
			||||||
  for (IndexedVarDef& def : file->vars) {
 | 
					  for (IndexedVarDef& def : file->vars) {
 | 
				
			||||||
    if (def.is_system_def) continue;
 | 
					    if (def.is_bad_def)
 | 
				
			||||||
 | 
					      continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    writer.StartObject();
 | 
					    writer.StartObject();
 | 
				
			||||||
    SERIALIZE("id", def.id);
 | 
					    SERIALIZE("id", def.id);
 | 
				
			||||||
 | 
				
			|||||||
@ -49,10 +49,6 @@ OUTPUT:
 | 
				
			|||||||
      "parents": [1],
 | 
					      "parents": [1],
 | 
				
			||||||
      "derived": [5],
 | 
					      "derived": [5],
 | 
				
			||||||
      "uses": ["*1:11:7", "*1:13:56"]
 | 
					      "uses": ["*1:11:7", "*1:13:56"]
 | 
				
			||||||
    }, {
 | 
					 | 
				
			||||||
      "id": 4,
 | 
					 | 
				
			||||||
      "usr": "c:class_inherit_templated_parent.cc@154",
 | 
					 | 
				
			||||||
      "uses": ["*1:11:24"]
 | 
					 | 
				
			||||||
    }, {
 | 
					    }, {
 | 
				
			||||||
      "id": 5,
 | 
					      "id": 5,
 | 
				
			||||||
      "usr": "c:@S@Derived",
 | 
					      "usr": "c:@S@Derived",
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user