Implement an optimization for finding the comment that occurs just after a

given declaration.

It is based on the observation that during parsing the comment that should be
attached to the decl is usually among the last two documentation comments
parsed.

llvm-svn: 160400
This commit is contained in:
Dmitri Gribenko 2012-07-17 22:01:09 +00:00
parent 8b808c0c3d
commit 82ea947018
1 changed files with 24 additions and 6 deletions

View File

@ -97,12 +97,30 @@ RawComment *ASTContext::getRawCommentForDeclNoCache(const Decl *D) const {
return NULL; return NULL;
// Find the comment that occurs just after this declaration. // Find the comment that occurs just after this declaration.
RawComment CommentAtDeclLoc(SourceMgr, SourceRange(DeclLoc)); ArrayRef<RawComment *>::iterator Comment;
ArrayRef<RawComment *>::iterator Comment {
= std::lower_bound(RawComments.begin(), // When searching for comments during parsing, the comment we are looking
RawComments.end(), // for is usually among the last two comments we parsed -- check them
&CommentAtDeclLoc, // first.
BeforeThanCompare<RawComment>(SourceMgr)); RawComment CommentAtDeclLoc(SourceMgr, SourceRange(DeclLoc));
BeforeThanCompare<RawComment> Compare(SourceMgr);
ArrayRef<RawComment *>::iterator MaybeBeforeDecl = RawComments.end() - 1;
bool Found = Compare(*MaybeBeforeDecl, &CommentAtDeclLoc);
if (!Found && RawComments.size() >= 2) {
MaybeBeforeDecl--;
Found = Compare(*MaybeBeforeDecl, &CommentAtDeclLoc);
}
if (Found) {
Comment = MaybeBeforeDecl + 1;
assert(Comment == std::lower_bound(RawComments.begin(), RawComments.end(),
&CommentAtDeclLoc, Compare));
} else {
// Slow path.
Comment = std::lower_bound(RawComments.begin(), RawComments.end(),
&CommentAtDeclLoc, Compare);
}
}
// Decompose the location for the declaration and find the beginning of the // Decompose the location for the declaration and find the beginning of the
// file buffer. // file buffer.