[libclang] Make sure the preable does not truncate comments.

rdar://13647445

llvm-svn: 179907
This commit is contained in:
Argyrios Kyrtzidis 2013-04-19 23:24:25 +00:00
parent 1ebb2a1c56
commit 0903f8dac5
2 changed files with 28 additions and 2 deletions

View File

@ -557,6 +557,7 @@ Lexer::ComputePreamble(const llvm::MemoryBuffer *Buffer,
SourceLocation FileLoc = SourceLocation::getFromRawEncoding(StartOffset);
Lexer TheLexer(FileLoc, LangOpts, Buffer->getBufferStart(),
Buffer->getBufferStart(), Buffer->getBufferEnd());
TheLexer.SetCommentRetentionState(true);
// StartLoc will differ from FileLoc if there is a BOM that was skipped.
SourceLocation StartLoc = TheLexer.getSourceLocation();
@ -565,6 +566,7 @@ Lexer::ComputePreamble(const llvm::MemoryBuffer *Buffer,
Token TheTok;
Token IfStartTok;
unsigned IfCount = 0;
SourceLocation ActiveCommentLoc;
unsigned MaxLineOffset = 0;
if (MaxLines) {
@ -612,13 +614,17 @@ Lexer::ComputePreamble(const llvm::MemoryBuffer *Buffer,
}
// Comments are okay; skip over them.
if (TheTok.getKind() == tok::comment)
if (TheTok.getKind() == tok::comment) {
if (ActiveCommentLoc.isInvalid())
ActiveCommentLoc = TheTok.getLocation();
continue;
}
if (TheTok.isAtStartOfLine() && TheTok.getKind() == tok::hash) {
// This is the start of a preprocessor directive.
Token HashTok = TheTok;
InPreprocessorDirective = true;
ActiveCommentLoc = SourceLocation();
// Figure out which directive this is. Since we're lexing raw tokens,
// we don't have an identifier table available. Instead, just look at
@ -689,7 +695,14 @@ Lexer::ComputePreamble(const llvm::MemoryBuffer *Buffer,
break;
} while (true);
SourceLocation End = IfCount? IfStartTok.getLocation() : TheTok.getLocation();
SourceLocation End;
if (IfCount)
End = IfStartTok.getLocation();
else if (ActiveCommentLoc.isValid())
End = ActiveCommentLoc; // don't truncate a decl comment.
else
End = TheTok.getLocation();
return std::make_pair(End.getRawEncoding() - StartLoc.getRawEncoding(),
IfCount? IfStartTok.isAtStartOfLine()
: TheTok.isAtStartOfLine());

View File

@ -0,0 +1,13 @@
// Make sure the preable does not truncate comments.
#ifndef BAZ
#define BAZ 3
#endif
//! Foos description.
void Foo();
// RUN: c-index-test -test-load-source-reparse 1 local %s | FileCheck %s
// RUN: env CINDEXTEST_EDITING=1 c-index-test -test-load-source-reparse 1 local %s | FileCheck %s
// CHECK: FunctionDecl=Foo:8:6 RawComment=[//! Foos description.] RawCommentRange=[7:1 - 7:25] BriefComment=[Foos description.]