@@ -27,6 +27,83 @@ int FindTokenIndexBeforePosition(std::vector<LuaToken>& tokens, int offset)
2727 return static_cast <int >(pos - tokens.begin ()) - 1 ;
2828}
2929
30+ int FindTokenIndexAfterPosition (std::vector<LuaToken>& tokens, int offset)
31+ {
32+ if (tokens.empty ())
33+ {
34+ return -1 ;
35+ }
36+
37+ auto tempToken = LuaToken (0 , " " , TextRange (offset, offset));
38+ // 二分法的思想快速定位
39+ auto pos = std::lower_bound (
40+ tokens.begin (), tokens.end (), tempToken,
41+ [](const LuaToken& x, const LuaToken& y)
42+ {
43+ return x.Range .EndOffset < y.Range .StartOffset ;
44+ });
45+ if (pos == tokens.end ())
46+ {
47+ return -1 ;
48+ }
49+
50+ return static_cast <int >(pos - tokens.begin ());
51+ }
52+
53+ std::shared_ptr<LuaAstNode> FindAstNodeBeforePosition (std::shared_ptr<LuaAstNode> root, int offset)
54+ {
55+ if (root->GetChildren ().empty ())
56+ {
57+ return root;
58+ }
59+
60+ enum class FindState
61+ {
62+ None,
63+ Before,
64+ Contain
65+ } state = FindState::None;
66+
67+ auto it = root->GetChildren ().begin ();
68+ for (; it != root->GetChildren ().end (); it++)
69+ {
70+ auto & child = *it;
71+ auto textRange = child->GetTextRange ();
72+ if (textRange.StartOffset > offset)
73+ {
74+ state = FindState::Before;
75+ break ;
76+ }
77+ else if (offset <= textRange.EndOffset )
78+ {
79+ state = FindState::Contain;
80+ break ;
81+ }
82+ }
83+
84+ switch (state)
85+ {
86+ case FindState::Before:
87+ {
88+ if (it == root->GetChildren ().begin ())
89+ {
90+ return root;
91+ }
92+ return *(it - 1 );
93+ }
94+ case FindState::Contain:
95+ {
96+ return FindAstNodeBeforePosition (*it, offset);
97+ }
98+ case FindState::None:
99+ {
100+ return root->GetChildren ().back ();
101+ }
102+ }
103+ return nullptr ;
104+ }
105+
106+
30107LuaTypeFormat::LuaTypeFormat (std::shared_ptr<LuaParser> luaParser, LuaCodeStyleOptions& options,
31108 LuaTypeFormatOptions& typeOptions)
32109 : _parser(luaParser),
@@ -49,9 +126,9 @@ bool LuaTypeFormat::HasFormatResult()
49126 return _hasResult;
50127}
51128
52- LuaTypeFormat::Result& LuaTypeFormat::GetResult ()
129+ std::vector< LuaTypeFormat::Result> & LuaTypeFormat::GetResult ()
53130{
54- return _result ;
131+ return _results ;
55132}
56133
57134void LuaTypeFormat::AnalysisReturn (int line, int character)
@@ -85,6 +162,10 @@ void LuaTypeFormat::AnalysisReturn(int line, int character)
85162 {
86163 FormatLine (line);
87164 }
165+
166+ if (_typeOptions.fix_indent ) {
167+ FixIndent (line, character);
168+ }
88169}
89170
90171void LuaTypeFormat::CompleteMissToken (int line, int character, LuaError& luaError)
@@ -93,6 +174,7 @@ void LuaTypeFormat::CompleteMissToken(int line, int character, LuaError& luaErro
93174 {
94175 return ;
95176 }
177+ auto & result = _results.emplace_back ();
96178
97179 LuaCodeStyleOptions temp = _options;
98180 temp.insert_final_newline = true ;
@@ -167,11 +249,11 @@ void LuaTypeFormat::CompleteMissToken(int line, int character, LuaError& luaErro
167249 ctx.PrintLine (1 );
168250 ctx.Print (indentString);
169251 ctx.Print (" end" );
170- _result .Text = ctx.GetText ();
171- _result .Range .StartLine = line;
172- _result .Range .StartCharacter = character;
173- _result .Range .EndLine = line;
174- _result .Range .EndCharacter = character;
252+ result .Text = ctx.GetText ();
253+ result .Range .StartLine = line;
254+ result .Range .StartCharacter = character;
255+ result .Range .EndLine = line;
256+ result .Range .EndCharacter = character;
175257 }
176258 else
177259 {
@@ -183,11 +265,11 @@ void LuaTypeFormat::CompleteMissToken(int line, int character, LuaError& luaErro
183265 ctx.Print (indentString);
184266 ctx.Print (" end" );
185267 ctx.PrintLine (1 );
186- _result .Text = ctx.GetText ();
187- _result .Range .StartLine = line + 1 ;
188- _result .Range .StartCharacter = 0 ;
189- _result .Range .EndLine = line + 1 ;
190- _result .Range .EndCharacter = 0 ;
268+ result .Text = ctx.GetText ();
269+ result .Range .StartLine = line + 1 ;
270+ result .Range .StartCharacter = 0 ;
271+ result .Range .EndLine = line + 1 ;
272+ result .Range .EndCharacter = 0 ;
191273 }
192274 break ;
193275 }
@@ -215,11 +297,12 @@ void LuaTypeFormat::FormatLine(int line)
215297 LuaFormatter formatter (_parser, temp);
216298 formatter.BuildFormattedElement ();
217299
218- _result.Range .StartLine = line - 1 ;
219- _result.Range .StartCharacter = 0 ;
220- _result.Range .EndLine = line - 1 ;
221- _result.Range .EndCharacter = 0 ;
222- auto formatText = formatter.GetRangeFormattedText (_result.Range );
300+ auto & result = _results.emplace_back ();
301+ result.Range .StartLine = line - 1 ;
302+ result.Range .StartCharacter = 0 ;
303+ result.Range .EndLine = line - 1 ;
304+ result.Range .EndCharacter = 0 ;
305+ auto formatText = formatter.GetRangeFormattedText (result.Range );
223306 while (!formatText.empty ())
224307 {
225308 char ch = formatText.back ();
@@ -236,7 +319,73 @@ void LuaTypeFormat::FormatLine(int line)
236319 {
237320 formatText.push_back (' \n ' );
238321 }
239- _result .Text = formatText;
240- _result .Range .EndLine ++;
322+ result .Text = formatText;
323+ result .Range .EndLine ++;
241324 _hasResult = true ;
242325}
326+
327+ void LuaTypeFormat::FixIndent (int line, int character)
328+ {
329+ // FixEndIndent(line, character);
330+
331+ // auto root = _parser->GetAst();
332+ // auto astNode = FindAstNodeBeforePosition(root, offset);
333+ // if (!astNode)
334+ // {
335+ // return;
336+ // }
337+
338+ // auto block = astNode->GetParent();
339+ // if (block && block->GetType() == LuaAstNodeType::Block)
340+ // {
341+ // auto statement = block->GetParent();
342+ // if(statement->is)
343+ //
344+ //
345+ // }
346+
347+
348+ }
349+
350+ void LuaTypeFormat::FixEndIndent (int line, int character)
351+ {
352+ auto luaFile = _parser->GetLuaFile ();
353+ auto offset = luaFile->GetOffsetFromPosition (line, character);
354+
355+ auto & tokens = _parser->GetTokenParser ()->GetTokens ();
356+ auto tokenIndex = FindTokenIndexAfterPosition (tokens, offset);
357+ if (tokenIndex == -1 )
358+ {
359+ return ;
360+ }
361+
362+ auto token = tokens[tokenIndex];
363+ if (token.TokenType == TK_END && luaFile->GetLine (token.Range .StartOffset ) == line)
364+ {
365+ _hasResult = true ;
366+ auto indentString = luaFile->GetIndentString (token.Range .StartOffset );
367+ {
368+ auto & result = _results.emplace_back ();
369+ SerializeContext ctx1 (_parser, _options);
370+ ctx1.Print (indentString);
371+ ctx1.PrintIndent (4 , _options.indent_style );
372+ result.Text = ctx1.GetText ();
373+ result.Range .StartLine = line;
374+ result.Range .StartCharacter = character;
375+ result.Range .EndLine = line;
376+ result.Range .EndCharacter = character;
377+ }
378+ {
379+ SerializeContext ctx2 (_parser, _options);
380+ auto & result = _results.emplace_back ();
381+ ctx2.PrintLine (1 );
382+ ctx2.Print (indentString);
383+ ctx2.Print (" e" );
384+ result.Text = ctx2.GetText ();
385+ result.Range .StartLine = luaFile->GetLine (token.Range .StartOffset );
386+ result.Range .StartCharacter = luaFile->GetColumn (token.Range .StartOffset );
387+ result.Range .EndLine = result.Range .StartLine ;
388+ result.Range .EndCharacter = result.Range .StartCharacter + 1 ;
389+ }
390+ }
391+ }
0 commit comments