diff --git a/src/yuescript/yue_ast.h b/src/yuescript/yue_ast.h index 9d6d26e..3236b5a 100644 --- a/src/yuescript/yue_ast.h +++ b/src/yuescript/yue_ast.h @@ -729,13 +729,14 @@ AST_NODE(TableBlockIndent) ast_ptr sep; ast_sel_list values; + MetaVariablePair_t, MetaNormalPair_t, + YueComment_t, EmptyLine_t> values; AST_MEMBER(TableBlockIndent, &sep, &values) AST_END(TableBlockIndent) AST_NODE(TableBlock) ast_ptr sep; - ast_sel_list values; + ast_sel_list values; AST_MEMBER(TableBlock, &sep, &values) AST_END(TableBlock) diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index d85c92b..38e9fbb 100644 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp @@ -733,6 +733,9 @@ class YueCompilerImpl { auto pair = static_cast(item); return isLocal(variableToString(pair->name)); } + case id(): + case id(): + return true; case id(): { auto pair = static_cast(item); if (auto str = pair->key.as()) { @@ -7987,6 +7990,19 @@ class YueCompilerImpl { transformFor(forNode, temp); break; } + case id(): { + if (_config.reserveComment) { + auto comment = static_cast(item); + temp.push_back(indent() + comment->to_string(&_config) + nl(item)); + } + break; + } + case id(): { + if (_config.reserveComment) { + temp.push_back(nl(item)); + } + break; + } case id(): case id(): { if (auto pair = ast_cast(item)) { @@ -8204,6 +8220,8 @@ class YueCompilerImpl { auto metatable = x->new_ptr(); ast_sel metatableItem; ast_node* lastValueNode = values.back(); + int lastValueLine = x->m_begin.m_line; + bool prevWasEmptyLine = false; if (!_config.reserveComment) { for (auto it = values.rbegin(); it != values.rend(); ++it) { auto node = *it; @@ -8265,6 +8283,9 @@ class YueCompilerImpl { switch (item->get_id()) { case id(): transformExp(static_cast(item), temp, ExpUsage::Closure); break; case id(): { + if (_config.reserveComment && !prevWasEmptyLine && value->m_begin.m_line > lastValueLine + 1) { + temp.emplace_back(Empty); + } auto comment = static_cast(item); temp.emplace_back(comment->to_string(&_config)); skipComma = true; @@ -8337,6 +8358,8 @@ class YueCompilerImpl { temp.back() = indent() + (value == lastValueNode ? temp.back() : temp.back() + ',') + nl(value); } } + lastValueLine = value->m_end.m_line; + prevWasEmptyLine = ast_is(value); } if (metatable->pairs.empty() && !metatableItem) { out.push_back('{' + nl(x) + join(temp)); diff --git a/src/yuescript/yue_parser.cpp b/src/yuescript/yue_parser.cpp index e3dc598..ffe3ad2 100644 --- a/src/yuescript/yue_parser.cpp +++ b/src/yuescript/yue_parser.cpp @@ -909,11 +909,12 @@ YueParser::YueParser() { white >> '}' ); - table_block_inner = Seperator >> key_value_line >> *(+space_break >> key_value_line); - TableBlock = +space_break >> advance_match >> ensure(table_block_inner, pop_indent); + table_block_inner = Seperator >> key_value_line >> *(((plain_space >> line_break) >> key_value_line) | (+space_break >> not_(expr("--")) >> key_value_line)); + TableBlock = ((+(plain_space >> line_break)) | (+space_break >> not_(expr("--")))) >> advance_match >> ensure(table_block_inner, pop_indent); TableBlockIndent = ('*' | '-' >> space_one) >> Seperator >> disable_arg_table_block_rule( space >> key_value_list >> -(space >> ',') >> - -(+space_break >> advance_match >> space >> ensure(key_value_list >> -(space >> ',') >> *(+space_break >> key_value_line), pop_indent))); + -((plain_space >> line_break >> advance_match >> space >> ensure(key_value_list >> -(space >> ',') >> *(((plain_space >> line_break) >> key_value_line) | (+space_break >> not_(expr("--")) >> key_value_line)), pop_indent)) | + (+space_break >> advance_match >> space >> ensure(key_value_list >> -(space >> ',') >> *(+space_break >> key_value_line), pop_indent)))); ClassMemberList = Seperator >> key_value >> *(space >> ',' >> space >> key_value); class_line = check_indent_match >> space >> (ClassMemberList | Statement) >> -(space >> ','); @@ -1017,11 +1018,14 @@ YueParser::YueParser() { MetaVariablePair | MetaNormalPair; key_value_list = key_value >> *(space >> ',' >> space >> key_value); - key_value_line = check_indent_match >> space >> ( - key_value_list >> -(space >> ',') | - TableBlockIndent | - ('*' | '-' >> space_one) >> space >> (SpreadExp | Exp | TableBlock) - ); + key_value_line = + (EmptyLine >> YueComment) | + YueComment | + check_indent_match >> space >> ( + key_value_list >> -(space >> ',') | + TableBlockIndent | + ('*' | '-' >> space_one) >> space >> (SpreadExp | Exp | TableBlock) + ); fn_arg_def_list = FnArgDef >> *(space >> ',' >> space >> FnArgDef);