Skip to content

Commit

Permalink
修复许多BUG,实现特性 #74
Browse files Browse the repository at this point in the history
  • Loading branch information
CppCXY committed Dec 15, 2022
1 parent 2e21191 commit 4491ad4
Show file tree
Hide file tree
Showing 22 changed files with 352 additions and 138 deletions.
3 changes: 1 addition & 2 deletions CodeFormatServer/src/LSP/LSP.cpp
@@ -1,11 +1,10 @@
#include "LSP.h"


lsp::Serializable::~Serializable()
{
}

lsp::Position::Position(uint64_t _line, uint64_t _character)
lsp::Position::Position(std::size_t _line, std::size_t _character)
: line(_line),
character(_character)
{
Expand Down
6 changes: 3 additions & 3 deletions CodeFormatServer/src/LSP/LSP.h
Expand Up @@ -47,10 +47,10 @@ class Serializable
class Position : public Serializable
{
public:
Position(uint64_t _line = 0, uint64_t _character = 0);
Position(std::size_t _line = 0, std::size_t _character = 0);

uint64_t line;
uint64_t character;
std::size_t line;
std::size_t character;

nlohmann::json Serialize() override;
void Deserialize(nlohmann::json json) override;
Expand Down
2 changes: 0 additions & 2 deletions CodeFormatServer/src/VFS/VirtualFileSystem.cpp
Expand Up @@ -202,5 +202,3 @@ FileDB &VirtualFileSystem::GetFileDB() {
LineIndexDB &VirtualFileSystem::GetLineIndexDB() {
return _lineIndexDB;
}


22 changes: 13 additions & 9 deletions CodeService/src/Format/Analyzer/AlignAnalyzer.cpp
Expand Up @@ -222,23 +222,27 @@ AlignAnalyzer::ResolveAlignGroup(FormatBuilder &f, std::size_t groupIndex, Align
for (auto i: group.SyntaxGroup) {
auto node = LuaSyntaxNode(i);
auto eq = node.GetChildToken('=', t);
auto diff = eq.GetTextRange(t).StartOffset - eq.GetPrevToken(t).GetTextRange(t).EndOffset;
if (diff > 2) {
allowAlign = true;
break;
if (eq.IsToken(t)) {
auto diff = eq.GetTextRange(t).StartOffset - eq.GetPrevToken(t).GetTextRange(t).EndOffset;
if (diff > 2) {
allowAlign = true;
break;
}
}
}
if (allowAlign) {
std::size_t maxDis = 0;
for (auto i: group.SyntaxGroup) {
auto node = LuaSyntaxNode(i);
auto eq = node.GetChildToken('=', t);
auto prev = eq.GetPrevToken(t);
auto newPos = prev.GetTextRange(t).EndOffset + 2 - node.GetTextRange(t).StartOffset;
if (newPos > maxDis) {
maxDis = newPos;
if (eq.IsToken(t)) {
auto prev = eq.GetPrevToken(t);
auto newPos = prev.GetTextRange(t).EndOffset + 2 - node.GetTextRange(t).StartOffset;
if (newPos > maxDis) {
maxDis = newPos;
}
_resolveGroupIndex[eq.GetIndex()] = groupIndex;
}
_resolveGroupIndex[eq.GetIndex()] = groupIndex;
}
group.AlignPos = maxDis;
}
Expand Down
8 changes: 4 additions & 4 deletions CodeService/src/Format/Analyzer/FormatResolve.cpp
Expand Up @@ -34,8 +34,8 @@ void FormatResolve::Reset() {
_nextSpaceStrategy = NextSpaceStrategy::None;
_prevSpaceStrategy = PrevSpaceStrategy::None;
_indentStrategy = IndentStrategy::None;
_nextSpaceData.Space = 0;
_prevSpaceData.Align = 0;
_nextSpaceData = NextData();
_prevSpaceData = PrevData();
_indent = 0;
}

Expand All @@ -48,11 +48,11 @@ std::size_t FormatResolve::GetNextSpace() {
return _nextSpaceData.Space;
}

std::size_t FormatResolve::GetNextLine() {
LineSpace FormatResolve::GetNextLine() {
return _nextSpaceData.Line;
}

void FormatResolve::SetNextLineBreak(std::size_t line) {
void FormatResolve::SetNextLineBreak(LineSpace line) {
_nextSpaceStrategy = NextSpaceStrategy::LineBreak;
_nextSpaceData.Line = line;
}
Expand Down
12 changes: 8 additions & 4 deletions CodeService/src/Format/Analyzer/IndentationAnalyzer.cpp
Expand Up @@ -99,17 +99,21 @@ void IndentationAnalyzer::Analyze(FormatBuilder &f, const LuaSyntaxTree &t) {
}
case LuaSyntaxNodeKind::ExpressionStatement: {
auto suffixedExpression = syntaxNode.GetChildSyntaxNode(NodeKind::SuffixedExpression, t);

for (auto expr: suffixedExpression.GetChildren(t)) {
if (expr.GetSyntaxKind(t) == LuaSyntaxNodeKind::IndexExpression) {
Indenter(expr, t, IndentData(
IndentType::Standard,
f.GetStyle().continuation_indent
));
} else if (expr.GetSyntaxKind(t) == LuaSyntaxNodeKind::CallExpression) {
Indenter(expr, t, IndentData(
IndentType::WhenPrevIndent,
f.GetStyle().continuation_indent
));
auto prevSibling = expr.GetPrevSibling(t);
if(prevSibling.GetSyntaxKind(t) != LuaSyntaxNodeKind::NameExpression) {
Indenter(expr, t, IndentData(
IndentType::WhenPrevIndent,
f.GetStyle().continuation_indent
));
}
}
}
break;
Expand Down
76 changes: 65 additions & 11 deletions CodeService/src/Format/Analyzer/LineBreakAnalyzer.cpp
Expand Up @@ -15,30 +15,77 @@ void LineBreakAnalyzer::Analyze(FormatBuilder &f, const LuaSyntaxTree &t) {
if (syntaxNode.IsNode(t)) {
switch (syntaxNode.GetSyntaxKind(t)) {
case LuaSyntaxNodeKind::Block: {
auto children = syntaxNode.GetChildren(t);
if (syntaxNode.GetParent(t).IsSingleLineNode(t)) {
if (syntaxNode.GetChildren(t).size() == 1) {
if (children.size() == 1) {
auto spaceAnalyzer = f.GetAnalyzer<SpaceAnalyzer>();
spaceAnalyzer->SpaceAround(syntaxNode, t);
continue;
}
} else if (children.empty()) {
auto end = syntaxNode.GetParent(t).GetChildToken(TK_END, t);
auto prev = end.GetPrevToken(t);
BreakAfter(prev, t, LineSpace(LineSpaceType::Max, 2));
continue;
}
BreakBefore(syntaxNode, t);
BreakAfter(syntaxNode, t);

for (auto stmt: syntaxNode.GetChildren(t)) {
auto &style = f.GetStyle();
for (auto stmt: children) {
if (stmt.IsNode(t)) {
switch (stmt.GetSyntaxKind(t)) {
case LuaSyntaxNodeKind::LocalStatement:
case LuaSyntaxNodeKind::AssignStatement: {
BreakAfter(stmt, t);
BreakAfter(stmt, t, style.line_space_after_local_or_assign_statement);
break;
}
case LuaSyntaxNodeKind::IfStatement: {
BreakAfter(stmt, t, style.line_space_after_if_statement);
break;
}
case LuaSyntaxNodeKind::DoStatement: {
BreakAfter(stmt, t, style.line_space_after_do_statement);
break;
}
case LuaSyntaxNodeKind::WhileStatement: {
BreakAfter(stmt, t, style.line_space_after_while_statement);
break;
}
case LuaSyntaxNodeKind::RepeatStatement: {
BreakAfter(stmt, t, style.line_space_after_repeat_statement);
break;
}
case LuaSyntaxNodeKind::ForStatement: {
BreakAfter(stmt, t, style.line_space_after_for_statement);
break;
}
case LuaSyntaxNodeKind::FunctionStatement: {
BreakAfter(stmt, t, style.line_space_after_function_statement);
break;
}
case LuaSyntaxNodeKind::ExpressionStatement: {
BreakAfter(stmt, t, style.line_space_after_expression_statement);
break;
}
default: {
BreakAfter(stmt, t, LineSpace(LineSpaceType::Keep));
break;
}


}
} else {

switch (stmt.GetTokenKind(t)) {
case TK_SHORT_COMMENT:
case TK_LONG_STRING:
case TK_SHEBANG: {
BreakAfter(stmt, t, style.line_space_after_comment);
break;
}
default: {
BreakAfter(stmt, t);
}
}
}
BreakAfter(stmt, t);
}
break;
}
Expand Down Expand Up @@ -113,8 +160,7 @@ LineBreakAnalyzer::Query(FormatBuilder &f, LuaSyntaxNode &syntaxNode, const LuaS
auto nextLine = nextToken.GetStartLine(t);
// 既然已经打断那就算了
if (nextLine > currentLine) {
resolve.SetNextLineBreak(nextLine - currentLine);
return;
resolve.SetNextLineBreak(LineSpace(nextLine - currentLine));
}
}
}
Expand All @@ -135,7 +181,7 @@ LineBreakAnalyzer::Query(FormatBuilder &f, LuaSyntaxNode &syntaxNode, const LuaS
auto relationNode = LuaSyntaxNode(lineBreakData.Data.Index);
auto guessLineWidth = lineWidth + syntaxNode.GetFirstLineWidth(t) + relationNode.GetFirstLineWidth(t);
if (guessLineWidth > style.max_line_length) {
resolve.SetNextLineBreak(1);
resolve.SetNextLineBreak(LineSpace(1));
return;
}
break;
Expand All @@ -151,6 +197,13 @@ void LineBreakAnalyzer::BreakAfter(LuaSyntaxNode n, const LuaSyntaxTree &t, std:
}
}

void LineBreakAnalyzer::BreakAfter(LuaSyntaxNode n, const LuaSyntaxTree &t, LineSpace lineSpace) {
auto token = n.GetLastToken(t);
if (token.IsToken(t)) {
_lineBreaks[token.GetIndex()] = LineBreakData(lineSpace);
}
}

void LineBreakAnalyzer::BreakBefore(LuaSyntaxNode n, const LuaSyntaxTree &t, std::size_t line) {
auto prev = n.GetPrevSibling(t);
if (!prev.IsNull(t)) {
Expand Down Expand Up @@ -201,7 +254,7 @@ void LineBreakAnalyzer::AnalyzeSuffixedExpr(FormatBuilder &f, LuaSyntaxNode &exp

void LineBreakAnalyzer::MarkLazyBreak(LuaSyntaxNode n, const LuaSyntaxTree &t, LineBreakStrategy strategy) {
auto prevToken = n.GetPrevToken(t);
if (prevToken.IsToken(t) && !_lineBreaks.contains(prevToken.GetIndex())) {
if (prevToken.IsToken(t) && !_lineBreaks.count(prevToken.GetIndex())) {
_lineBreaks[prevToken.GetIndex()] = LineBreakData(strategy, n.GetIndex());
}
}
Expand Down Expand Up @@ -269,3 +322,4 @@ void LineBreakAnalyzer::AnalyzeExpr(FormatBuilder &f, LuaSyntaxNode &expr, const
}
}
}

62 changes: 54 additions & 8 deletions CodeService/src/Format/Analyzer/SpaceAnalyzer.cpp
Expand Up @@ -11,23 +11,30 @@ void SpaceAnalyzer::Analyze(FormatBuilder &f, const LuaSyntaxTree &t) {
for (auto syntaxNode: t.GetSyntaxNodes()) {
if (syntaxNode.IsToken(t)) {
switch (syntaxNode.GetTokenKind(t)) {
// math operator
case '+':
case '*':
case '/':
case '%':
case '=':
case '&':
case '^':
case TK_AND:
case TK_OR:
case TK_SHL:
case TK_SHR:
case TK_IDIV: {
SpaceAround(syntaxNode, t, f.GetStyle().space_around_math_operator ? 1 : 0, false);
break;
}
case TK_CONCAT: {
SpaceAround(syntaxNode, t, f.GetStyle().space_around_concat_operator ? 1 : 0, false);
break;
}
case '=':
case TK_AND:
case TK_OR:
case TK_GE:
case TK_LE:
case TK_NE:
case TK_EQ:
case TK_IDIV:
case TK_CONCAT:
case TK_IN: {
SpaceAround(syntaxNode, t, 1, false);
break;
Expand Down Expand Up @@ -58,7 +65,11 @@ void SpaceAnalyzer::Analyze(FormatBuilder &f, const LuaSyntaxTree &t) {
}
break;
}
case ',':
case ',': {
SpaceLeft(syntaxNode, t, 0);
SpaceRight(syntaxNode, t, f.GetStyle().space_after_comma ? 1 : 0, false);
break;
}
case ';': {
SpaceLeft(syntaxNode, t, 0);
SpaceRight(syntaxNode, t, 1);
Expand All @@ -74,8 +85,11 @@ void SpaceAnalyzer::Analyze(FormatBuilder &f, const LuaSyntaxTree &t) {
SpaceRight(syntaxNode, t);
break;
}
case TK_THEN: {
SpaceLeft(syntaxNode, t);
case TK_THEN:
case TK_DO:
case TK_UNTIL:
case TK_WHILE: {
SpaceAround(syntaxNode, t);
break;
}
case '.':
Expand Down Expand Up @@ -206,6 +220,38 @@ void SpaceAnalyzer::Analyze(FormatBuilder &f, const LuaSyntaxTree &t) {
}
break;
}
case LuaSyntaxNodeKind::ForNumber: {
auto commas = syntaxNode.GetChildTokens(',', t);
for (auto comma: commas) {
SpaceRight(
comma, t,
f.GetStyle().space_after_comma_in_for_statement
? 1 : 0
);
}
break;
}
case LuaSyntaxNodeKind::ForList: {
auto nameList = syntaxNode.GetChildSyntaxNode(LuaSyntaxNodeKind::NameDefList, t);
for (auto comma: nameList.GetChildTokens(',', t)) {
SpaceRight(
comma, t,
f.GetStyle().space_after_comma_in_for_statement
? 1 : 0
);
}

auto exprList = syntaxNode.GetChildSyntaxNode(LuaSyntaxNodeKind::ExpressionList, t);
for (auto comma: exprList.GetChildTokens(',', t)) {
SpaceRight(
comma, t,
f.GetStyle().space_after_comma_in_for_statement
? 1 : 0
);
}
break;
}

default: {
break;
}
Expand Down

0 comments on commit 4491ad4

Please sign in to comment.