@@ -156,21 +156,20 @@ void FormatState::DfsForeach(std::vector<LuaSyntaxNode> &startNodes,
156156 resolve.Reset ();
157157 if (traverse.Event == TraverseEvent::Enter) {
158158 traverseStack.back ().Event = TraverseEvent::Exit;
159- if (_ignoreRange.EndIndex != 0 ) {
160- auto index = traverse.Node .GetIndex ();
161- if (index >= _ignoreRange.StartIndex && index <= _ignoreRange.EndIndex ) {
162- continue ;
163- }
164- }
165- for (auto &analyzer: _analyzers) {
166- analyzer->Query (*this , traverse.Node , t, resolve);
167- }
159+
160+ // We need to first add all child nodes to the traversal list.
168161 auto children = traverse.Node .GetChildren (t);
169162 // 不采用 <range>
170163 for (auto rIt = children.rbegin (); rIt != children.rend (); rIt++) {
171164 traverseStack.emplace_back (*rIt, TraverseEvent::Enter);
172165 }
173166
167+ // For the code that has already been ignored, we also need to
168+ // analyze it to determine how to indent next.
169+ for (auto &analyzer: _analyzers) {
170+ analyzer->Query (*this , traverse.Node , t, resolve);
171+ }
172+
174173 if (resolve.GetIndentStrategy () != IndentStrategy::None) {
175174 auto indent = resolve.GetIndent ();
176175 if (indent == 0 && resolve.GetIndentStrategy () != IndentStrategy::Absolute) {
@@ -204,6 +203,16 @@ void FormatState::DfsForeach(std::vector<LuaSyntaxNode> &startNodes,
204203 }
205204 }
206205
206+ // Skip the nodes that need to be ignored. Since the range of ignoring starts
207+ // from the @format node, we need to execute enterHandle once when entering
208+ // the ignore range to output all the ignored content.
209+ if (_ignoreRange.EndIndex != 0 ) {
210+ auto index = traverse.Node .GetIndex ();
211+ if (index > _ignoreRange.StartIndex && index <= _ignoreRange.EndIndex ) {
212+ continue ;
213+ }
214+ }
215+
207216 enterHandle (traverse.Node , t, resolve);
208217 if (!_foreachContinue) {
209218 return ;
0 commit comments