From 874b2c5cfc01292b8cf520d69fe7744cfe552904 Mon Sep 17 00:00:00 2001 From: Filip Sajdak Date: Tue, 11 Oct 2022 01:59:04 +0200 Subject: [PATCH 1/2] fix preserve parens around expressions --- source/cppfront.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/cppfront.cpp b/source/cppfront.cpp index 4a39f2374..3323c4cb7 100644 --- a/source/cppfront.cpp +++ b/source/cppfront.cpp @@ -1980,7 +1980,9 @@ class cppfront auto emit(expression_node const& n) -> void { assert(n.expr); + push_need_expression_list_parens(true); emit(*n.expr); + pop_need_expression_list_parens(); } From 935758f3c66f9df12d0f35327dcf4d2c61917a05 Mon Sep 17 00:00:00 2001 From: Filip Sajdak Date: Tue, 11 Oct 2022 03:17:41 +0200 Subject: [PATCH 2/2] Remove parens inside initializer expression list Current solution compiles `v : std::vector = ( 1, 2, 3 );` into `std::vector v { (1, 2, 3) };` This commit change that behaviour and removes extra parens from generated code. --- source/cppfront.cpp | 4 ++-- source/parse.h | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/source/cppfront.cpp b/source/cppfront.cpp index 3323c4cb7..daeec0344 100644 --- a/source/cppfront.cpp +++ b/source/cppfront.cpp @@ -1990,7 +1990,7 @@ class cppfront // auto emit(expression_list_node const& n) -> void { - if (should_add_expression_list_parens() && !n.expressions.empty()) { + if (should_add_expression_list_parens() && !n.expressions.empty() && !n.inside_initializer) { printer.print_cpp2("(", n.position()); } @@ -2024,7 +2024,7 @@ class cppfront } } - if (should_add_expression_list_parens() && !n.expressions.empty()) { + if (should_add_expression_list_parens() && !n.expressions.empty() && !n.inside_initializer) { printer.print_cpp2(")", n.position()); } // We want to consume only one of these diff --git a/source/parse.h b/source/parse.h index 2064aed64..52f4cdbe5 100644 --- a/source/parse.h +++ b/source/parse.h @@ -257,6 +257,7 @@ struct expression_list_node { source_position open_paren = {}; source_position close_paren = {}; + bool inside_initializer = false; struct term { passing_style pass = {}; @@ -1317,9 +1318,10 @@ class parser if (curr().type() == lexeme::LeftParen) { + bool inside_initializer = (peek(-1)->type() == lexeme::Assignment); auto open_paren = curr().position(); next(); - auto expr_list = expression_list(open_paren); + auto expr_list = expression_list(open_paren, inside_initializer); if (!expr_list) { error("unexpected text - ( is not followed by an expression-list"); next(); @@ -1704,10 +1706,11 @@ class parser //G expression //G expression-list , expression //G - auto expression_list(source_position open_paren) -> std::unique_ptr { + auto expression_list(source_position open_paren, bool inside_initializer = false) -> std::unique_ptr { auto pass = passing_style::in; auto n = std::make_unique(); n->open_paren = open_paren; + n->inside_initializer = inside_initializer; if (curr().type() == lexeme::Identifier && curr() == "out") { pass = passing_style::out;