mirror of
				https://github.com/MaskRay/ccls.git
				synced 2025-11-03 22:04:24 +00:00 
			
		
		
		
	indexer: index TemplateTypeParmDecl and ParmVarDecl in declarations for clang >= 9
Index ParmVarDecl in declarations if index.parametersInDeclarations is true And support some unhandled Decl::Kind
This commit is contained in:
		
							parent
							
								
									0c04c27e59
								
							
						
					
					
						commit
						f35883f9b4
					
				@ -266,6 +266,9 @@ struct Config {
 | 
			
		||||
    // May be too slow for big projects, so it is off by default.
 | 
			
		||||
    bool onChange = false;
 | 
			
		||||
 | 
			
		||||
    // If true, index parameters in declarations.
 | 
			
		||||
    bool parametersInDeclarations = true;
 | 
			
		||||
 | 
			
		||||
    // Number of indexer threads. If 0, 80% of cores are used.
 | 
			
		||||
    int threads = 0;
 | 
			
		||||
 | 
			
		||||
@ -326,8 +329,8 @@ REFLECT_STRUCT(Config::Diagnostics, blacklist, onChange, onOpen, onSave,
 | 
			
		||||
REFLECT_STRUCT(Config::Highlight, largeFileSize, lsRanges, blacklist, whitelist)
 | 
			
		||||
REFLECT_STRUCT(Config::Index, blacklist, comments, initialBlacklist,
 | 
			
		||||
               initialWhitelist, maxInitializerLines, multiVersion,
 | 
			
		||||
               multiVersionBlacklist, multiVersionWhitelist, onChange, threads,
 | 
			
		||||
               trackDependency, whitelist);
 | 
			
		||||
               multiVersionBlacklist, multiVersionWhitelist, onChange,
 | 
			
		||||
               parametersInDeclarations, threads, trackDependency, whitelist);
 | 
			
		||||
REFLECT_STRUCT(Config::Request, timeout);
 | 
			
		||||
REFLECT_STRUCT(Config::Session, maxNum);
 | 
			
		||||
REFLECT_STRUCT(Config::WorkspaceSymbol, caseSensitivity, maxNum, sort);
 | 
			
		||||
 | 
			
		||||
@ -159,6 +159,9 @@ Kind GetKind(const Decl *D, SymbolKind &kind) {
 | 
			
		||||
  case Decl::UnresolvedUsingTypename:
 | 
			
		||||
    kind = SymbolKind::TypeAlias;
 | 
			
		||||
    return Kind::Type;
 | 
			
		||||
  case Decl::Using:
 | 
			
		||||
    kind = SymbolKind::Null; // ignored
 | 
			
		||||
    return Kind::Invalid;
 | 
			
		||||
  case Decl::Binding:
 | 
			
		||||
    kind = SymbolKind::Variable;
 | 
			
		||||
    return Kind::Var;
 | 
			
		||||
@ -181,6 +184,10 @@ Kind GetKind(const Decl *D, SymbolKind &kind) {
 | 
			
		||||
  case Decl::CXXDestructor:
 | 
			
		||||
    kind = SymbolKind::Method;
 | 
			
		||||
    return Kind::Func;
 | 
			
		||||
  case Decl::NonTypeTemplateParm:
 | 
			
		||||
    // ccls extension
 | 
			
		||||
    kind = SymbolKind::Parameter;
 | 
			
		||||
    return Kind::Var;
 | 
			
		||||
  case Decl::Var:
 | 
			
		||||
  case Decl::Decomposition:
 | 
			
		||||
    kind = SymbolKind::Variable;
 | 
			
		||||
@ -204,7 +211,6 @@ Kind GetKind(const Decl *D, SymbolKind &kind) {
 | 
			
		||||
    return Kind::Invalid;
 | 
			
		||||
 | 
			
		||||
  default:
 | 
			
		||||
    LOG_S(INFO) << "unhandled " << int(D->getKind());
 | 
			
		||||
    return Kind::Invalid;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@ -722,7 +728,7 @@ public:
 | 
			
		||||
    IndexFunc *func = nullptr;
 | 
			
		||||
    IndexType *type = nullptr;
 | 
			
		||||
    IndexVar *var = nullptr;
 | 
			
		||||
    SymbolKind ls_kind;
 | 
			
		||||
    SymbolKind ls_kind = SymbolKind::Unknown;
 | 
			
		||||
    Kind kind = GetKind(D, ls_kind);
 | 
			
		||||
 | 
			
		||||
    if (is_def)
 | 
			
		||||
@ -772,8 +778,10 @@ public:
 | 
			
		||||
    };
 | 
			
		||||
    switch (kind) {
 | 
			
		||||
    case Kind::Invalid:
 | 
			
		||||
      LOG_S(INFO) << "Unhandled " << int(D->getKind()) << " " << info->qualified
 | 
			
		||||
                  << " in " << db->path << ":" << loc.start.line + 1;
 | 
			
		||||
      if (ls_kind == SymbolKind::Unknown)
 | 
			
		||||
        LOG_S(INFO) << "Unhandled " << int(D->getKind()) << " "
 | 
			
		||||
                    << info->qualified << " in " << db->path << ":"
 | 
			
		||||
                    << (loc.start.line + 1) << ":" << (loc.start.column + 1);
 | 
			
		||||
      return true;
 | 
			
		||||
    case Kind::File:
 | 
			
		||||
      return true;
 | 
			
		||||
@ -807,8 +815,12 @@ public:
 | 
			
		||||
      do_def_decl(type);
 | 
			
		||||
      if (Spell != Loc)
 | 
			
		||||
        AddMacroUse(db, SM, usr, Kind::Type, Spell);
 | 
			
		||||
      if (type->def.detailed_name[0] == '\0' && info->short_name.size())
 | 
			
		||||
        SetName(D, info->short_name, info->qualified, type->def);
 | 
			
		||||
      if (type->def.detailed_name[0] == '\0' && info->short_name.size()) {
 | 
			
		||||
        if (D->getKind() == Decl::TemplateTypeParm)
 | 
			
		||||
          type->def.detailed_name = Intern(info->short_name);
 | 
			
		||||
        else
 | 
			
		||||
          SetName(OrigD, info->short_name, info->qualified, type->def);
 | 
			
		||||
      }
 | 
			
		||||
      if (is_def || is_decl) {
 | 
			
		||||
        const Decl *DC = cast<Decl>(SemDC);
 | 
			
		||||
        if (GetKind(DC, ls_kind) == Kind::Type)
 | 
			
		||||
@ -840,6 +852,7 @@ public:
 | 
			
		||||
            if (!isa<EnumConstantDecl>(D))
 | 
			
		||||
              db->ToType(usr1).instances.push_back(usr);
 | 
			
		||||
          } else if (const Decl *D1 = GetAdjustedDecl(GetTypeDecl(T))) {
 | 
			
		||||
#if LLVM_VERSION_MAJOR < 9
 | 
			
		||||
            if (isa<TemplateTypeParmDecl>(D1)) {
 | 
			
		||||
              // e.g. TemplateTypeParmDecl is not handled by
 | 
			
		||||
              // handleDeclOccurence.
 | 
			
		||||
@ -862,6 +875,7 @@ public:
 | 
			
		||||
                break;
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
            IndexParam::DeclInfo *info1;
 | 
			
		||||
            Usr usr1 = GetUsr(D1, &info1);
 | 
			
		||||
@ -1227,6 +1241,11 @@ Index(SemaManager *manager, WorkingFiles *wfiles, VFS *vfs,
 | 
			
		||||
      index::IndexingOptions::SystemSymbolFilterKind::All;
 | 
			
		||||
  IndexOpts.IndexFunctionLocals = true;
 | 
			
		||||
  IndexOpts.IndexImplicitInstantiation = true;
 | 
			
		||||
#if LLVM_VERSION_MAJOR >= 9
 | 
			
		||||
  IndexOpts.IndexParametersInDeclarations =
 | 
			
		||||
      g_config->index.parametersInDeclarations;
 | 
			
		||||
  IndexOpts.IndexTemplateParameters = true;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  std::unique_ptr<FrontendAction> Action = createIndexingAction(
 | 
			
		||||
      DataConsumer, IndexOpts, std::make_unique<IndexFrontendAction>(param));
 | 
			
		||||
 | 
			
		||||
@ -260,6 +260,9 @@ CompletionItemKind GetCompletionKind(CodeCompletionContext::Kind K,
 | 
			
		||||
    case Decl::TypeAlias:
 | 
			
		||||
    case Decl::Typedef:
 | 
			
		||||
      return CompletionItemKind::TypeParameter;
 | 
			
		||||
    case Decl::Using:
 | 
			
		||||
    case Decl::ConstructorUsingShadow:
 | 
			
		||||
      return CompletionItemKind::Keyword;
 | 
			
		||||
    case Decl::Binding:
 | 
			
		||||
      return CompletionItemKind::Variable;
 | 
			
		||||
    case Decl::Field:
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user