| 189 | } |
| 190 | |
| 191 | void LineBreakAnalyzer::Query(FormatState &f, LuaSyntaxNode syntaxNode, const LuaSyntaxTree &t, FormatResolve &resolve) { |
| 192 | auto it = _lineBreaks.find(syntaxNode.GetIndex()); |
| 193 | bool collapse = false; |
| 194 | if (it != _lineBreaks.end()) { |
| 195 | collapse = it->second.Strategy == LineBreakStrategy::NotBreak; |
| 196 | } |
| 197 | if (syntaxNode.IsToken(t) && !collapse) { |
| 198 | if (resolve.GetNextSpaceStrategy() == NextSpaceStrategy::None || resolve.GetNextSpaceStrategy() == NextSpaceStrategy::Space) { |
| 199 | auto nextToken = syntaxNode.GetNextToken(t); |
| 200 | if (nextToken.IsToken(t)) { |
| 201 | auto currentLine = syntaxNode.GetEndLine(t); |
| 202 | auto nextLine = nextToken.GetStartLine(t); |
| 203 | // 既然已经打断那就算了 |
| 204 | if (nextLine > currentLine) { |
| 205 | resolve.SetNextLineBreak(LineSpace(nextLine - currentLine)); |
| 206 | } |
| 207 | } |
| 208 | } |
| 209 | } |
| 210 | |
| 211 | // force break |
| 212 | if (it != _lineBreaks.end()) { |
| 213 | auto &lineBreakData = it->second; |
| 214 | switch (lineBreakData.Strategy) { |
| 215 | case LineBreakStrategy::Standard: { |
| 216 | resolve.SetNextLineBreak(lineBreakData.Data.Line); |
| 217 | break; |
| 218 | } |
| 219 | case LineBreakStrategy::WhenMayExceed: { |
| 220 | auto lineWidth = f.CurrentWidth(); |
| 221 | auto &style = f.GetStyle(); |
| 222 | auto relationNode = LuaSyntaxNode(lineBreakData.Data.Index); |
| 223 | auto guessLineWidth = lineWidth + syntaxNode.GetFirstLineWidth(t) + relationNode.GetFirstLineWidth(t); |
| 224 | if (guessLineWidth > style.max_line_length) { |
| 225 | f.Notify(FormatEvent::NodeExceedLinebreak, syntaxNode, t); |
| 226 | resolve.SetNextLineBreak(LineSpace(1, LineBreakReason::ExceedMaxLine)); |
| 227 | } |
| 228 | break; |
| 229 | } |
| 230 | default: { |
| 231 | break; |
| 232 | } |
| 233 | } |
| 234 | } |
| 235 | } |
| 236 | |
| 237 | void LineBreakAnalyzer::BreakAfter(LuaSyntaxNode n, const LuaSyntaxTree &t, std::size_t line) { |
| 238 | auto token = n.GetLastToken(t); |
nothing calls this directly
no test coverage detected