aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLefteris Karapetsas <lefteris@refu.co>2014-12-18 20:27:25 +0800
committerLefteris Karapetsas <lefteris@refu.co>2014-12-18 22:03:45 +0800
commitf73278c8b2373e4cd27408618ef4a65001ff1437 (patch)
tree36835e60aebf792e94faada2ef891b82f1ffcd10
parentd3234c51b9de3548bef5a2afd0fc55851fce43d7 (diff)
downloaddexon-solidity-f73278c8b2373e4cd27408618ef4a65001ff1437.tar
dexon-solidity-f73278c8b2373e4cd27408618ef4a65001ff1437.tar.gz
dexon-solidity-f73278c8b2373e4cd27408618ef4a65001ff1437.tar.bz2
dexon-solidity-f73278c8b2373e4cd27408618ef4a65001ff1437.tar.lz
dexon-solidity-f73278c8b2373e4cd27408618ef4a65001ff1437.tar.xz
dexon-solidity-f73278c8b2373e4cd27408618ef4a65001ff1437.tar.zst
dexon-solidity-f73278c8b2373e4cd27408618ef4a65001ff1437.zip
Scanner properly scans multiline natspec comments
- Single and multiline natspect comments get the initial whitespace skipped now - Some rules introduced for the multiline comments. If first line is empty then no newline is added to the literal. Same thing with the last line. Finally in all lines initial '*' are skipped
-rw-r--r--Scanner.cpp36
-rw-r--r--Scanner.h2
2 files changed, 30 insertions, 8 deletions
diff --git a/Scanner.cpp b/Scanner.cpp
index 2e9b7b45..890d6949 100644
--- a/Scanner.cpp
+++ b/Scanner.cpp
@@ -209,6 +209,15 @@ bool Scanner::skipWhitespace()
return getSourcePos() != startPosition;
}
+bool Scanner::skipWhitespaceExceptLF()
+{
+ int const startPosition = getSourcePos();
+ while (m_char == ' ' || m_char == '\t')
+ advance();
+ // Return whether or not we skipped any characters.
+ return getSourcePos() != startPosition;
+}
+
Token::Value Scanner::skipSingleLineComment()
{
// The line terminator at the end of the line is not considered
@@ -222,7 +231,8 @@ Token::Value Scanner::skipSingleLineComment()
Token::Value Scanner::scanSingleLineDocComment()
{
LiteralScope literal(this, LITERAL_TYPE_COMMENT);
- advance(); //consume the last '/'
+ advance(); //consume the last '/' at ///
+ skipWhitespaceExceptLF();
while (!isSourcePastEndOfInput())
{
if (isLineTerminator(m_char))
@@ -273,18 +283,27 @@ Token::Value Scanner::scanMultiLineDocComment()
{
LiteralScope literal(this, LITERAL_TYPE_COMMENT);
bool endFound = false;
+ bool charsAdded = false;
- advance(); //consume the last '*'
+ advance(); //consume the last '*' at /**
+ skipWhitespaceExceptLF();
while (!isSourcePastEndOfInput())
{
- // skip starting '*' in multiine comments
+ //handle newlines in multline comments
if (isLineTerminator(m_char))
{
skipWhitespace();
- if (!m_source.isPastEndOfInput(2) && m_source.get(1) == '*' && m_source.get(2) != '/')
- {
- addCommentLiteralChar('\n');
- m_char = m_source.advanceAndGet(3);
+ if (!m_source.isPastEndOfInput(1) && m_source.get(0) == '*' && m_source.get(1) != '/')
+ { // skip first '*' in subsequent lines
+ if (charsAdded)
+ addCommentLiteralChar('\n');
+ m_char = m_source.advanceAndGet(2);
+ }
+ else if (!m_source.isPastEndOfInput(1) && m_source.get(0) == '*' && m_source.get(1) == '/')
+ { // if after newline the comment ends, don't insert the newline
+ m_char = m_source.advanceAndGet(2);
+ endFound = true;
+ break;
}
else
addCommentLiteralChar('\n');
@@ -292,11 +311,12 @@ Token::Value Scanner::scanMultiLineDocComment()
if (!m_source.isPastEndOfInput(1) && m_source.get(0) == '*' && m_source.get(1) == '/')
{
- m_source.advanceAndGet(2);
+ m_char = m_source.advanceAndGet(2);
endFound = true;
break;
}
addCommentLiteralChar(m_char);
+ charsAdded = true;
advance();
}
literal.complete();
diff --git a/Scanner.h b/Scanner.h
index 7f1b1835..5e70db51 100644
--- a/Scanner.h
+++ b/Scanner.h
@@ -182,6 +182,8 @@ private:
/// Skips all whitespace and @returns true if something was skipped.
bool skipWhitespace();
+ /// Skips all whitespace except Line feeds and returns true if something was skipped
+ bool skipWhitespaceExceptLF();
Token::Value skipSingleLineComment();
Token::Value skipMultiLineComment();