Skip to content

Commit 4ab859f

Browse files
committed
Fix #186
1 parent 81ef873 commit 4ab859f

File tree

13 files changed

+130
-53
lines changed

13 files changed

+130
-53
lines changed

CodeFormatCore/include/CodeFormatCore/Diagnostic/DiagnosticType.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ enum class DiagnosticType {
1515
Indent,
1616
Semicolon,
1717
NameStyle,
18-
Spell
18+
Spell,
19+
Parentheses,
1920
};
2021

2122
class LuaDiagnostic {

CodeFormatCore/include/CodeFormatCore/Format/Analyzer/FormatResolve.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@ class FormatResolve {
1212

1313
PrevSpaceStrategy GetPrevSpaceStrategy() const;
1414

15+
PrevTokenStrategy GetPrevTokenStrategy() const;
16+
1517
TokenStrategy GetTokenStrategy() const;
1618

17-
TokenAddStrategy GetTokenAddStrategy() const;
19+
NextTokenStrategy GetNextTokenStrategy() const;
1820

1921
IndentStrategy GetIndentStrategy() const;
2022

@@ -30,7 +32,9 @@ class FormatResolve {
3032

3133
void SetTokenStrategy(TokenStrategy strategy);
3234

33-
void SetTokenAddStrategy(TokenAddStrategy strategy);
35+
void SetNextTokenStrategy(NextTokenStrategy strategy);
36+
37+
void SetPrevTokenStrategy(PrevTokenStrategy strategy);
3438

3539
std::size_t GetNextSpace();
3640

@@ -49,8 +53,9 @@ class FormatResolve {
4953
private:
5054
NextSpaceStrategy _nextSpaceStrategy;
5155
PrevSpaceStrategy _prevSpaceStrategy;
56+
PrevTokenStrategy _prevTokenStrategy;
5257
TokenStrategy _tokenStrategy;
53-
TokenAddStrategy _tokenAddStrategy;
58+
NextTokenStrategy _nextAddStrategy;
5459
IndentStrategy _indentStrategy;
5560

5661
union NextData {

CodeFormatCore/include/CodeFormatCore/Format/Analyzer/FormatStrategy.h

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ enum class PrevSpaceStrategy {
1717
LineBreak
1818
};
1919

20+
enum class PrevTokenStrategy {
21+
None,
22+
LeftParentheses,
23+
24+
};
25+
2026
enum class TokenStrategy {
2127
Origin,
2228
Remove,
@@ -28,17 +34,18 @@ enum class TokenStrategy {
2834
StmtEndSemicolon,
2935
NewLineBeforeToken,
3036

31-
WithParentheses,
32-
WithLeftParentheses,
33-
WithRightParentheses,
37+
// WithParentheses,
38+
// WithLeftParentheses,
39+
// WithRightParentheses,
3440
SpaceAfterCommentDash
3541
};
3642

37-
enum class TokenAddStrategy {
43+
enum class NextTokenStrategy {
3844
None,
3945
TableAddColon,
4046
TableAddComma,
4147
StmtEndSemicolon,
48+
RightParentheses,
4249
};
4350

4451
enum class IndentStrategy {

CodeFormatCore/include/CodeFormatCore/Format/Analyzer/TokenAnalyzer.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@ class TokenAnalyzer : public FormatAnalyzer {
1313

1414
void Query(FormatState &f, LuaSyntaxNode syntaxNode, const LuaSyntaxTree &t, FormatResolve &resolve) override;
1515

16+
void MarkPrev(LuaSyntaxNode n, const LuaSyntaxTree &t, PrevTokenStrategy strategy);
17+
1618
void Mark(LuaSyntaxNode n, const LuaSyntaxTree &t, TokenStrategy strategy);
1719

18-
void MarkAdd(LuaSyntaxNode n, const LuaSyntaxTree &t, TokenAddStrategy strategy);
20+
void MarkNext(LuaSyntaxNode n, const LuaSyntaxTree &t, NextTokenStrategy strategy);
1921

2022
bool IsRemove(LuaSyntaxNode n, const LuaSyntaxTree &t) const;
2123

@@ -29,5 +31,6 @@ class TokenAnalyzer : public FormatAnalyzer {
2931
void AnalyzeComment(FormatState &f, LuaSyntaxNode n, const LuaSyntaxTree &t);
3032

3133
std::unordered_map<std::size_t, TokenStrategy> _tokenStrategies;
32-
std::unordered_map<std::size_t, TokenAddStrategy> _tokenAddStrategies;
34+
std::unordered_map<std::size_t, NextTokenStrategy> _nextTokenStrategies;
35+
std::unordered_map<std::size_t, PrevTokenStrategy> _prevTokenStrategies;
3336
};

CodeFormatCore/src/Diagnostic/CodeStyle/CodeStyleChecker.cpp

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,17 @@ void CodeStyleChecker::BasicResolve(LuaSyntaxNode syntaxNode, const LuaSyntaxTre
7070
}
7171
}
7272

73+
switch (resolve.GetPrevTokenStrategy()) {
74+
case PrevTokenStrategy::LeftParentheses: {
75+
d.PushDiagnostic(DiagnosticType::Parentheses, textRange,
76+
LText("expected ("));
77+
break;
78+
}
79+
default: {
80+
break;
81+
}
82+
}
83+
7384
switch (resolve.GetTokenStrategy()) {
7485
case TokenStrategy::StringSingleQuote: {
7586
if (syntaxNode.GetTokenKind(t) == TK_STRING) {
@@ -117,13 +128,18 @@ void CodeStyleChecker::BasicResolve(LuaSyntaxNode syntaxNode, const LuaSyntaxTre
117128
}
118129
}
119130

120-
switch (resolve.GetTokenAddStrategy()) {
121-
case TokenAddStrategy::StmtEndSemicolon: {
131+
switch (resolve.GetNextTokenStrategy()) {
132+
case NextTokenStrategy::StmtEndSemicolon: {
122133
d.PushDiagnostic(DiagnosticType::Semicolon,
123134
TextRange(textRange.GetEndOffset(), 1),
124135
LText("expected ; at end of statement"));
125136
break;
126137
}
138+
case NextTokenStrategy::RightParentheses: {
139+
d.PushDiagnostic(DiagnosticType::Parentheses, textRange,
140+
LText("expected )"));
141+
break;
142+
}
127143
default: {
128144
break;
129145
}
@@ -271,7 +287,7 @@ void CodeStyleChecker::ProcessIndentDiagnostic(LuaSyntaxNode &node, const LuaSyn
271287
// if(state.GetStyle().indent_style)
272288
d.PushDiagnostic(DiagnosticType::Indent,
273289
currentIndentRange,
274-
GetIndentNote(indent,checkIndent.Space, checkIndent.Tab, state.GetStyle().indent_style));
290+
GetIndentNote(indent, checkIndent.Space, checkIndent.Tab, state.GetStyle().indent_style));
275291
}
276292
}
277293

CodeFormatCore/src/Format/Analyzer/FormatResolve.cpp

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ FormatResolve::FormatResolve()
44
: _nextSpaceStrategy(NextSpaceStrategy::None),
55
_prevSpaceStrategy(PrevSpaceStrategy::None),
66
_tokenStrategy(TokenStrategy::Origin),
7-
_tokenAddStrategy(TokenAddStrategy::None),
7+
_nextAddStrategy(NextTokenStrategy::None),
88
_indentStrategy(IndentStrategy::None),
99
_nextSpaceData(),
1010
_prevSpaceData(),
@@ -19,23 +19,29 @@ PrevSpaceStrategy FormatResolve::GetPrevSpaceStrategy() const {
1919
return _prevSpaceStrategy;
2020
}
2121

22+
PrevTokenStrategy FormatResolve::GetPrevTokenStrategy() const {
23+
return _prevTokenStrategy;
24+
}
25+
2226
TokenStrategy FormatResolve::GetTokenStrategy() const {
2327
return _tokenStrategy;
2428
}
2529

26-
TokenAddStrategy FormatResolve::GetTokenAddStrategy() const {
27-
return _tokenAddStrategy;
30+
NextTokenStrategy FormatResolve::GetNextTokenStrategy() const {
31+
return _nextAddStrategy;
2832
}
2933

3034
IndentStrategy FormatResolve::GetIndentStrategy() const {
3135
return _indentStrategy;
3236
}
3337

3438
void FormatResolve::Reset() {
39+
_prevSpaceStrategy = PrevSpaceStrategy::None;
40+
_prevTokenStrategy = PrevTokenStrategy::None;
3541
_tokenStrategy = TokenStrategy::Origin;
36-
_tokenAddStrategy = TokenAddStrategy::None;
42+
_nextAddStrategy = NextTokenStrategy::None;
3743
_nextSpaceStrategy = NextSpaceStrategy::None;
38-
_prevSpaceStrategy = PrevSpaceStrategy::None;
44+
3945
_indentStrategy = IndentStrategy::None;
4046
_nextSpaceData = NextData();
4147
_prevSpaceData = PrevData();
@@ -88,8 +94,12 @@ void FormatResolve::SetTokenStrategy(TokenStrategy strategy) {
8894
_tokenStrategy = strategy;
8995
}
9096

91-
void FormatResolve::SetTokenAddStrategy(TokenAddStrategy strategy) {
92-
_tokenAddStrategy = strategy;
97+
void FormatResolve::SetPrevTokenStrategy(PrevTokenStrategy strategy) {
98+
_prevTokenStrategy = strategy;
99+
}
100+
101+
void FormatResolve::SetNextTokenStrategy(NextTokenStrategy strategy) {
102+
_nextAddStrategy = strategy;
93103
}
94104

95105
void FormatResolve::SetOriginRange(IndexRange range) {

CodeFormatCore/src/Format/Analyzer/SemicolonAnalyzer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ void SemicolonAnalyzer::Query(FormatState &f, LuaSyntaxNode n, const LuaSyntaxTr
6363
auto &strategy = it->second;
6464
switch (strategy) {
6565
case SemicolonStrategy::Add: {
66-
resolve.SetTokenAddStrategy(TokenAddStrategy::StmtEndSemicolon);
66+
resolve.SetNextTokenStrategy(NextTokenStrategy::StmtEndSemicolon);
6767
break;
6868
}
6969
case SemicolonStrategy::Remove: {

CodeFormatCore/src/Format/Analyzer/TokenAnalyzer.cpp

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -64,24 +64,33 @@ void TokenAnalyzer::Analyze(FormatState &f, const LuaSyntaxTree &t) {
6464

6565
void TokenAnalyzer::Query(FormatState &f, LuaSyntaxNode syntaxNode, const LuaSyntaxTree &t, FormatResolve &resolve) {
6666
if (syntaxNode.IsToken(t)) {
67+
auto itPrev = _prevTokenStrategies.find(syntaxNode.GetIndex());
68+
if (itPrev != _prevTokenStrategies.end()) {
69+
resolve.SetPrevTokenStrategy(itPrev->second);
70+
}
71+
6772
auto it = _tokenStrategies.find(syntaxNode.GetIndex());
6873
if (it != _tokenStrategies.end()) {
6974
resolve.SetTokenStrategy(it->second);
7075
}
7176

72-
auto it2 = _tokenAddStrategies.find(syntaxNode.GetIndex());
73-
if (it2 != _tokenAddStrategies.end()) {
74-
resolve.SetTokenAddStrategy(it2->second);
77+
auto itNext = _nextTokenStrategies.find(syntaxNode.GetIndex());
78+
if (itNext != _nextTokenStrategies.end()) {
79+
resolve.SetNextTokenStrategy(itNext->second);
7580
}
7681
}
7782
}
7883

84+
void TokenAnalyzer::MarkPrev(LuaSyntaxNode n, const LuaSyntaxTree &t, PrevTokenStrategy strategy) {
85+
_prevTokenStrategies[n.GetIndex()] = strategy;
86+
}
87+
7988
void TokenAnalyzer::Mark(LuaSyntaxNode n, const LuaSyntaxTree &t, TokenStrategy strategy) {
8089
_tokenStrategies[n.GetIndex()] = strategy;
8190
}
8291

83-
void TokenAnalyzer::MarkAdd(LuaSyntaxNode n, const LuaSyntaxTree &t, TokenAddStrategy strategy) {
84-
_tokenAddStrategies[n.GetIndex()] = strategy;
92+
void TokenAnalyzer::MarkNext(LuaSyntaxNode n, const LuaSyntaxTree &t, NextTokenStrategy strategy) {
93+
_nextTokenStrategies[n.GetIndex()] = strategy;
8594
}
8695

8796
bool TokenAnalyzer::IsRemove(LuaSyntaxNode n, const LuaSyntaxTree &t) const {
@@ -101,16 +110,16 @@ void TokenAnalyzer::TableFieldAddSep(FormatState &f, LuaSyntaxNode n, const LuaS
101110
}
102111
switch (f.GetStyle().table_separator_style) {
103112
case TableSeparatorStyle::Semicolon: {
104-
return MarkAdd(lastToken, t, TokenAddStrategy::TableAddColon);
113+
return MarkNext(lastToken, t, NextTokenStrategy::TableAddColon);
105114
}
106115
case TableSeparatorStyle::OnlyKVColon: {
107116
if (n.GetChildToken('=', t).IsToken(t)) {
108-
return MarkAdd(lastToken, t, TokenAddStrategy::TableAddColon);
117+
return MarkNext(lastToken, t, NextTokenStrategy::TableAddColon);
109118
}
110119
// fallthrough
111120
}
112121
default: {
113-
return MarkAdd(lastToken, t, TokenAddStrategy::TableAddComma);
122+
return MarkNext(lastToken, t, NextTokenStrategy::TableAddComma);
114123
}
115124
}
116125
}
@@ -270,15 +279,18 @@ void TokenAnalyzer::AnalyzeCallExpression(FormatState &f, LuaSyntaxNode n, const
270279
if (!lbrace.IsToken(t) && spaceAnalyzer) {
271280
auto node = GetSingleArgStringOrTable(n, t);
272281
if (node.IsToken(t)) {
273-
Mark(node, t, TokenStrategy::WithParentheses);
282+
MarkPrev(node, t, PrevTokenStrategy::LeftParentheses);
283+
MarkNext(node, t, NextTokenStrategy::RightParentheses);
274284
spaceAnalyzer->SpaceAround(node, t, 0, SpaceAnalyzer::SpacePriority::First);
275285
} else if (node.GetSyntaxKind(t) == LuaSyntaxNodeKind::StringLiteralExpression) {
276-
Mark(node.GetFirstToken(t), t, TokenStrategy::WithParentheses);
286+
auto firstToken = node.GetFirstToken(t);
287+
MarkPrev(firstToken, t, PrevTokenStrategy::LeftParentheses);
288+
MarkNext(firstToken, t, NextTokenStrategy::RightParentheses);
277289
spaceAnalyzer->SpaceLeft(node.GetFirstToken(t), t, 0, SpaceAnalyzer::SpacePriority::First);
278290
} else {
279-
Mark(node.GetFirstToken(t), t, TokenStrategy::WithLeftParentheses);
291+
MarkPrev(node.GetFirstToken(t), t, PrevTokenStrategy::LeftParentheses);
292+
MarkNext(node.GetLastToken(t), t, NextTokenStrategy::RightParentheses);
280293
spaceAnalyzer->SpaceLeft(node.GetFirstToken(t), t, 0, SpaceAnalyzer::SpacePriority::First);
281-
Mark(node.GetLastToken(t), t, TokenStrategy::WithRightParentheses);
282294
}
283295

284296
return;
@@ -310,3 +322,5 @@ void TokenAnalyzer::AnalyzeComment(FormatState &f, LuaSyntaxNode n, const LuaSyn
310322
}
311323
}
312324
}
325+
326+

CodeFormatCore/src/Format/FormatBuilder.cpp

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,16 @@ void FormatBuilder::DoResolve(LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t,
7575
}
7676
}
7777

78+
switch (resolve.GetPrevTokenStrategy()) {
79+
case PrevTokenStrategy::LeftParentheses: {
80+
WriteChar('(');
81+
break;
82+
}
83+
default: {
84+
break;
85+
}
86+
}
87+
7888
switch (resolve.GetTokenStrategy()) {
7989
case TokenStrategy::Origin: {
8090
WriteSyntaxNode(syntaxNode, t);
@@ -146,22 +156,6 @@ void FormatBuilder::DoResolve(LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t,
146156
WriteSyntaxNode(syntaxNode, t);
147157
break;
148158
}
149-
case TokenStrategy::WithParentheses: {
150-
WriteChar('(');
151-
WriteSyntaxNode(syntaxNode, t);
152-
WriteChar(')');
153-
break;
154-
}
155-
case TokenStrategy::WithLeftParentheses:{
156-
WriteChar('(');
157-
WriteSyntaxNode(syntaxNode, t);
158-
break;
159-
}
160-
case TokenStrategy::WithRightParentheses: {
161-
WriteSyntaxNode(syntaxNode, t);
162-
WriteChar(')');
163-
break;
164-
}
165159
case TokenStrategy::SpaceAfterCommentDash: {
166160
auto text = syntaxNode.GetText(t);
167161
std::size_t pos = 0;
@@ -178,19 +172,23 @@ void FormatBuilder::DoResolve(LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t,
178172
}
179173
}
180174

181-
switch (resolve.GetTokenAddStrategy()) {
182-
case TokenAddStrategy::TableAddComma: {
175+
switch (resolve.GetNextTokenStrategy()) {
176+
case NextTokenStrategy::TableAddComma: {
183177
WriteChar(',');
184178
break;
185179
}
186-
case TokenAddStrategy::TableAddColon: {
180+
case NextTokenStrategy::TableAddColon: {
187181
WriteChar(';');
188182
break;
189183
}
190-
case TokenAddStrategy::StmtEndSemicolon: {
184+
case NextTokenStrategy::StmtEndSemicolon: {
191185
WriteChar(';');
192186
break;
193187
}
188+
case NextTokenStrategy::RightParentheses: {
189+
WriteChar(')');
190+
break;
191+
}
194192
default: {
195193
break;
196194
}

CodeFormatLib/src/CodeFormatLib.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ std::string GetDiagnosisString(DiagnosticType type) {
4343
return "string-quote";
4444
case DiagnosticType::Semicolon:
4545
return "semicolon";
46+
case DiagnosticType::Parentheses:
47+
return "parentheses";
4648
default: {
4749
break;
4850
}

0 commit comments

Comments
 (0)