| 141 | } |
| 142 | |
| 143 | void FormatState::DfsForeach(std::vector<LuaSyntaxNode> &startNodes, |
| 144 | const LuaSyntaxTree &t, |
| 145 | const FormatState::FormatHandle &enterHandle) { |
| 146 | _foreachContinue = true; |
| 147 | std::vector<Traverse> traverseStack; |
| 148 | for (auto it = startNodes.rbegin(); it != startNodes.rend(); it++) { |
| 149 | traverseStack.emplace_back(*it, TraverseEvent::Enter); |
| 150 | } |
| 151 | |
| 152 | // 非递归深度优先遍历 |
| 153 | FormatResolve resolve; |
| 154 | while (!traverseStack.empty()) { |
| 155 | Traverse traverse = traverseStack.back(); |
| 156 | resolve.Reset(); |
| 157 | if (traverse.Event == TraverseEvent::Enter) { |
| 158 | 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 | } |
| 168 | auto children = traverse.Node.GetChildren(t); |
| 169 | // 不采用 <range> |
| 170 | for (auto rIt = children.rbegin(); rIt != children.rend(); rIt++) { |
| 171 | traverseStack.emplace_back(*rIt, TraverseEvent::Enter); |
| 172 | } |
| 173 | |
| 174 | if (resolve.GetIndentStrategy() != IndentStrategy::None) { |
| 175 | auto indent = resolve.GetIndent(); |
| 176 | if (indent == 0 && resolve.GetIndentStrategy() != IndentStrategy::Absolute) { |
| 177 | if (_formatStyle.indent_style == IndentStyle::Space) { |
| 178 | indent = _formatStyle.indent_size; |
| 179 | } else { |
| 180 | indent = _formatStyle.tab_width; |
| 181 | } |
| 182 | } |
| 183 | |
| 184 | switch (resolve.GetIndentStrategy()) { |
| 185 | case IndentStrategy::Relative: { |
| 186 | AddRelativeIndent(traverse.Node, indent); |
| 187 | break; |
| 188 | } |
| 189 | case IndentStrategy::InvertRelative: { |
| 190 | AddInvertIndent(traverse.Node, indent); |
| 191 | break; |
| 192 | } |
| 193 | case IndentStrategy::Absolute: { |
| 194 | AddAbsoluteIndent(traverse.Node, indent); |
| 195 | break; |
| 196 | } |
| 197 | case IndentStrategy::Same: { |
| 198 | AddSameIndent(traverse.Node); |
| 199 | break; |
| 200 | } |
no test coverage detected