Skip to content

Commit b11eff2

Browse files
committed
支持命名风格检查
1 parent ec789dc commit b11eff2

File tree

10 files changed

+352
-29
lines changed

10 files changed

+352
-29
lines changed

CodeService/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ target_sources(CodeService
3131
${LuaCodeStyle_SOURCE_DIR}/include/CodeService/FormatElement/AlignToFirstElement.h
3232
${LuaCodeStyle_SOURCE_DIR}/include/CodeService/FormatElement/KeepElement.h
3333
${LuaCodeStyle_SOURCE_DIR}/include/CodeService/FormatElement/SubExpressionElement.h
34-
34+
${LuaCodeStyle_SOURCE_DIR}/include/CodeService/FormatElement/TextDefineType.h
3535
PRIVATE
3636
${CodeService_SOURCE_DIR}/src/LuaFormatter.cpp
3737

CodeService/src/FormatElement/DiagnosisContext.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ void DiagnosisContext::AddIndent(int specialIndent)
2121
return;
2222
}
2323

24-
auto& topIndent = _indentStack.top();
24+
auto topIndent = _indentStack.top();
2525
newIndent = _options.indent_size + topIndent;
2626
}
2727
else
@@ -41,15 +41,15 @@ void DiagnosisContext::AddIndent(int specialIndent)
4141
return;
4242
}
4343

44-
auto& topIndent = _indentStack.top();
44+
auto topIndent = _indentStack.top();
4545
// 一次只增一个\t
4646
newIndent = 1 + topIndent;
4747
}
4848
else
4949
{
5050
// 我会认为存在一个换算
5151
// 当你制定了一个缩进,则我会认为保底有一个缩进
52-
newIndent = std::max(1, specialIndent / 8);
52+
newIndent = std::max(1, specialIndent / _options.tab_width);
5353
}
5454
_indentStack.push(newIndent);
5555
}
@@ -115,6 +115,13 @@ std::vector<LuaDiagnosisInfo> DiagnosisContext::GetDiagnosisInfos()
115115
}
116116
_lineMaxLengthMap.clear();
117117
}
118+
119+
if (_options.insert_final_newline && !_parser->IsEmptyLine(_parser->GetTotalLine()))
120+
{
121+
LuaDiagnosisPosition start(_parser->GetTotalLine(), _parser->GetColumn(_parser->GetSource().size()));
122+
LuaDiagnosisPosition end(_parser->GetTotalLine() + 1, 0);
123+
PushDiagnosis(LText("The code must end with a new line"), start, end);
124+
}
118125
return _diagnosisInfos;
119126
}
120127

CodeService/src/FormatElement/TextElement.cpp

Lines changed: 212 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
1-
#include "CodeService/FormatElement/TextElement.h"
1+
#include "CodeService/FormatElement/TextElement.h"
2+
#include "Util/format.h"
23

3-
4-
TextElement::TextElement(std::string_view text, TextRange range)
5-
: _text(text),
6-
FormatElement(range)
4+
TextElement::TextElement(std::string_view text, TextDefineType textDefineType, TextRange range)
5+
: FormatElement(range),
6+
_text(text),
7+
_textDefineType(textDefineType)
78
{
89
}
910

10-
TextElement::TextElement(std::shared_ptr<LuaAstNode> node)
11-
: TextElement(node->GetText(), node->GetTextRange())
11+
TextElement::TextElement(std::shared_ptr<LuaAstNode> node, TextDefineType textDefineType)
12+
: TextElement(node->GetText(), textDefineType, node->GetTextRange())
1213
{
1314
}
1415

@@ -32,9 +33,213 @@ void TextElement::Diagnosis(DiagnosisContext& ctx, int position, FormatElement&
3233
auto line = ctx.GetLine(_textRange.EndOffset);
3334
ctx.SetLineMaxLength(line, character);
3435
}
36+
37+
38+
if (ctx.GetOptions().enable_name_style_check)
39+
{
40+
switch (_textDefineType)
41+
{
42+
case TextDefineType::LocalNameDefine:
43+
{
44+
if (!NameStyleCheck(ctx.GetOptions().local_name_define_style))
45+
{
46+
ctx.PushDiagnosis(format(
47+
LText("local name define does not match {} name style"),
48+
TranslateNameStyle(ctx.GetOptions().local_name_define_style)), _textRange);
49+
}
50+
break;
51+
}
52+
case TextDefineType::FunctionNameDefine:
53+
{
54+
if (!NameStyleCheck(ctx.GetOptions().function_name_define_style))
55+
{
56+
ctx.PushDiagnosis(format(
57+
LText("function name define does not match {} name style"),
58+
TranslateNameStyle(ctx.GetOptions().function_name_define_style)), _textRange);
59+
}
60+
break;
61+
}
62+
case TextDefineType::TableFieldNameDefine:
63+
{
64+
if (!NameStyleCheck(ctx.GetOptions().table_field_name_define_style))
65+
{
66+
ctx.PushDiagnosis(format(
67+
LText("table field name define does not match {} name style"),
68+
TranslateNameStyle(ctx.GetOptions().table_field_name_define_style)),
69+
_textRange);
70+
}
71+
break;
72+
}
73+
default:
74+
{
75+
break;
76+
}
77+
}
78+
}
3579
}
3680

3781
std::string_view TextElement::GetText() const
3882
{
3983
return _text;
4084
}
85+
86+
void TextElement::SetTextDefineType(TextDefineType textDefineType)
87+
{
88+
_textDefineType = textDefineType;
89+
}
90+
91+
std::string TextElement::TranslateNameStyle(NameStyle style)
92+
{
93+
switch (style)
94+
{
95+
case NameStyle::CamelCase:
96+
{
97+
return "camel-case";
98+
}
99+
case NameStyle::PascalCase:
100+
{
101+
return "pascal-case";
102+
}
103+
case NameStyle::SnakeCase:
104+
{
105+
return "snake-case";
106+
}
107+
default:
108+
{
109+
return "unknwon";
110+
}
111+
}
112+
}
113+
114+
bool TextElement::NameStyleCheck(NameStyle style)
115+
{
116+
switch (style)
117+
{
118+
case NameStyle::SnakeCase:
119+
{
120+
return SnakeCase();
121+
}
122+
case NameStyle::PascalCase:
123+
{
124+
return PascalCase();
125+
}
126+
case NameStyle::CamelCase:
127+
{
128+
return CamelCase();
129+
}
130+
default:
131+
{
132+
break;
133+
}
134+
}
135+
return true;
136+
}
137+
138+
bool TextElement::SnakeCase()
139+
{
140+
bool lowerCase = false;
141+
for (std::size_t index = 0; index != _text.size(); index++)
142+
{
143+
char ch = _text[index];
144+
145+
if (index == 0)
146+
{
147+
if (::islower(ch))
148+
{
149+
lowerCase = true;
150+
}
151+
else if (::isupper(ch))
152+
{
153+
lowerCase = false;
154+
}
155+
else if(ch == '_' && _text.size() == 1)
156+
{
157+
return true;
158+
}
159+
else
160+
{
161+
return false;
162+
}
163+
}
164+
else if ((lowerCase && !::islower(ch)) || (!lowerCase && !::isupper(ch)))
165+
{
166+
167+
if (ch == '_')
168+
{
169+
// 不允许双下划线
170+
if ((index < _text.size() - 1) && _text[index + 1] == '_')
171+
{
172+
return false;
173+
}
174+
}
175+
else if(!::isdigit(ch))
176+
{
177+
return false;
178+
}
179+
}
180+
}
181+
return true;
182+
}
183+
184+
bool TextElement::PascalCase()
185+
{
186+
for (std::size_t index = 0; index != _text.size(); index++)
187+
{
188+
char ch = _text[index];
189+
190+
if (index == 0)
191+
{
192+
// 首字母必须大写
193+
if (!::isupper(ch))
194+
{
195+
// _ 亚元不受命名限制
196+
if (_text.size() == 1 && ch == '_')
197+
{
198+
return true;
199+
}
200+
else
201+
{
202+
return false;
203+
}
204+
}
205+
}
206+
// 我又没办法分词简单处理下
207+
else if (!::isalnum(ch))
208+
{
209+
return false;
210+
}
211+
}
212+
return true;
213+
}
214+
215+
bool TextElement::CamelCase()
216+
{
217+
for (std::size_t index = 0; index != _text.size(); index++)
218+
{
219+
char ch = _text[index];
220+
221+
if (index == 0)
222+
{
223+
// 首字母可以小写,也可以单下划线开头
224+
if (!::islower(ch))
225+
{
226+
if (ch == '_')
227+
{
228+
if (_text.size() > 1 && !::islower(ch))
229+
{
230+
return false;
231+
}
232+
}
233+
else
234+
{
235+
return false;
236+
}
237+
}
238+
}
239+
else if (!::isalnum(ch))
240+
{
241+
return false;
242+
}
243+
}
244+
return true;
245+
}

CodeService/src/LuaFormatter.cpp

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ std::shared_ptr<FormatElement> LuaFormatter::FormatNode(std::shared_ptr<LuaAstNo
212212
case LuaAstNodeType::LiteralExpression:
213213
default:
214214
{
215-
return std::make_shared<TextElement>(node->GetText(), node->GetTextRange());
215+
return std::make_shared<TextElement>(node->GetText(), TextDefineType::Normal, node->GetTextRange());
216216
}
217217
}
218218
}
@@ -401,12 +401,16 @@ std::shared_ptr<FormatElement> LuaFormatter::FormatAssignment(std::shared_ptr<Lu
401401
}
402402
case LuaAstNodeType::ExpressionList:
403403
{
404-
env->AddChild(FormatNode(node));
405404
if (isLeftExprList)
406405
{
406+
env->AddChild(FormatAssignLeftExpressionList(node));
407407
env->Add<KeepBlankElement>(1);
408408
isLeftExprList = false;
409409
}
410+
else
411+
{
412+
env->AddChild(FormatNode(node));
413+
}
410414

411415
break;
412416
}
@@ -429,7 +433,7 @@ std::shared_ptr<FormatElement> LuaFormatter::FormatNameDefList(std::shared_ptr<L
429433
{
430434
case LuaAstNodeType::Identify:
431435
{
432-
env->Add<TextElement>(node);
436+
env->Add<TextElement>(node, TextDefineType::LocalNameDefine);
433437
break;
434438
}
435439
case LuaAstNodeType::GeneralOperator:
@@ -500,6 +504,35 @@ std::shared_ptr<FormatElement> LuaFormatter::FormatAssignLeftExpressionList(std:
500504
auto subEnv = std::make_shared<SubExpressionElement>();
501505
env->AddChild(FormatExpression(node, subEnv));
502506
env->Add<KeepElement>(0);
507+
508+
if (_options.enable_name_style_check)
509+
{
510+
if (!node->GetChildren().empty())
511+
{
512+
auto type = node->GetChildren().back()->GetType();
513+
if (type == LuaAstNodeType::IndexExpression)
514+
{
515+
auto textRange = node->GetTextRange();
516+
std::shared_ptr<FormatElement> lastElement = env->LastValidElement();
517+
while (lastElement != nullptr)
518+
{
519+
if (lastElement->GetType() == FormatElementType::TextElement && lastElement->
520+
GetTextRange().EndOffset ==
521+
textRange.EndOffset)
522+
{
523+
auto textElement = std::dynamic_pointer_cast<TextElement>(lastElement);
524+
textElement->SetTextDefineType(TextDefineType::TableFieldNameDefine);
525+
break;
526+
}
527+
lastElement = lastElement->LastValidElement();
528+
}
529+
}
530+
else if (type == LuaAstNodeType::Identify)
531+
{
532+
//ignore
533+
}
534+
}
535+
}
503536
break;
504537
}
505538
case LuaAstNodeType::GeneralOperator:
@@ -1050,8 +1083,26 @@ std::shared_ptr<FormatElement> LuaFormatter::FormatNameExpression(std::shared_pt
10501083

10511084
for (auto child : nameExpression->GetChildren())
10521085
{
1053-
DefaultHandle(child, env);
1086+
FormatSubExpressionNode(child, env);
1087+
}
1088+
1089+
if (_options.enable_name_style_check)
1090+
{
1091+
auto textRange = nameExpression->GetTextRange();
1092+
std::shared_ptr<FormatElement> lastElement = env->LastValidElement();
1093+
while (lastElement != nullptr)
1094+
{
1095+
if (lastElement->GetType() == FormatElementType::TextElement && lastElement->GetTextRange().EndOffset ==
1096+
textRange.EndOffset)
1097+
{
1098+
auto textElement = std::dynamic_pointer_cast<TextElement>(lastElement);
1099+
textElement->SetTextDefineType(TextDefineType::FunctionNameDefine);
1100+
break;
1101+
}
1102+
lastElement = lastElement->LastValidElement();
1103+
}
10541104
}
1105+
10551106
return env;
10561107
}
10571108

@@ -1285,6 +1336,10 @@ std::shared_ptr<FormatElement> LuaFormatter::FormatTableField(std::shared_ptr<Lu
12851336
}
12861337
break;
12871338
}
1339+
case LuaAstNodeType::Identify:
1340+
{
1341+
env->Add<TextElement>(child, TextDefineType::TableFieldNameDefine);
1342+
}
12881343
default:
12891344
{
12901345
DefaultHandle(child, env);

0 commit comments

Comments
 (0)