Skip to content

Commit 4487f9e

Browse files
committed
修复一部分在超行打断时的缩进行为
1 parent 1cdb5be commit 4487f9e

File tree

5 files changed

+64
-12
lines changed

5 files changed

+64
-12
lines changed

CodeService/src/Format/Analyzer/IndentationAnalyzer.cpp

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,18 @@ void IndentationAnalyzer::AddIndenter(LuaSyntaxNode n, const LuaSyntaxTree &t, I
187187
_indent[n.GetIndex()] = indentData;
188188
}
189189

190+
void IndentationAnalyzer::AddLinebreakGroup(LuaSyntaxNode parent, std::vector<LuaSyntaxNode> &group, const LuaSyntaxTree &t, std::size_t indent) {
191+
auto pos = _waitLinebreakGroups.size();
192+
WaitLinebreakGroup g;
193+
g.Indent = indent;
194+
g.TriggerNodes = group;
195+
g.Parent = parent;
196+
_waitLinebreakGroups.emplace_back(g);
197+
for (auto n: group) {
198+
_waitLinebreak.insert({n.GetIndex(), pos});
199+
}
200+
}
201+
190202
void IndentationAnalyzer::MarkIndent(LuaSyntaxNode n, const LuaSyntaxTree &t) {
191203
_indentMark.insert(n.GetIndex());
192204
auto p = n.GetParent(t);
@@ -199,7 +211,7 @@ void IndentationAnalyzer::MarkIndent(LuaSyntaxNode n, const LuaSyntaxTree &t) {
199211
void IndentationAnalyzer::OnFormatMessage(FormatState &f, FormatEvent event, LuaSyntaxNode syntaxNode, const LuaSyntaxTree &t) {
200212
switch (event) {
201213
case FormatEvent::NodeExceedLinebreak: {
202-
214+
ProcessExceedLinebreak(f, syntaxNode, t);
203215
break;
204216
}
205217
default: {
@@ -210,6 +222,7 @@ void IndentationAnalyzer::OnFormatMessage(FormatState &f, FormatEvent event, Lua
210222

211223
void IndentationAnalyzer::AnalyzeExprList(FormatState &f, LuaSyntaxNode &exprList, const LuaSyntaxTree &t) {
212224
auto exprs = exprList.GetChildSyntaxNodes(MultiKind::Expression, t);
225+
bool shouldIndent = true;
213226
if (exprs.size() == 1) {
214227
auto expr = exprs.front();
215228
auto syntaxKind = expr.GetSyntaxKind(t);
@@ -219,24 +232,24 @@ void IndentationAnalyzer::AnalyzeExprList(FormatState &f, LuaSyntaxNode &exprLis
219232
}
220233

221234
if (!IsExprShouldIndent(expr, t)) {
222-
return;
235+
shouldIndent = false;
223236
}
224-
225237
} else {
226-
bool shouldIndent = false;
238+
shouldIndent = false;
227239
for (auto expr: exprs) {
228240
if (IsExprShouldIndent(expr, t)) {
229241
shouldIndent = true;
230242
break;
231243
}
232244
}
233-
234-
if (!shouldIndent) {
235-
return;
236-
}
237245
}
238246

239-
AddIndenter(exprList, t, IndentData(IndentType::Standard, f.GetStyle().continuation_indent));
247+
if (shouldIndent) {
248+
AddIndenter(exprList, t, IndentData(IndentType::Standard, f.GetStyle().continuation_indent));
249+
} else {
250+
std::vector<LuaSyntaxNode> group = exprList.GetChildren(t);
251+
AddLinebreakGroup(exprList, group, t, f.GetStyle().continuation_indent);
252+
}
240253
}
241254

242255
void IndentationAnalyzer::AnalyzeCallExprList(FormatState &f, LuaSyntaxNode &exprList, const LuaSyntaxTree &t) {
@@ -252,6 +265,9 @@ void IndentationAnalyzer::AnalyzeCallExprList(FormatState &f, LuaSyntaxNode &exp
252265

253266
if (shouldIndent) {
254267
AddIndenter(exprList, t, IndentData(IndentType::Standard));
268+
} else {
269+
std::vector<LuaSyntaxNode> group = exprList.GetChildren(t);
270+
AddLinebreakGroup(exprList, group, t, 0);
255271
}
256272
}
257273

@@ -318,3 +334,23 @@ void IndentationAnalyzer::AnalyzeTableFieldKeyValuePairExpr(FormatState &f, LuaS
318334
AddIndenter(expr, t, IndentData(IndentType::Standard, f.GetStyle().continuation_indent));
319335
}
320336
}
337+
338+
void IndentationAnalyzer::ProcessExceedLinebreak(FormatState &f, LuaSyntaxNode syntaxNode, const LuaSyntaxTree &t) {
339+
auto it = _waitLinebreak.find(syntaxNode.GetIndex());
340+
if (it == _waitLinebreak.end()) {
341+
return;
342+
}
343+
auto pos = it->second;
344+
if (_waitLinebreakGroups.size() <= pos) {
345+
return;
346+
}
347+
348+
auto &group = _waitLinebreakGroups[pos];
349+
for (auto n: group.TriggerNodes) {
350+
_waitLinebreak.erase(n.GetIndex());
351+
}
352+
353+
for (auto c: group.Parent.GetChildren(t)) {
354+
AddIndenter(c, t, IndentData(IndentType::WhenNewLine, group.Indent));
355+
}
356+
}

CodeService/src/Format/Analyzer/LineBreakAnalyzer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ void LineBreakAnalyzer::Query(FormatState &f, LuaSyntaxNode syntaxNode, const Lu
213213
auto relationNode = LuaSyntaxNode(lineBreakData.Data.Index);
214214
auto guessLineWidth = lineWidth + syntaxNode.GetFirstLineWidth(t) + relationNode.GetFirstLineWidth(t);
215215
if (guessLineWidth > style.max_line_length) {
216+
f.Notify(FormatEvent::NodeExceedLinebreak, syntaxNode, t);
216217
resolve.SetNextLineBreak(LineSpace(1, LineBreakReason::ExceedMaxLine));
217218
}
218219
break;

include/CodeService/Format/Analyzer/FormatStrategy.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ enum class IndentType {
4545
Standard,
4646
InvertIndentation,
4747
WhenNewLine,
48-
WhenPrevIndent
48+
WhenPrevIndent,
49+
WhenExceedLinebreak
4950
};
5051

5152
struct IndentData {

include/CodeService/Format/Analyzer/IndentationAnalyzer.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ class IndentationAnalyzer : public FormatAnalyzer {
1717
public:
1818
DECLARE_FORMAT_ANALYZER(IndentationAnalyzer)
1919

20+
struct WaitLinebreakGroup {
21+
std::vector<LuaSyntaxNode> TriggerNodes;
22+
std::size_t Indent = 0;
23+
LuaSyntaxNode Parent;
24+
};
25+
2026
IndentationAnalyzer();
2127

2228
void Analyze(FormatState &f, const LuaSyntaxTree &t) override;
@@ -25,10 +31,13 @@ class IndentationAnalyzer : public FormatAnalyzer {
2531

2632
void AddIndenter(LuaSyntaxNode n, const LuaSyntaxTree &t, IndentData indentData = IndentData());
2733

34+
void AddLinebreakGroup(LuaSyntaxNode parent, std::vector<LuaSyntaxNode> &group, const LuaSyntaxTree &t, std::size_t indent);
35+
2836
// 在格式化过程中标记Token缩进
2937
void MarkIndent(LuaSyntaxNode n, const LuaSyntaxTree &t);
3038

31-
void OnFormatMessage(FormatState& f, FormatEvent event, LuaSyntaxNode syntaxNode, const LuaSyntaxTree& t) override;
39+
void OnFormatMessage(FormatState &f, FormatEvent event, LuaSyntaxNode syntaxNode, const LuaSyntaxTree &t) override;
40+
3241
private:
3342
void AnalyzeExprList(FormatState &f, LuaSyntaxNode &exprList, const LuaSyntaxTree &t);
3443

@@ -38,6 +47,11 @@ class IndentationAnalyzer : public FormatAnalyzer {
3847

3948
bool IsExprShouldIndent(LuaSyntaxNode &expr, const LuaSyntaxTree &t);
4049

50+
void ProcessExceedLinebreak(FormatState &f, LuaSyntaxNode syntaxNode, const LuaSyntaxTree &t);
51+
4152
std::unordered_map<std::size_t, IndentData> _indent;
4253
std::unordered_set<std::size_t> _indentMark;
54+
55+
std::unordered_map<std::size_t, std::size_t> _waitLinebreak;
56+
std::vector<WaitLinebreakGroup> _waitLinebreakGroups;
4357
};

include/CodeService/Format/Types.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,4 @@ struct IndexRange {
5656

5757
enum class FormatEvent {
5858
NodeExceedLinebreak
59-
};
59+
};

0 commit comments

Comments
 (0)