11#include " CodeService/RangeFormat/RangeFormatBuilder.h"
2+ #include " CodeService/Format/Analyzer/FormatDocAnalyze.h"
23#include " LuaParser/Lexer/LuaTokenTypeDetail.h"
34
45RangeFormatBuilder::RangeFormatBuilder (LuaStyle &style, FormatRange &range)
5- : FormatBuilder(style), _validRange(false ), _range(range) {
6-
6+ : FormatBuilder(style), _validRange(Valid::Init), _range(range) {
77}
88
99std::string RangeFormatBuilder::GetFormatResult (const LuaSyntaxTree &t) {
1010 _state.Analyze (t);
11- auto root = t.GetRootNode ();
12- std::vector<LuaSyntaxNode> startNodes;
13- for (auto child: root.GetChildren (t)) {
14- auto childEndLine = child.GetEndLine (t);
15- if (childEndLine >= _range.StartLine ) {
16- startNodes.push_back (child);
17- }
18- if (childEndLine > _range.EndLine ) {
19- break ;
11+
12+ auto formatDoc = _state.GetAnalyzer <FormatDocAnalyze>();
13+ if (formatDoc) {
14+ auto ignores = formatDoc->GetIgnores ();
15+ for (auto &ignore: ignores) {
16+ auto ignoreStartLine = LuaSyntaxNode (ignore.StartIndex ).GetStartLine (t);
17+ auto ignoreEndLine = LuaSyntaxNode (ignore.EndIndex ).GetEndLine (t);
18+ if ((_range.StartLine >= ignoreStartLine && _range.StartLine <= ignoreEndLine) || (_range.EndLine >= ignoreStartLine && _range.StartLine < ignoreStartLine)) {
19+ return " " ;
20+ }
2021 }
2122 }
2223
23- LuaSyntaxNode n ;
24- _state. AddRelativeIndent (n, 0 ) ;
24+ auto root = t. GetRootNode () ;
25+ std::vector<LuaSyntaxNode> startNodes = {root} ;
2526
26- _state.DfsForeach (startNodes, t, [this ](LuaSyntaxNode &syntaxNode,
27- const LuaSyntaxTree &t,
28- FormatResolve &resolve) {
29- CheckRange (syntaxNode, t);
27+ _state.DfsForeach (startNodes, t, [this ](LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t, FormatResolve &resolve) {
28+ CheckRange (syntaxNode, t, resolve);
3029 DoResolve (syntaxNode, t, resolve);
3130 });
3231
33- _validRange = true ;
32+ _validRange = Valid::Process ;
3433 DealEndWithNewLine (true );
3534 return _formattedText;
3635}
@@ -40,7 +39,7 @@ FormatRange RangeFormatBuilder::GetReplaceRange() const {
4039}
4140
4241void RangeFormatBuilder::WriteSyntaxNode (LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t) {
43- if (_validRange) {
42+ if (_validRange == Valid::Process ) {
4443 return FormatBuilder::WriteSyntaxNode (syntaxNode, t);
4544 } else {
4645 auto text = syntaxNode.GetText (t);
@@ -60,23 +59,23 @@ void RangeFormatBuilder::WriteSyntaxNode(LuaSyntaxNode &syntaxNode, const LuaSyn
6059}
6160
6261void RangeFormatBuilder::WriteSpace (std::size_t space) {
63- if (_validRange) {
62+ if (_validRange == Valid::Process ) {
6463 return FormatBuilder::WriteSpace (space);
6564 } else {
6665 _state.CurrentWidth () += space;
6766 }
6867}
6968
7069void RangeFormatBuilder::WriteLine (std::size_t line) {
71- if (_validRange) {
70+ if (_validRange == Valid::Process ) {
7271 return FormatBuilder::WriteLine (line);
7372 } else {
7473 _state.CurrentWidth () = 0 ;
7574 }
7675}
7776
7877void RangeFormatBuilder::WriteIndent () {
79- if (_validRange) {
78+ if (_validRange == Valid::Process ) {
8079 return FormatBuilder::WriteIndent ();
8180 } else {
8281 auto topLevelIndent = _state.GetCurrentIndent ();
@@ -85,25 +84,23 @@ void RangeFormatBuilder::WriteIndent() {
8584}
8685
8786void RangeFormatBuilder::WriteChar (char ch) {
88- if (_validRange) {
87+ if (_validRange == Valid::Process ) {
8988 return FormatBuilder::WriteChar (ch);
9089 } else {
9190 _state.CurrentWidth ()++;
9291 }
9392}
9493
9594void RangeFormatBuilder::WriteText (std::string_view text) {
96- if (_validRange) {
95+ if (_validRange == Valid::Process ) {
9796 return FormatBuilder::WriteText (text);
9897 } else {
9998 std::size_t last = 0 ;
10099 for (std::size_t i = 0 ; i != text.size (); i++) {
101100 char ch = text[i];
102101 if (ch == ' \n ' || ch == ' \r ' ) {
103102 _state.CurrentWidth () = 0 ;
104- if (ch == ' \r '
105- && (i + 1 < text.size ())
106- && (text[i + 1 ] == ' \n ' )) {
103+ if (ch == ' \r ' && (i + 1 < text.size ()) && (text[i + 1 ] == ' \n ' )) {
107104 i++;
108105 }
109106 last = i + 1 ;
@@ -116,26 +113,46 @@ void RangeFormatBuilder::WriteText(std::string_view text) {
116113 }
117114}
118115
119- void RangeFormatBuilder::CheckRange (LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t) {
116+ void RangeFormatBuilder::CheckRange (LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t, FormatResolve &resolve ) {
120117 if (syntaxNode.IsToken (t)) {
121- auto tokenEndLine = syntaxNode.GetEndLine (t);
122- if (tokenEndLine < _range.StartLine ) {
123- _validRange = false ;
124- return ;
125- }
126- auto tokenStartLine = syntaxNode.GetStartLine (t);
127- if (tokenStartLine > _range.EndLine ) {
128- _validRange = false ;
129- return ;
118+ LuaSyntaxNode startNode = syntaxNode;
119+ LuaSyntaxNode endNode = syntaxNode;
120+ if (resolve.GetTokenStrategy () == TokenStrategy::OriginRange) {
121+ auto r = resolve.GetOriginRange ();
122+ startNode = LuaSyntaxNode (r.StartIndex );
123+ endNode = LuaSyntaxNode (r.EndIndex );
130124 }
131125
132- if (tokenStartLine < _range.StartLine ) {
133- _range.StartLine = tokenStartLine;
134- _range.StartCol = syntaxNode.GetStartCol (t);
135- }
136- if (tokenEndLine > _range.EndLine ) {
137- _range.EndLine = tokenEndLine;
126+ switch (_validRange) {
127+ case Valid::Init: {
128+ auto tokenEndLine = endNode.GetEndLine (t);
129+ if (tokenEndLine >= _range.StartLine ) {
130+ _validRange = Valid::Process;
131+ auto tokenStartLine = startNode.GetStartLine (t);
132+ if (tokenStartLine < _range.StartLine ) {
133+ _range.StartLine = tokenStartLine;
134+ _range.StartCol = startNode.GetStartCol (t);
135+ }
136+ }
137+ break ;
138+ }
139+ case Valid::Process: {
140+ auto tokenStartLine = startNode.GetStartLine (t);
141+ if (tokenStartLine > _range.EndLine ) {
142+ _validRange = Valid::Finish;
143+ _state.StopDfsForeach ();
144+ } else {
145+ auto tokenEndLine = endNode.GetEndLine (t);
146+ if (tokenEndLine > _range.EndLine ) {
147+ _range.EndLine = tokenEndLine;
148+ }
149+ }
150+
151+ break ;
152+ }
153+ default : {
154+ break ;
155+ }
138156 }
139- _validRange = true ;
140157 }
141158}
0 commit comments