From 00509830d5d93e117a75a7b34ab947dc210b0870 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Thu, 6 Apr 2023 22:58:40 +0200 Subject: [PATCH] User-defined literal suffixes: Parsing --- libsolidity/parsing/Parser.cpp | 39 ++++++++++++++++++- libsolidity/parsing/Parser.h | 1 + .../denominations/finney_invalid.sol | 2 +- .../denominations/szabo_invalid.sol | 2 +- 4 files changed, 41 insertions(+), 3 deletions(-) diff --git a/libsolidity/parsing/Parser.cpp b/libsolidity/parsing/Parser.cpp index 84ecec329..4486a01ba 100644 --- a/libsolidity/parsing/Parser.cpp +++ b/libsolidity/parsing/Parser.cpp @@ -2050,7 +2050,44 @@ ASTPointer Parser::parseLiteral() return nodeFactory.createNode(initialToken, std::move(value), subDenomination); } - return nodeFactory.createNode(initialToken, std::move(value), Literal::SubDenomination::None); + ASTPointer literal = nodeFactory.createNode(initialToken, std::move(value), Literal::SubDenomination::None); + + if (m_scanner->currentToken() != Token::Identifier) + return literal; + + ASTPointer suffix = parseLiteralSuffix(); + nodeFactory.setEndPositionFromNode(suffix); + + return nodeFactory.createNode( + std::move(suffix), + std::vector>{std::move(literal)}, + vector>{}, + vector{}, + true /* _isSuffixCall */ + ); +} + +ASTPointer Parser::parseLiteralSuffix() +{ + RecursionGuard recursionGuard(*this); + ASTNodeFactory nodeFactory(*this); + + nodeFactory.markEndPosition(); + ASTPointer suffix = nodeFactory.createNode(expectIdentifierToken()); + + while (m_scanner->currentToken() == Token::Period) + { + advance(); + SourceLocation memberLocation = currentLocation(); + nodeFactory.markEndPosition(); + suffix = nodeFactory.createNode( + std::move(suffix), + expectIdentifierToken(), + std::move(memberLocation) + ); + } + + return suffix; } ASTPointer Parser::parsePrimaryExpression() diff --git a/libsolidity/parsing/Parser.h b/libsolidity/parsing/Parser.h index f967ea38a..b6702977e 100644 --- a/libsolidity/parsing/Parser.h +++ b/libsolidity/parsing/Parser.h @@ -161,6 +161,7 @@ private: ASTPointer const& _partiallyParsedExpression = ASTPointer() ); ASTPointer parseLiteral(); + ASTPointer parseLiteralSuffix(); ASTPointer parsePrimaryExpression(); std::vector> parseFunctionCallListArguments(); diff --git a/test/libsolidity/syntaxTests/denominations/finney_invalid.sol b/test/libsolidity/syntaxTests/denominations/finney_invalid.sol index 0974cde13..9ecbb3e66 100644 --- a/test/libsolidity/syntaxTests/denominations/finney_invalid.sol +++ b/test/libsolidity/syntaxTests/denominations/finney_invalid.sol @@ -4,4 +4,4 @@ contract C { } } // ---- -// ParserError 2314: (58-64): Expected ';' but got identifier +// DeclarationError 7576: (58-64): Undeclared identifier. diff --git a/test/libsolidity/syntaxTests/denominations/szabo_invalid.sol b/test/libsolidity/syntaxTests/denominations/szabo_invalid.sol index d0e3eb3ff..e5fba8364 100644 --- a/test/libsolidity/syntaxTests/denominations/szabo_invalid.sol +++ b/test/libsolidity/syntaxTests/denominations/szabo_invalid.sol @@ -4,4 +4,4 @@ contract C { } } // ---- -// ParserError 2314: (58-63): Expected ';' but got identifier +// DeclarationError 7576: (58-63): Undeclared identifier.