mirror of
				https://github.com/MaskRay/ccls.git
				synced 2025-11-03 22:04:24 +00:00 
			
		
		
		
	Fix .. in compdb path; better type alias
This commit is contained in:
		
							parent
							
								
									e5d8153d4b
								
							
						
					
					
						commit
						6a1902aeb6
					
				@ -65,6 +65,15 @@ OUTPUT:
 | 
			
		||||
      "types": [],
 | 
			
		||||
      "funcs": [],
 | 
			
		||||
      "vars": [{
 | 
			
		||||
          "L": 3348817847649945564,
 | 
			
		||||
          "R": -1
 | 
			
		||||
        }, {
 | 
			
		||||
          "L": 4821094820988543895,
 | 
			
		||||
          "R": -1
 | 
			
		||||
        }, {
 | 
			
		||||
          "L": 15292551660437765731,
 | 
			
		||||
          "R": -1
 | 
			
		||||
        }, {
 | 
			
		||||
          "L": 1963212417280098348,
 | 
			
		||||
          "R": 0
 | 
			
		||||
        }],
 | 
			
		||||
 | 
			
		||||
@ -401,12 +401,9 @@ std::unique_ptr<ClangTranslationUnit> ClangTranslationUnit::Create(
 | 
			
		||||
std::unique_ptr<ClangTranslationUnit> ClangTranslationUnit::Reparse(
 | 
			
		||||
    std::unique_ptr<ClangTranslationUnit> tu,
 | 
			
		||||
    std::vector<CXUnsavedFile>& unsaved) {
 | 
			
		||||
  int error_code;
 | 
			
		||||
  {
 | 
			
		||||
    error_code = clang_reparseTranslationUnit(
 | 
			
		||||
        tu->cx_tu, (unsigned)unsaved.size(), unsaved.data(),
 | 
			
		||||
        clang_defaultReparseOptions(tu->cx_tu));
 | 
			
		||||
  }
 | 
			
		||||
  int error_code = clang_reparseTranslationUnit(
 | 
			
		||||
      tu->cx_tu, (unsigned)unsaved.size(), unsaved.data(),
 | 
			
		||||
      clang_defaultReparseOptions(tu->cx_tu));
 | 
			
		||||
 | 
			
		||||
  if (error_code != CXError_Success && tu->cx_tu)
 | 
			
		||||
    EmitDiagnostics("<unknown>", {}, tu->cx_tu);
 | 
			
		||||
 | 
			
		||||
@ -1655,16 +1655,23 @@ void OnIndexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
 | 
			
		||||
 | 
			
		||||
    case CXIdxEntity_Typedef:
 | 
			
		||||
    case CXIdxEntity_CXXTypeAlias: {
 | 
			
		||||
      // Note we want to fetch the first TypeRef. Running
 | 
			
		||||
      // ResolveCursorType(decl->cursor) would return
 | 
			
		||||
      // the type of the typedef/using, not the type of the referenced type.
 | 
			
		||||
      IndexType* alias_of = AddDeclTypeUsages(
 | 
			
		||||
          db, cursor, nullptr, decl->semanticContainer, decl->lexicalContainer);
 | 
			
		||||
 | 
			
		||||
      IndexType& type = db->ToType(HashUsr(decl->entityInfo->USR));
 | 
			
		||||
 | 
			
		||||
      if (alias_of)
 | 
			
		||||
        type.def.alias_of = alias_of->usr;
 | 
			
		||||
      CXType Type = clang_getCursorType(decl->entityInfo->cursor);
 | 
			
		||||
      CXType CanonType = clang_getCanonicalType(Type);;
 | 
			
		||||
      if (clang_equalTypes(Type,  CanonType) == 0) {
 | 
			
		||||
        Usr type_usr = ClangType(CanonType).get_usr_hash();
 | 
			
		||||
        if (db->usr2type.count(type_usr)) {
 | 
			
		||||
          type.def.alias_of = type_usr;
 | 
			
		||||
        } else {
 | 
			
		||||
          // Note we want to fetch the first TypeRef. Running
 | 
			
		||||
          // ResolveCursorType(decl->cursor) would return
 | 
			
		||||
          // the type of the typedef/using, not the type of the referenced type.
 | 
			
		||||
          IndexType* alias_of = AddDeclTypeUsages(
 | 
			
		||||
              db, cursor, nullptr, decl->semanticContainer, decl->lexicalContainer);
 | 
			
		||||
          if (alias_of)
 | 
			
		||||
            type.def.alias_of = alias_of->usr;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      Range spell = cursor.get_spell();
 | 
			
		||||
      Range extent = cursor.get_extent();
 | 
			
		||||
@ -1709,17 +1716,11 @@ void OnIndexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
 | 
			
		||||
 | 
			
		||||
      IndexType& type = db->ToType(HashUsr(decl->entityInfo->USR));
 | 
			
		||||
 | 
			
		||||
      // 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?
 | 
			
		||||
      // if (!decl->isRedeclaration) {
 | 
			
		||||
 | 
			
		||||
      SetTypeName(type, cursor, decl->semanticContainer, decl->entityInfo->name,
 | 
			
		||||
                  param);
 | 
			
		||||
      type.def.kind = GetSymbolKind(decl->entityInfo->kind);
 | 
			
		||||
      if (g_config->index.comments)
 | 
			
		||||
        type.def.comments = Intern(cursor.get_comments());
 | 
			
		||||
      // }
 | 
			
		||||
 | 
			
		||||
      if (decl->isDefinition) {
 | 
			
		||||
        type.def.spell = SetUse(db, spell, sem_parent, Role::Definition);
 | 
			
		||||
@ -1781,12 +1782,6 @@ void OnIndexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // type_def->alias_of
 | 
			
		||||
      // type_def->funcs
 | 
			
		||||
      // type_def->types
 | 
			
		||||
      // type_def->uses
 | 
			
		||||
      // type_def->vars
 | 
			
		||||
 | 
			
		||||
      // Add type-level inheritance information.
 | 
			
		||||
      CXIdxCXXClassDeclInfo const* class_info =
 | 
			
		||||
          clang_index_getCXXClassDeclInfo(decl);
 | 
			
		||||
 | 
			
		||||
@ -94,17 +94,9 @@ bool FileNeedsParse(int64_t write_time,
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Command-line arguments changed.
 | 
			
		||||
  auto is_file = [](const std::string& arg) {
 | 
			
		||||
    return EndsWithAny(arg, {".h", ".c", ".cc", ".cpp", ".hpp", ".m", ".mm"});
 | 
			
		||||
  };
 | 
			
		||||
  if (opt_previous_index) {
 | 
			
		||||
    auto& prev_args = opt_previous_index->args;
 | 
			
		||||
    bool same = prev_args.size() == args.size();
 | 
			
		||||
    for (size_t i = 0; i < args.size() && same; ++i) {
 | 
			
		||||
      same = prev_args[i] == args[i] ||
 | 
			
		||||
             (is_file(prev_args[i]) && is_file(args[i]));
 | 
			
		||||
    }
 | 
			
		||||
    if (!same) {
 | 
			
		||||
    if (prev_args != args) {
 | 
			
		||||
      LOG_S(INFO) << "args changed for " << path << (from ? " (via " + *from + ")" : std::string());
 | 
			
		||||
      return true;
 | 
			
		||||
    }
 | 
			
		||||
@ -483,11 +475,10 @@ void MainLoop() {
 | 
			
		||||
      Main_OnIndexed(&db, &semantic_cache, &working_files, &*update);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Cleanup and free any unused memory.
 | 
			
		||||
    FreeUnusedMemory();
 | 
			
		||||
 | 
			
		||||
    if (!did_work)
 | 
			
		||||
    if (!did_work) {
 | 
			
		||||
      FreeUnusedMemory();
 | 
			
		||||
      main_waiter->Wait(on_indexed, on_request);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -48,7 +48,7 @@ struct CompileCommandsEntry {
 | 
			
		||||
      return path;
 | 
			
		||||
    SmallString<256> Ret;
 | 
			
		||||
    sys::path::append(Ret, directory, path);
 | 
			
		||||
    return Ret.str();
 | 
			
		||||
    return NormalizePath(Ret.str());
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
MAKE_REFLECT_STRUCT(CompileCommandsEntry, directory, file, command, args);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user