diff --git a/libsolidity/analysis/ViewPureChecker.cpp b/libsolidity/analysis/ViewPureChecker.cpp index 9a208a28e..a2d3607b5 100644 --- a/libsolidity/analysis/ViewPureChecker.cpp +++ b/libsolidity/analysis/ViewPureChecker.cpp @@ -116,6 +116,10 @@ public: boost::apply_visitor(*this, s); } + void operator()(yul::Comment const&) + { + } + private: void checkInstruction(SourceLocation _location, dev::eth::Instruction _instruction) { diff --git a/libyul/AsmAnalysis.h b/libyul/AsmAnalysis.h index 2834c3cb7..f74d2b81b 100644 --- a/libyul/AsmAnalysis.h +++ b/libyul/AsmAnalysis.h @@ -94,6 +94,7 @@ public: bool operator()(Break const&); bool operator()(Continue const&); bool operator()(Block const& _block); + bool operator()(Comment const& _comment) { return true; } private: /// Visits the statement and expects it to deposit one item onto the stack. diff --git a/libyul/AsmData.h b/libyul/AsmData.h index cedff1106..52c053a0e 100644 --- a/libyul/AsmData.h +++ b/libyul/AsmData.h @@ -82,6 +82,7 @@ struct ForLoop { langutil::SourceLocation location; Block pre; std::unique_ptr { diff --git a/libyul/AsmDataForward.h b/libyul/AsmDataForward.h index d01b1dffa..a040b95aa 100644 --- a/libyul/AsmDataForward.h +++ b/libyul/AsmDataForward.h @@ -45,10 +45,11 @@ struct Break; struct Continue; struct ExpressionStatement; struct Block; +struct Comment; struct TypedName; using Expression = boost::variant; -using Statement = boost::variant; +using Statement = boost::variant; } diff --git a/libyul/AsmParser.cpp b/libyul/AsmParser.cpp index ae3056f21..3e1bc42ed 100644 --- a/libyul/AsmParser.cpp +++ b/libyul/AsmParser.cpp @@ -84,8 +84,22 @@ Block Parser::parseBlock() RecursionGuard recursionGuard(*this); Block block = createWithLocation(); expectToken(Token::LBrace); + while (currentToken() != Token::RBrace) + { + if (!m_scanner->currentCommentLiteral().empty()) + block.statements.emplace_back( + Comment{m_scanner->currentCommentLocation(), m_scanner->currentCommentLiteral()} + ); + block.statements.emplace_back(parseStatement()); + } + + if (!m_scanner->currentCommentLiteral().empty()) + block.statements.emplace_back( + Comment{m_scanner->currentCommentLocation(), m_scanner->currentCommentLiteral()} + ); + block.location.end = endPosition(); advance(); return block; diff --git a/libyul/AsmPrinter.cpp b/libyul/AsmPrinter.cpp index 71151a0cf..1dc5ba449 100644 --- a/libyul/AsmPrinter.cpp +++ b/libyul/AsmPrinter.cpp @@ -258,6 +258,12 @@ string AsmPrinter::operator()(Block const& _block) const } } +std::string AsmPrinter::operator()(Comment const& _comment) const +{ + // Leading newline for better readability of comments. + return "\n// " + _comment.text; +} + string AsmPrinter::formatTypedName(TypedName _variable) const { solAssert(!_variable.name.empty(), "Invalid variable name."); diff --git a/libyul/AsmPrinter.h b/libyul/AsmPrinter.h index 82fed24f2..93ac285ac 100644 --- a/libyul/AsmPrinter.h +++ b/libyul/AsmPrinter.h @@ -53,6 +53,7 @@ public: std::string operator()(Break const& _break) const; std::string operator()(Continue const& _continue) const; std::string operator()(Block const& _block) const; + std::string operator()(Comment const& _comment) const; private: std::string formatTypedName(TypedName _variable) const; diff --git a/libyul/AsmScopeFiller.h b/libyul/AsmScopeFiller.h index 220538bb2..f4c75ae51 100644 --- a/libyul/AsmScopeFiller.h +++ b/libyul/AsmScopeFiller.h @@ -66,6 +66,7 @@ public: bool operator()(Break const&) { return true; } bool operator()(Continue const&) { return true; } bool operator()(Block const& _block); + bool operator()(Comment const&) { return true; } private: bool registerVariable( diff --git a/libyul/backends/evm/EVMCodeTransform.h b/libyul/backends/evm/EVMCodeTransform.h index 866322d2d..23b66e578 100644 --- a/libyul/backends/evm/EVMCodeTransform.h +++ b/libyul/backends/evm/EVMCodeTransform.h @@ -188,6 +188,7 @@ public: void operator()(Break const&); void operator()(Continue const&); void operator()(Block const& _block); + void operator()(Comment const&) {} private: AbstractAssembly::LabelID labelFromIdentifier(Identifier const& _identifier); diff --git a/libyul/backends/wasm/EWasmCodeTransform.cpp b/libyul/backends/wasm/EWasmCodeTransform.cpp index 90ca28d1c..bba413d59 100644 --- a/libyul/backends/wasm/EWasmCodeTransform.cpp +++ b/libyul/backends/wasm/EWasmCodeTransform.cpp @@ -264,7 +264,9 @@ vector EWasmCodeTransform::visit(vector const& { vector ret; for (auto const& s: _statements) - ret.emplace_back(visit(s)); + if (s.type() != typeid(yul::Comment)) + ret.emplace_back(visit(s)); + return ret; } diff --git a/libyul/backends/wasm/EWasmCodeTransform.h b/libyul/backends/wasm/EWasmCodeTransform.h index 399428a31..e1f02fd8c 100644 --- a/libyul/backends/wasm/EWasmCodeTransform.h +++ b/libyul/backends/wasm/EWasmCodeTransform.h @@ -54,6 +54,7 @@ public: wasm::Expression operator()(yul::Break const&); wasm::Expression operator()(yul::Continue const&); wasm::Expression operator()(yul::Block const& _block); + wasm::Expression operator()(yul::Comment const&) { return {}; } private: EWasmCodeTransform( diff --git a/libyul/optimiser/ASTCopier.cpp b/libyul/optimiser/ASTCopier.cpp index efe3ff854..f7ef8464e 100644 --- a/libyul/optimiser/ASTCopier.cpp +++ b/libyul/optimiser/ASTCopier.cpp @@ -153,6 +153,11 @@ Statement ASTCopier::operator ()(Block const& _block) return translate(_block); } +Statement ASTCopier::operator()(Comment const& _comment) +{ + return Comment{_comment.location, _comment.text}; +} + Expression ASTCopier::translate(Expression const& _expression) { return _expression.apply_visitor(static_cast(*this)); diff --git a/libyul/optimiser/ASTCopier.h b/libyul/optimiser/ASTCopier.h index b2e0a383a..4291a17a0 100644 --- a/libyul/optimiser/ASTCopier.h +++ b/libyul/optimiser/ASTCopier.h @@ -61,6 +61,7 @@ public: virtual Statement operator()(Break const&) = 0; virtual Statement operator()(Continue const&) = 0; virtual Statement operator()(Block const& _block) = 0; + virtual Statement operator()(Comment const& _comment) = 0; }; /** @@ -88,6 +89,7 @@ public: Statement operator()(Break const&) override; Statement operator()(Continue const&) override; Statement operator()(Block const& _block) override; + Statement operator()(Comment const& _comment) override; virtual Expression translate(Expression const& _expression); virtual Statement translate(Statement const& _statement); diff --git a/libyul/optimiser/ASTWalker.h b/libyul/optimiser/ASTWalker.h index a1f244795..7712bb25c 100644 --- a/libyul/optimiser/ASTWalker.h +++ b/libyul/optimiser/ASTWalker.h @@ -59,6 +59,7 @@ public: virtual void operator()(Break const&) {} virtual void operator()(Continue const&) {} virtual void operator()(Block const& _block); + virtual void operator()(Comment const&) {} virtual void visit(Statement const& _st); virtual void visit(Expression const& _e); @@ -96,6 +97,7 @@ public: virtual void operator()(Break&); virtual void operator()(Continue&); virtual void operator()(Block& _block); + virtual void operator()(Comment&) {} virtual void visit(Statement& _st); virtual void visit(Expression& _e); diff --git a/libyul/optimiser/SyntacticalEquality.cpp b/libyul/optimiser/SyntacticalEquality.cpp index 9e425b17e..3673328bb 100644 --- a/libyul/optimiser/SyntacticalEquality.cpp +++ b/libyul/optimiser/SyntacticalEquality.cpp @@ -181,6 +181,11 @@ bool SyntacticallyEqual::statementEqual(Block const& _lhs, Block const& _rhs) }); } +bool SyntacticallyEqual::statementEqual(Comment const& _lhs, Comment const& _rhs) +{ + return _lhs.text == _rhs.text; +} + bool SyntacticallyEqual::visitDeclaration(TypedName const& _lhs, TypedName const& _rhs) { if (_lhs.type != _rhs.type) diff --git a/libyul/optimiser/SyntacticalEquality.h b/libyul/optimiser/SyntacticalEquality.h index c5e722c74..3a4391ef8 100644 --- a/libyul/optimiser/SyntacticalEquality.h +++ b/libyul/optimiser/SyntacticalEquality.h @@ -58,6 +58,7 @@ public: bool statementEqual(Break const&, Break const&) { return true; } bool statementEqual(Continue const&, Continue const&) { return true; } bool statementEqual(Block const& _lhs, Block const& _rhs); + bool statementEqual(Comment const& _lhs, Comment const& _rhs); private: bool statementEqual(Instruction const& _lhs, Instruction const& _rhs); bool statementEqual(Label const& _lhs, Label const& _rhs);