mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Fixes doxygen style multiline comment parsing for files with CRLF as line terminators.
This commit is contained in:
committed by
Christian Parpart
parent
45583895fc
commit
f85f6ba7e0
@@ -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
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user