Skip to content

Commit

Permalink
option space_after_comment_dash
Browse files Browse the repository at this point in the history
  • Loading branch information
CppCXY committed Apr 8, 2024
1 parent dc2a0dd commit 533e2cd
Show file tree
Hide file tree
Showing 8 changed files with 86 additions and 28 deletions.
2 changes: 2 additions & 0 deletions CodeFormatCore/include/CodeFormatCore/Config/LuaStyle.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,8 @@ class LuaStyle {

SpaceBeforeInlineComment space_before_inline_comment;

bool space_after_comment_dash = false;

// [operator space]
SpaceAroundMath space_around_math_operator;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ enum class TokenStrategy {
TableSepComma,
OriginRange,
StmtEndSemicolon,
NewLineBeforeToken
NewLineBeforeToken,
SpaceAfterCommentDash
};

enum class TokenAddStrategy {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,11 @@ class TokenAnalyzer : public FormatAnalyzer {
private:
void TableFieldAddSep(FormatState &f, LuaSyntaxNode n, const LuaSyntaxTree &t);

void AnalyzeTableField(FormatState &f, LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t);
void AnalyzeTableField(FormatState &f, LuaSyntaxNode n, const LuaSyntaxTree &t);

void AnalyzeCallExpression(FormatState &f, LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t);
void AnalyzeCallExpression(FormatState &f, LuaSyntaxNode n, const LuaSyntaxTree &t);

void AnalyzeComment(FormatState &f, LuaSyntaxNode n, const LuaSyntaxTree &t);

std::unordered_map<std::size_t, TokenStrategy> _tokenStrategies;
std::unordered_map<std::size_t, TokenAddStrategy> _tokenAddStrategies;
Expand Down
2 changes: 2 additions & 0 deletions CodeFormatCore/src/Config/LuaStyle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,8 @@ void LuaStyle::Parse(std::map<std::string, std::string, std::less<>> &configMap)
}
}

BOOL_OPTION(space_after_comment_dash)

IF_EXIST(space_around_math_operator) {
if (value == "true" || value == "always") {
space_around_math_operator.SetAll(true);
Expand Down
68 changes: 43 additions & 25 deletions CodeFormatCore/src/Format/Analyzer/TokenAnalyzer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@ void TokenAnalyzer::Analyze(FormatState &f, const LuaSyntaxTree &t) {

break;
}
case TK_SHORT_COMMENT: {
if (f.GetStyle().space_after_comment_dash) {
AnalyzeComment(f, syntaxNode, t);
}
}
default: {
break;
}
Expand Down Expand Up @@ -111,28 +116,28 @@ void TokenAnalyzer::TableFieldAddSep(FormatState &f, LuaSyntaxNode n, const LuaS
}
}

void TokenAnalyzer::AnalyzeTableField(FormatState &f, LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t) {
void TokenAnalyzer::AnalyzeTableField(FormatState &f, LuaSyntaxNode n, const LuaSyntaxTree &t) {
if (f.GetStyle().table_separator_style == TableSeparatorStyle::Semicolon) {
auto sep = syntaxNode.GetChildSyntaxNode(LuaSyntaxNodeKind::TableFieldSep, t);
auto sep = n.GetChildSyntaxNode(LuaSyntaxNodeKind::TableFieldSep, t);
auto comma = sep.GetChildToken(',', t);
if (comma.IsToken(t)) {
Mark(comma, t, TokenStrategy::TableSepSemicolon);
}
} else if (f.GetStyle().table_separator_style == TableSeparatorStyle::Comma) {
auto sep = syntaxNode.GetChildSyntaxNode(LuaSyntaxNodeKind::TableFieldSep, t);
auto sep = n.GetChildSyntaxNode(LuaSyntaxNodeKind::TableFieldSep, t);
auto semicolon = sep.GetChildToken(';', t);
if (semicolon.IsToken(t)) {
Mark(semicolon, t, TokenStrategy::TableSepComma);
}
} else if (f.GetStyle().table_separator_style == TableSeparatorStyle::OnlyKVColon) {
if (syntaxNode.GetChildToken('=', t).IsToken(t)) {
auto sep = syntaxNode.GetChildSyntaxNode(LuaSyntaxNodeKind::TableFieldSep, t);
if (n.GetChildToken('=', t).IsToken(t)) {
auto sep = n.GetChildSyntaxNode(LuaSyntaxNodeKind::TableFieldSep, t);
auto semicolon = sep.GetChildToken(',', t);
if (semicolon.IsToken(t)) {
Mark(semicolon, t, TokenStrategy::TableSepSemicolon);
}
} else {
auto sep = syntaxNode.GetChildSyntaxNode(LuaSyntaxNodeKind::TableFieldSep, t);
auto sep = n.GetChildSyntaxNode(LuaSyntaxNodeKind::TableFieldSep, t);
auto semicolon = sep.GetChildToken(';', t);
if (semicolon.IsToken(t)) {
Mark(semicolon, t, TokenStrategy::TableSepComma);
Expand All @@ -141,28 +146,28 @@ void TokenAnalyzer::AnalyzeTableField(FormatState &f, LuaSyntaxNode &syntaxNode,
}

if (f.GetStyle().trailing_table_separator != TrailingTableSeparator::Keep) {
auto nextToken = syntaxNode.GetNextTokenSkipComment(t);
auto nextToken = n.GetNextTokenSkipComment(t);
// the last table field
if (nextToken.GetTokenKind(t) == '}') {
switch (f.GetStyle().trailing_table_separator) {
case TrailingTableSeparator::Never: {
auto sep = syntaxNode.GetChildSyntaxNode(LuaSyntaxNodeKind::TableFieldSep, t);
auto sep = n.GetChildSyntaxNode(LuaSyntaxNodeKind::TableFieldSep, t);
auto sepToken = sep.GetFirstToken(t);
Mark(sepToken, t, TokenStrategy::Remove);
break;
}
case TrailingTableSeparator::Always: {
TableFieldAddSep(f, syntaxNode, t);
TableFieldAddSep(f, n, t);
break;
}
case TrailingTableSeparator::Smart: {
auto tableFieldList = syntaxNode.GetParent(t);
auto tableFieldList = n.GetParent(t);
if (tableFieldList.GetEndLine(t) == nextToken.GetStartLine(t)) {
auto sep = syntaxNode.GetChildSyntaxNode(LuaSyntaxNodeKind::TableFieldSep, t);
auto sep = n.GetChildSyntaxNode(LuaSyntaxNodeKind::TableFieldSep, t);
auto sepToken = sep.GetFirstToken(t);
Mark(sepToken, t, TokenStrategy::Remove);
} else {
TableFieldAddSep(f, syntaxNode, t);
TableFieldAddSep(f, n, t);
}
break;
}
Expand All @@ -174,8 +179,8 @@ void TokenAnalyzer::AnalyzeTableField(FormatState &f, LuaSyntaxNode &syntaxNode,
}
}

bool IsSingleTableOrStringArg(LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t) {
auto children = syntaxNode.GetChildren(t);
bool IsSingleTableOrStringArg(LuaSyntaxNode n, const LuaSyntaxTree &t) {
auto children = n.GetChildren(t);
for (auto child: children) {
if (child.GetTokenKind(t) == TK_STRING || child.GetTokenKind(t) == TK_LONG_STRING || child.GetSyntaxKind(t) == LuaSyntaxNodeKind::TableExpression) {
return true;
Expand Down Expand Up @@ -218,39 +223,39 @@ LuaSyntaxNode GetSingleArgStringOrTable(LuaSyntaxNode &syntaxNode, const LuaSynt
return LuaSyntaxNode(0);
}

void TokenAnalyzer::AnalyzeCallExpression(FormatState &f, LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t) {
if (IsSingleTableOrStringArg(syntaxNode, t)) {
void TokenAnalyzer::AnalyzeCallExpression(FormatState &f, LuaSyntaxNode n, const LuaSyntaxTree &t) {
if (IsSingleTableOrStringArg(n, t)) {
switch (f.GetStyle().call_arg_parentheses) {
case CallArgParentheses::Remove: {
auto lbrace = syntaxNode.GetChildToken('(', t);
auto lbrace = n.GetChildToken('(', t);
if (lbrace.IsToken(t)) {
Mark(lbrace, t, TokenStrategy::Remove);
auto rbrace = syntaxNode.GetChildToken(')', t);
auto rbrace = n.GetChildToken(')', t);
Mark(rbrace, t, TokenStrategy::Remove);
}

break;
}
case CallArgParentheses::RemoveStringOnly: {
auto node = GetSingleArgStringOrTable(syntaxNode, t);
auto node = GetSingleArgStringOrTable(n, t);
if (node.GetTokenKind(t) == TK_STRING || node.GetTokenKind(t) == TK_LONG_STRING) {
auto lbrace = syntaxNode.GetChildToken('(', t);
auto lbrace = n.GetChildToken('(', t);
if (lbrace.IsToken(t)) {
Mark(lbrace, t, TokenStrategy::Remove);
auto rbrace = syntaxNode.GetChildToken(')', t);
auto rbrace = n.GetChildToken(')', t);
Mark(rbrace, t, TokenStrategy::Remove);
}
}

break;
}
case CallArgParentheses::RemoveTableOnly: {
auto node = GetSingleArgStringOrTable(syntaxNode, t);
auto node = GetSingleArgStringOrTable(n, t);
if (node.GetSyntaxKind(t) == LuaSyntaxNodeKind::TableExpression) {
auto lbrace = syntaxNode.GetChildToken('(', t);
auto lbrace = n.GetChildToken('(', t);
if (lbrace.IsToken(t)) {
Mark(lbrace, t, TokenStrategy::Remove);
auto rbrace = syntaxNode.GetChildToken(')', t);
auto rbrace = n.GetChildToken(')', t);
Mark(rbrace, t, TokenStrategy::Remove);
}
}
Expand All @@ -264,7 +269,20 @@ void TokenAnalyzer::AnalyzeCallExpression(FormatState &f, LuaSyntaxNode &syntaxN

auto spaceAnalyzer = f.GetAnalyzer<SpaceAnalyzer>();
if (spaceAnalyzer) {
spaceAnalyzer->FunctionCallSingleArgSpace(f, syntaxNode, t);
spaceAnalyzer->FunctionCallSingleArgSpace(f, n, t);
}
}
}

void TokenAnalyzer::AnalyzeComment(FormatState &f, LuaSyntaxNode n, const LuaSyntaxTree &t) {
auto text = n.GetText(t);
auto pos = 0;
while (pos < text.size() && text[pos] == '-') {
pos++;
}
if (pos == 2 || pos == 3) {
if (pos < text.size() && text[pos] != ' ') {
Mark(n, t, TokenStrategy::SpaceAfterCommentDash);
}
}
}
11 changes: 11 additions & 0 deletions CodeFormatCore/src/Format/FormatBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,17 @@ void FormatBuilder::DoResolve(LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t,
WriteSyntaxNode(syntaxNode, t);
break;
}
case TokenStrategy::SpaceAfterCommentDash: {
auto text = syntaxNode.GetText(t);
auto pos = 0;
while (pos < text.size() && text[pos] == '-') {
WriteChar('-');
pos++;
}
WriteChar(' ');
WriteText(text.substr(pos));
break;
}
default: {
break;
}
Expand Down
20 changes: 20 additions & 0 deletions Test/src/FormatStyle_unitest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2025,4 +2025,24 @@ end
)",
style));

}

TEST(FormatByStyleOption, space_after_comment_dash) {
LuaStyle style;

style.space_after_comment_dash = true;
EXPECT_TRUE(TestHelper::TestFormatted(
R"(
--aa
---aaa
---@param
-------
)",
R"(
-- aa
--- aaa
--- @param
-------
)",
style));
}
3 changes: 3 additions & 0 deletions lua.template.editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,9 @@ ignore_spaces_inside_function_call = false
# detail number or 'keep'
space_before_inline_comment = 1

# convert '---' to '--- ' or '--' to '-- '
space_after_comment_dash = false

# [operator space]
space_around_math_operator = true
# space_around_math_operator.exponent = false
Expand Down

0 comments on commit 533e2cd

Please sign in to comment.