forked from OSchip/llvm-project
Fix Lexer::ComputePreamble when MaxLines parameter is non-zero.
The function was only counting lines that included tokens and not empty lines, but MaxLines (mainly initiated to the line where the code-completion point resides) is a count of overall lines (even empty ones). llvm-svn: 139085
This commit is contained in:
parent
09ade9bb8b
commit
a3deaeeb52
|
@ -2254,7 +2254,8 @@ void ASTUnit::CodeComplete(StringRef File, unsigned Line, unsigned Column,
|
|||
llvm::sys::PathWithStatus MainPath(OriginalSourceFile);
|
||||
if (const FileStatus *CompleteFileStatus = CompleteFilePath.getFileStatus())
|
||||
if (const FileStatus *MainStatus = MainPath.getFileStatus())
|
||||
if (CompleteFileStatus->getUniqueID() == MainStatus->getUniqueID())
|
||||
if (CompleteFileStatus->getUniqueID() == MainStatus->getUniqueID() &&
|
||||
Line > 1)
|
||||
OverrideMainBuffer
|
||||
= getMainBufferWithPrecompiledPreamble(*CCInvocation, false,
|
||||
Line - 1);
|
||||
|
|
|
@ -519,7 +519,22 @@ Lexer::ComputePreamble(const llvm::MemoryBuffer *Buffer,
|
|||
Token TheTok;
|
||||
Token IfStartTok;
|
||||
unsigned IfCount = 0;
|
||||
unsigned Line = 0;
|
||||
|
||||
unsigned MaxLineOffset = 0;
|
||||
if (MaxLines) {
|
||||
const char *CurPtr = Buffer->getBufferStart();
|
||||
unsigned CurLine = 0;
|
||||
while (CurPtr != Buffer->getBufferEnd()) {
|
||||
char ch = *CurPtr++;
|
||||
if (ch == '\n') {
|
||||
++CurLine;
|
||||
if (CurLine == MaxLines)
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (CurPtr != Buffer->getBufferEnd())
|
||||
MaxLineOffset = CurPtr - Buffer->getBufferStart();
|
||||
}
|
||||
|
||||
do {
|
||||
TheLexer.LexFromRawLexer(TheTok);
|
||||
|
@ -543,11 +558,11 @@ Lexer::ComputePreamble(const llvm::MemoryBuffer *Buffer,
|
|||
|
||||
// Keep track of the # of lines in the preamble.
|
||||
if (TheTok.isAtStartOfLine()) {
|
||||
++Line;
|
||||
unsigned TokOffset = TheTok.getLocation().getRawEncoding() - StartOffset;
|
||||
|
||||
// If we were asked to limit the number of lines in the preamble,
|
||||
// and we're about to exceed that limit, we're done.
|
||||
if (MaxLines && Line >= MaxLines)
|
||||
if (MaxLineOffset && TokOffset >= MaxLineOffset)
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue