@@ -328,13 +328,15 @@ bool Annotator::generate(clang::Sema &Sema, bool WasInDatabase)
328
328
}
329
329
#endif
330
330
for (const auto &it2 : it.second ) {
331
- clang::SourceLocation loc = it2.loc ;
331
+ clang::SourceRange loc = it2.loc ;
332
332
clang::SourceManager &sm = getSourceMgr ();
333
- clang::SourceLocation exp = sm.getExpansionLoc (loc);
334
- std::string fn = htmlNameForFile (sm.getFileID (exp ));
333
+ clang::SourceLocation expBegin = sm.getExpansionLoc (loc.getBegin ());
334
+ clang::SourceLocation expEnd = sm.getExpansionLoc (loc.getEnd ());
335
+ std::string fn = htmlNameForFile (sm.getFileID (expBegin));
335
336
if (fn.empty ())
336
337
continue ;
337
- clang::PresumedLoc fixed = sm.getPresumedLoc (exp );
338
+ clang::PresumedLoc fixedBegin = sm.getPresumedLoc (expBegin);
339
+ clang::PresumedLoc fixedEnd = sm.getPresumedLoc (expEnd);
338
340
const char *tag = " " ;
339
341
char usetype = ' \0 ' ;
340
342
switch (it2.what ) {
@@ -375,8 +377,10 @@ bool Annotator::generate(clang::Sema &Sema, bool WasInDatabase)
375
377
}
376
378
myfile << " <" << tag << " f='" ;
377
379
Generator::escapeAttr (myfile, fn);
378
- myfile << " ' l='" << fixed.getLine () <<" '" ;
379
- if (loc.isMacroID ()) myfile << " macro='1'" ;
380
+ myfile << " ' l='" << fixedBegin.getLine () <<" '" ;
381
+ if (fixedBegin.getLine () != fixedEnd.getLine ())
382
+ myfile << " ll='" << fixedEnd.getLine () <<" '" ;
383
+ if (loc.getBegin ().isMacroID ()) myfile << " macro='1'" ;
380
384
if (!WasInDatabase) myfile << " brk='1'" ;
381
385
if (usetype) myfile << " u='" << usetype << " '" ;
382
386
const auto &refType = it2.typeOrContext ;
@@ -597,7 +601,7 @@ void Annotator::registerReference(clang::NamedDecl* decl, clang::SourceRange ran
597
601
if (usedContext && typeText.empty () && declType == Use) {
598
602
typeText = getContextStr (usedContext);
599
603
}
600
- addReference (getReferenceAndTitle (decl).first , range. getBegin () , type, declType, typeText, decl);
604
+ addReference (getReferenceAndTitle (decl).first , range, type, declType, typeText, decl);
601
605
}
602
606
return ;
603
607
}
@@ -643,7 +647,10 @@ void Annotator::registerReference(clang::NamedDecl* decl, clang::SourceRange ran
643
647
typeText = getContextStr (usedContext);
644
648
}
645
649
646
- addReference (ref, range.getBegin (), type, declType, typeText, decl);
650
+ clang::SourceRange definitionRange = range;
651
+ if (declType == Definition)
652
+ definitionRange = decl->getSourceRange ();
653
+ addReference (ref, definitionRange, type, declType, typeText, decl);
647
654
648
655
if (declType == Definition && ref.find (' {' ) >= ref.size ()) {
649
656
if (clang::FunctionDecl* fun = llvm::dyn_cast<clang::FunctionDecl>(decl)) {
@@ -749,7 +756,7 @@ void Annotator::registerReference(clang::NamedDecl* decl, clang::SourceRange ran
749
756
}
750
757
}
751
758
752
- void Annotator::addReference (const std::string &ref, clang::SourceLocation refLoc, TokenType type,
759
+ void Annotator::addReference (const std::string &ref, clang::SourceRange refLoc, TokenType type,
753
760
DeclType dt, const std::string &typeRef, clang::Decl *decl)
754
761
{
755
762
if (type == Ref || type == Member || type == Decl || type == Call || type == EnumDecl
0 commit comments