[IDE] Pass a SourceRange instead of a CharSourceRange in SemaAnnotator::passReference

Most `SemaAnnotator`s don’t actually care about the char source range. Instead, they only care about the start location of the reference, which is also included in `SourceRange`. Computing a `CharSourceRange` from a `SourceRange` is kind of expensive because it needs to start a new lexer.

To avoid this overhead, pass `SourceRange` to `SemaAnnotator::passReference` and related functions and let the clients compute the `CharSourceRange` when needed.

This reduces the overhead of index-while-building by about 10%.
This commit is contained in:
Alex Hoppen
2025-06-04 12:34:07 +02:00
parent 9ae142c9d3
commit c6c40de73d
10 changed files with 95 additions and 88 deletions

View File

@@ -829,9 +829,9 @@ bool swift::emitLoadedModuleTraceIfNeeded(ModuleDecl *mainModule,
class ObjcMethodReferenceCollector: public SourceEntityWalker {
unsigned CurrentFileID;
llvm::DenseMap<const clang::ObjCMethodDecl*, unsigned> results;
bool visitDeclReference(ValueDecl *D, CharSourceRange Range,
TypeDecl *CtorTyRef, ExtensionDecl *ExtTyRef,
Type T, ReferenceMetaData Data) override {
bool visitDeclReference(ValueDecl *D, SourceRange Range, TypeDecl *CtorTyRef,
ExtensionDecl *ExtTyRef, Type T,
ReferenceMetaData Data) override {
if (!Range.isValid())
return true;
if (auto *clangD = dyn_cast_or_null<clang::ObjCMethodDecl>(D->getClangDecl()))