mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #457 from VoR0220/tokenNameAndStringFix
Fix for Token::name and token::toString
This commit is contained in:
commit
285fdf3b0a
@ -44,14 +44,29 @@ int ParserBase::endPosition() const
|
|||||||
|
|
||||||
void ParserBase::expectToken(Token::Value _value)
|
void ParserBase::expectToken(Token::Value _value)
|
||||||
{
|
{
|
||||||
if (m_scanner->currentToken() != _value)
|
Token::Value tok = m_scanner->currentToken();
|
||||||
fatalParserError(
|
if (tok != _value)
|
||||||
string("Expected token ") +
|
{
|
||||||
string(Token::name(_value)) +
|
if (Token::isElementaryTypeName(tok)) //for the sake of accuracy in reporting
|
||||||
string(" got '") +
|
{
|
||||||
string(Token::name(m_scanner->currentToken())) +
|
ElementaryTypeNameToken elemTypeName = m_scanner->currentElementaryTypeNameToken();
|
||||||
string("'")
|
fatalParserError(
|
||||||
);
|
string("Expected token ") +
|
||||||
|
string(Token::name(_value)) +
|
||||||
|
string(" got '") +
|
||||||
|
elemTypeName.toString() +
|
||||||
|
string("'")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
fatalParserError(
|
||||||
|
string("Expected token ") +
|
||||||
|
string(Token::name(_value)) +
|
||||||
|
string(" got '") +
|
||||||
|
string(Token::name(m_scanner->currentToken())) +
|
||||||
|
string("'")
|
||||||
|
);
|
||||||
|
}
|
||||||
m_scanner->next();
|
m_scanner->next();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -59,23 +74,48 @@ Token::Value ParserBase::expectAssignmentOperator()
|
|||||||
{
|
{
|
||||||
Token::Value op = m_scanner->currentToken();
|
Token::Value op = m_scanner->currentToken();
|
||||||
if (!Token::isAssignmentOp(op))
|
if (!Token::isAssignmentOp(op))
|
||||||
fatalParserError(
|
{
|
||||||
string("Expected assignment operator, got '") +
|
if (Token::isElementaryTypeName(op)) //for the sake of accuracy in reporting
|
||||||
string(Token::name(m_scanner->currentToken())) +
|
{
|
||||||
string("'")
|
ElementaryTypeNameToken elemTypeName = m_scanner->currentElementaryTypeNameToken();
|
||||||
);
|
fatalParserError(
|
||||||
|
string("Expected assignment operator, got '") +
|
||||||
|
elemTypeName.toString() +
|
||||||
|
string("'")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
fatalParserError(
|
||||||
|
string("Expected assignment operator, got '") +
|
||||||
|
string(Token::name(m_scanner->currentToken())) +
|
||||||
|
string("'")
|
||||||
|
);
|
||||||
|
}
|
||||||
m_scanner->next();
|
m_scanner->next();
|
||||||
return op;
|
return op;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTPointer<ASTString> ParserBase::expectIdentifierToken()
|
ASTPointer<ASTString> ParserBase::expectIdentifierToken()
|
||||||
{
|
{
|
||||||
if (m_scanner->currentToken() != Token::Identifier)
|
Token::Value id = m_scanner->currentToken();
|
||||||
fatalParserError(
|
if (id != Token::Identifier)
|
||||||
string("Expected identifier, got '") +
|
{
|
||||||
string(Token::name(m_scanner->currentToken())) +
|
if (Token::isElementaryTypeName(id)) //for the sake of accuracy in reporting
|
||||||
string("'")
|
{
|
||||||
);
|
ElementaryTypeNameToken elemTypeName = m_scanner->currentElementaryTypeNameToken();
|
||||||
|
fatalParserError(
|
||||||
|
string("Expected identifier, got '") +
|
||||||
|
elemTypeName.toString() +
|
||||||
|
string("'")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
fatalParserError(
|
||||||
|
string("Expected identifier, got '") +
|
||||||
|
string(Token::name(id)) +
|
||||||
|
string("'")
|
||||||
|
);
|
||||||
|
}
|
||||||
return getLiteralAndAdvance();
|
return getLiteralAndAdvance();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,6 +119,13 @@ public:
|
|||||||
{
|
{
|
||||||
return m_currentToken.token;
|
return m_currentToken.token;
|
||||||
}
|
}
|
||||||
|
ElementaryTypeNameToken currentElementaryTypeNameToken()
|
||||||
|
{
|
||||||
|
unsigned firstSize;
|
||||||
|
unsigned secondSize;
|
||||||
|
std::tie(firstSize, secondSize) = m_currentToken.extendedTokenInfo;
|
||||||
|
return ElementaryTypeNameToken(m_currentToken.token, firstSize, secondSize);
|
||||||
|
}
|
||||||
|
|
||||||
SourceLocation currentLocation() const { return m_currentToken.location; }
|
SourceLocation currentLocation() const { return m_currentToken.location; }
|
||||||
std::string const& currentLiteral() const { return m_currentToken.literal; }
|
std::string const& currentLiteral() const { return m_currentToken.literal; }
|
||||||
|
@ -155,16 +155,17 @@ tuple<Token::Value, unsigned int, unsigned int> Token::fromIdentifierOrKeyword(s
|
|||||||
) {
|
) {
|
||||||
int n = parseSize(positionX + 1, _literal.end());
|
int n = parseSize(positionX + 1, _literal.end());
|
||||||
if (
|
if (
|
||||||
0 < m && m < 256 &&
|
0 <= m && m <= 256 &&
|
||||||
0 < n && n < 256 &&
|
0 <= n && n <= 256 &&
|
||||||
|
m + n > 0 &&
|
||||||
m + n <= 256 &&
|
m + n <= 256 &&
|
||||||
m % 8 == 0 &&
|
m % 8 == 0 &&
|
||||||
n % 8 == 0
|
n % 8 == 0
|
||||||
) {
|
) {
|
||||||
if (keyword == Token::UFixed)
|
if (keyword == Token::UFixed)
|
||||||
return make_tuple(Token::UFixed, m, n);
|
return make_tuple(Token::UFixedMxN, m, n);
|
||||||
else
|
else
|
||||||
return make_tuple(Token::Fixed, m, n);
|
return make_tuple(Token::FixedMxN, m, n);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -190,18 +190,18 @@ namespace solidity
|
|||||||
K(After, "after", 0) \
|
K(After, "after", 0) \
|
||||||
/* type keywords*/ \
|
/* type keywords*/ \
|
||||||
K(Int, "int", 0) \
|
K(Int, "int", 0) \
|
||||||
T(IntM, "intM", 0) \
|
|
||||||
K(UInt, "uint", 0) \
|
K(UInt, "uint", 0) \
|
||||||
T(UIntM, "uintM", 0) \
|
|
||||||
K(Bytes, "bytes", 0) \
|
K(Bytes, "bytes", 0) \
|
||||||
T(BytesM, "bytesM", 0) \
|
|
||||||
K(Byte, "byte", 0) \
|
K(Byte, "byte", 0) \
|
||||||
K(String, "string", 0) \
|
K(String, "string", 0) \
|
||||||
K(Address, "address", 0) \
|
K(Address, "address", 0) \
|
||||||
K(Bool, "bool", 0) \
|
K(Bool, "bool", 0) \
|
||||||
K(Fixed, "fixed", 0) \
|
K(Fixed, "fixed", 0) \
|
||||||
T(FixedMxN, "fixedMxN", 0) \
|
|
||||||
K(UFixed, "ufixed", 0) \
|
K(UFixed, "ufixed", 0) \
|
||||||
|
T(IntM, "intM", 0) \
|
||||||
|
T(UIntM, "uintM", 0) \
|
||||||
|
T(BytesM, "bytesM", 0) \
|
||||||
|
T(FixedMxN, "fixedMxN", 0) \
|
||||||
T(UFixedMxN, "ufixedMxN", 0) \
|
T(UFixedMxN, "ufixedMxN", 0) \
|
||||||
T(TypesEnd, NULL, 0) /* used as type enum end marker */ \
|
T(TypesEnd, NULL, 0) /* used as type enum end marker */ \
|
||||||
\
|
\
|
||||||
@ -334,8 +334,11 @@ public:
|
|||||||
std::string name = Token::toString(m_token);
|
std::string name = Token::toString(m_token);
|
||||||
if (tokenValue || (firstNumber() == 0 && secondNumber() == 0))
|
if (tokenValue || (firstNumber() == 0 && secondNumber() == 0))
|
||||||
return name;
|
return name;
|
||||||
//need to set it up this way for fixed types construction in future
|
solAssert(name.size() >= 3, "Token name size should be greater than 3. Should not reach here.");
|
||||||
return name.substr(0, name.size() - 1) + std::to_string(m_firstNumber);
|
if (m_token == Token::FixedMxN || m_token == Token::UFixedMxN)
|
||||||
|
return name.substr(0, name.size() - 3) + std::to_string(m_firstNumber) + "x" + std::to_string(m_secondNumber);
|
||||||
|
else
|
||||||
|
return name.substr(0, name.size() - 1) + std::to_string(m_firstNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -3258,6 +3258,18 @@ BOOST_AUTO_TEST_CASE(library_functions_do_not_have_value)
|
|||||||
BOOST_CHECK(!success(text));
|
BOOST_CHECK(!success(text));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(invalid_fixed_type_long)
|
||||||
|
{
|
||||||
|
char const* text = R"(
|
||||||
|
contract test {
|
||||||
|
function f() {
|
||||||
|
fixed8x888888888888888888888888888888888888888888888888888 b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
BOOST_CHECK(!success(text));
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE_END()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user