11#include " CodeService/NameStyle/NameStyleChecker.h"
22#include < algorithm>
3+ #include " Util/format.h"
4+ #include " CodeService/LanguageTranslator.h"
35
46NameStyleChecker::NameStyleChecker (DiagnosisContext& ctx)
57 : _ctx(ctx)
@@ -8,6 +10,21 @@ NameStyleChecker::NameStyleChecker(DiagnosisContext& ctx)
810
911std::vector<LuaDiagnosisInfo> NameStyleChecker::Analysis ()
1012{
13+ for (auto checkElement : _nameStyleCheckVector)
14+ {
15+ if (checkElement->Type == NameDefineType::ModuleDefineName)
16+ {
17+ auto parser = _ctx.GetParser ();
18+
19+ auto filename = parser->GetFilename ();
20+
21+ if (checkElement->Node ->GetText () != filename)
22+ {
23+ _ctx.PushDiagnosis (format (LText (" module name must be {}" ), filename),
24+ checkElement->Node ->GetTextRange ());
25+ }
26+ }
27+ }
1128 // if (ctx.GetOptions().enable_name_style_check)
1229 // {
1330 // switch (_textDefineType)
@@ -95,7 +112,9 @@ void NameStyleChecker::VisitLocalStatement(const std::shared_ptr<LuaAstNode>& lo
95112 auto nameIdentify = nameVector[index];
96113 if (index >= expressionVector.size ())
97114 {
98- _nameStyleCheckVector.push_back ({NameDefineType::LocalVariableName, nameIdentify});
115+ auto checkElement = std::make_shared<CheckElement>(NameDefineType::LocalVariableName, nameIdentify);
116+ _nameStyleCheckVector.push_back (checkElement);
117+ RecordLocalVariable (checkElement);
99118 continue ;
100119 }
101120 auto expression = expressionVector[index];
@@ -110,20 +129,27 @@ void NameStyleChecker::VisitLocalStatement(const std::shared_ptr<LuaAstNode>& lo
110129 if (methodNameNode->GetText () == " require" || methodNameNode->GetText () == " import" )
111130 {
112131 auto callArgsList = callExpression->FindFirstOf (LuaAstNodeType::CallArgList);
113- _nameStyleCheckVector.push_back ({NameDefineType::ImportModuleName, nameIdentify, callArgsList});
132+
133+ auto checkElement = std::make_shared<CheckElement>(
134+ NameDefineType::ImportModuleName, nameIdentify, callArgsList);
135+ _nameStyleCheckVector.push_back (checkElement);
136+ RecordLocalVariable (checkElement);
114137 continue ;
115138 }
116139 else if (methodNameNode->GetText () == " Class" || methodNameNode->GetText () == " class" )
117140 {
118141 auto callArgsList = callExpression->FindFirstOf (LuaAstNodeType::CallArgList);
119- _nameStyleCheckVector.push_back ({
120- NameDefineType::ClassVariableName, nameIdentify, callArgsList
121- });
142+ auto checkElement = std::make_shared<CheckElement>(
143+ NameDefineType::ClassVariableName, nameIdentify, callArgsList);
144+ _nameStyleCheckVector.push_back (checkElement);
145+ RecordLocalVariable (checkElement);
122146 continue ;
123147 }
124148 }
125149 }
126- _nameStyleCheckVector.push_back ({NameDefineType::LocalVariableName, nameIdentify});
150+ auto checkElement = std::make_shared<CheckElement>(NameDefineType::LocalVariableName, nameIdentify);
151+ _nameStyleCheckVector.push_back (checkElement);
152+ RecordLocalVariable (checkElement);
127153 }
128154 }
129155 else if (nameDefineList)
@@ -132,7 +158,9 @@ void NameStyleChecker::VisitLocalStatement(const std::shared_ptr<LuaAstNode>& lo
132158 {
133159 if (nameIdentify->GetType () == LuaAstNodeType::Identify)
134160 {
135- _nameStyleCheckVector.push_back ({NameDefineType::LocalVariableName, nameIdentify});
161+ auto checkElement = std::make_shared<CheckElement>(NameDefineType::LocalVariableName, nameIdentify);
162+ _nameStyleCheckVector.push_back (checkElement);
163+ RecordLocalVariable (checkElement);
136164 }
137165 }
138166 }
@@ -144,7 +172,7 @@ void NameStyleChecker::VisitParamList(const std::shared_ptr<LuaAstNode>& paramLi
144172 {
145173 if (param->GetType () == LuaAstNodeType::Identify)
146174 {
147- _nameStyleCheckVector.push_back ({ NameDefineType::ParamName, param} );
175+ _nameStyleCheckVector.push_back (std::make_shared<CheckElement>( NameDefineType::ParamName, param) );
148176 }
149177 }
150178}
@@ -155,7 +183,7 @@ void NameStyleChecker::VisitLocalFunctionStatement(const std::shared_ptr<LuaAstN
155183 {
156184 if (child->GetType () == LuaAstNodeType::Identify)
157185 {
158- _nameStyleCheckVector.push_back ({ NameDefineType::LocalFunctionName, child} );
186+ _nameStyleCheckVector.push_back (std::make_shared<CheckElement>( NameDefineType::LocalFunctionName, child) );
159187 break ;
160188 }
161189 }
@@ -184,7 +212,8 @@ void NameStyleChecker::VisitFunctionStatement(const std::shared_ptr<LuaAstNode>&
184212 if (lastElement && lastElement->GetType () == LuaAstNodeType::Identify
185213 || lastElement->GetType () == LuaAstNodeType::PrimaryExpression)
186214 {
187- _nameStyleCheckVector.push_back ({NameDefineType::FunctionDefineName, lastElement});
215+ _nameStyleCheckVector.push_back (
216+ std::make_shared<CheckElement>(NameDefineType::FunctionDefineName, lastElement));
188217 }
189218 }
190219 }
@@ -203,7 +232,8 @@ void NameStyleChecker::VisitAssignment(const std::shared_ptr<LuaAstNode>& assign
203232 {
204233 if (IsGlobal (expressionFirstChild))
205234 {
206- _nameStyleCheckVector.push_back ({NameDefineType::GlobalVariableDefineName, expressionFirstChild});
235+ _nameStyleCheckVector.push_back (
236+ std::make_shared<CheckElement>(NameDefineType::GlobalVariableDefineName, expressionFirstChild));
207237 }
208238 }
209239 else if (expressionFirstChild->GetType () == LuaAstNodeType::IndexExpression)
@@ -224,7 +254,8 @@ void NameStyleChecker::VisitAssignment(const std::shared_ptr<LuaAstNode>& assign
224254
225255 if (lastElement && lastElement->GetType () == LuaAstNodeType::Identify)
226256 {
227- _nameStyleCheckVector.push_back ({NameDefineType::FunctionDefineName, lastElement});
257+ _nameStyleCheckVector.push_back (
258+ std::make_shared<CheckElement>(NameDefineType::FunctionDefineName, lastElement));
228259 }
229260 }
230261 }
@@ -237,7 +268,7 @@ void NameStyleChecker::VisitTableField(const std::shared_ptr<LuaAstNode>& tableF
237268
238269 if (identify)
239270 {
240- _nameStyleCheckVector.push_back ({ NameDefineType::TableFieldDefineName, identify} );
271+ _nameStyleCheckVector.push_back (std::make_shared<CheckElement>( NameDefineType::TableFieldDefineName, identify) );
241272 }
242273}
243274
@@ -249,9 +280,23 @@ void NameStyleChecker::VisitReturnStatement(const std::shared_ptr<LuaAstNode>& r
249280 if (expressionList && !expressionList->GetChildren ().empty ())
250281 {
251282 auto firstReturnExpression = expressionList->GetChildren ().front ();
252- if (firstReturnExpression->GetType () == LuaAstNodeType::PrimaryExpression )
283+ if (firstReturnExpression->GetType () == LuaAstNodeType::Expression )
253284 {
254- auto block = returnStatement->GetParent ();
285+ auto primaryReturnIdentify = firstReturnExpression->FindFirstOf (LuaAstNodeType::PrimaryExpression);
286+ if (primaryReturnIdentify)
287+ {
288+ auto block = returnStatement->GetParent ();
289+
290+ if (_scopeMap.count (block))
291+ {
292+ auto & scope = _scopeMap[block];
293+ auto it = scope.LocalVariableMap .find (primaryReturnIdentify->GetText ());
294+ if (it != scope.LocalVariableMap .end ())
295+ {
296+ it->second ->Type = NameDefineType::ModuleDefineName;
297+ }
298+ }
299+ }
255300 }
256301 }
257302 }
@@ -262,8 +307,23 @@ void NameStyleChecker::VisitBlock(const std::shared_ptr<LuaAstNode>& block)
262307 _scopeMap.insert ({block, Scope ()});
263308}
264309
265- void NameStyleChecker::RecordLocalVariable (std::shared_ptr<LuaAstNode> identify )
310+ void NameStyleChecker::RecordLocalVariable (std::shared_ptr<CheckElement> checkElement )
266311{
312+ auto node = checkElement->Node ;
313+ auto parent = node->GetParent ();
314+ while (parent)
315+ {
316+ if (parent->GetType () == LuaAstNodeType::Block)
317+ {
318+ if (_scopeMap.count (parent))
319+ {
320+ auto & scope = _scopeMap[parent];
321+ scope.LocalVariableMap .insert ({std::string (node->GetText ()), checkElement});
322+ }
323+ break ;
324+ }
325+ parent = parent->GetParent ();
326+ }
267327}
268328
269329bool NameStyleChecker::InTopBlock (std::shared_ptr<LuaAstNode> chunkBlockStatement)
@@ -279,6 +339,26 @@ bool NameStyleChecker::InTopBlock(std::shared_ptr<LuaAstNode> chunkBlockStatemen
279339
280340bool NameStyleChecker::IsGlobal (std::shared_ptr<LuaAstNode> node)
281341{
342+ auto identifyText = node->GetText ();
343+
344+ auto parent = node->GetParent ();
345+ while (parent)
346+ {
347+ if (parent->GetType () == LuaAstNodeType::Block)
348+ {
349+ if (_scopeMap.count (parent))
350+ {
351+ auto & scope = _scopeMap[parent];
352+ auto it = scope.LocalVariableMap .find (identifyText);
353+ if (it != scope.LocalVariableMap .end ())
354+ {
355+ return false ;
356+ }
357+ }
358+ }
359+ parent = parent->GetParent ();
360+ }
361+
282362 return true ;
283363}
284364
0 commit comments