Fixes doxygen style multiline comment parsing for files with CRLF as line terminators.

This commit is contained in:
Christian Parpart
2019-09-25 12:59:46 +02:00
committed by Christian Parpart
parent 45583895fc
commit f85f6ba7e0
5 changed files with 57 additions and 15 deletions
-5
View File
@@ -30,11 +30,6 @@ inline bool isHexDigit(char c)
('A' <= c && c <= 'F');
}
inline bool isLineTerminator(char c)
{
return c == '\n';
}
inline bool isWhiteSpace(char c)
{
return c == ' ' || c == '\n' || c == '\t' || c == '\r';
+30 -6
View File
@@ -280,6 +280,29 @@ Token Scanner::skipSingleLineComment()
return Token::Whitespace;
}
bool Scanner::atEndOfLine() const
{
return m_char == '\n' || m_char == '\r';
}
bool Scanner::tryScanEndOfLine()
{
if (m_char == '\n')
{
advance();
return true;
}
if (m_char == '\r')
{
if (advance() && m_char == '\n')
advance();
return true;
}
return false;
}
Token Scanner::scanSingleLineDocComment()
{
LiteralScope literal(this, LITERAL_TYPE_COMMENT);
@@ -289,7 +312,7 @@ Token Scanner::scanSingleLineDocComment()
while (!isSourcePastEndOfInput())
{
if (isLineTerminator(m_char))
if (tryScanEndOfLine())
{
// check if next line is also a documentation comment
skipWhitespace();
@@ -303,7 +326,6 @@ Token Scanner::scanSingleLineDocComment()
}
else
break; // next line is not a documentation comment, we are done
}
else if (isUnicodeLinebreak())
// Any line terminator that is not '\n' is considered to end the
@@ -343,13 +365,13 @@ Token Scanner::scanMultiLineDocComment()
bool endFound = false;
bool charsAdded = false;
while (isWhiteSpace(m_char) && !isLineTerminator(m_char))
while (isWhiteSpace(m_char) && !atEndOfLine())
advance();
while (!isSourcePastEndOfInput())
{
//handle newlines in multline comments
if (isLineTerminator(m_char))
if (atEndOfLine())
{
skipWhitespace();
if (!m_source->isPastEndOfInput(1) && m_source->get(0) == '*' && m_source->get(1) == '*')
@@ -664,10 +686,12 @@ void Scanner::scanToken()
bool Scanner::scanEscape()
{
char c = m_char;
advance();
// Skip escaped newlines.
if (isLineTerminator(c))
if (tryScanEndOfLine())
return true;
advance();
switch (c)
{
case '\'': // fall through
+6
View File
@@ -219,6 +219,12 @@ private:
Token skipSingleLineComment();
Token skipMultiLineComment();
/// Tests if current source position is CR, LF or CRLF.
bool atEndOfLine() const;
/// Tries to consume CR, LF or CRLF line terminators and returns success or failure.
bool tryScanEndOfLine();
void scanDecimalDigits();
Token scanNumber(char _charSeen = 0);
std::tuple<Token, unsigned, unsigned> scanIdentifierOrKeyword();