Finds in @p str the position of @p parens[0] or @p parens[2] starting from @p pos at the top level. @return the position of the found symbol or str.size() if not found. @param parens see ParamIterator().
| 296 | /// @return the position of the found symbol or str.size() if not found. |
| 297 | /// @param parens see ParamIterator(). |
| 298 | int findOpeningBracketOrEnd(QStringView parens, QStringView str, int pos) |
| 299 | { |
| 300 | Q_ASSERT(pos >= 0 && pos <= str.size()); |
| 301 | |
| 302 | Q_ASSERT(parens.size() == 2 || parens.size() == 3); |
| 303 | |
| 304 | Q_ASSERT(QStringView(u"<([{").contains(parens[0])); |
| 305 | Q_ASSERT(parens.first(2) == u"<>" || parens[1] == fittingClosingNonAngleBracket(parens[0])); |
| 306 | |
| 307 | Q_ASSERT(parens.size() == 2 || !QStringView(u"<>()[]{}").contains(parens[2])); |
| 308 | |
| 309 | for (; pos < str.size(); ++pos) { |
| 310 | switch (str[pos].unicode()) { |
| 311 | // Take into account brackets of all types to skip searched-for symbols within them (i.e. not at the top level). |
| 312 | case '<': |
| 313 | if (!isOperator(str, pos)) { |
| 314 | if (str[pos] == parens[0]) { |
| 315 | return pos; |
| 316 | } |
| 317 | pos = findClosingAngleBracket(str, pos); |
| 318 | } |
| 319 | break; |
| 320 | case '(': |
| 321 | case '[': |
| 322 | case '{': |
| 323 | if (str[pos] == parens[0]) { |
| 324 | return pos; |
| 325 | } |
| 326 | pos = findClosingNonAngleBracket(str, pos); |
| 327 | break; |
| 328 | default: |
| 329 | if (parens.size() > 2 && str[pos] == parens[2]) { |
| 330 | return pos; |
| 331 | } |
| 332 | pos = trySkipStringOrCharLiteralOrComment(str, pos); |
| 333 | } |
| 334 | } |
| 335 | |
| 336 | return str.size(); |
| 337 | } |
| 338 | } // unnamed namespace |
| 339 | |
| 340 | int findCommaOrEnd(QStringView str, int pos, QChar validEnd) |
no test coverage detected