| 1585 | } |
| 1586 | |
| 1587 | BfError* BfPassInstance::FailAt(const StringImpl& error, BfSourceData* bfSource, int srcIdx, int srcLen, BfFailFlags flags) |
| 1588 | { |
| 1589 | BP_ZONE("BfPassInstance::FailAt"); |
| 1590 | |
| 1591 | mLastWasAdded = false; |
| 1592 | mFailedIdx++; |
| 1593 | if ((int) mErrors.size() >= sMaxErrors) |
| 1594 | return NULL; |
| 1595 | |
| 1596 | if (!WantsRangeRecorded(bfSource, srcIdx, srcLen, false)) |
| 1597 | return NULL; |
| 1598 | |
| 1599 | TrimSourceRange(bfSource, srcIdx, srcLen); |
| 1600 | |
| 1601 | BfError* errorVal = new BfError(); |
| 1602 | errorVal->mIsWarning = false; |
| 1603 | errorVal->SetSource(this, bfSource); |
| 1604 | errorVal->mIsAfter = false; |
| 1605 | errorVal->mError = error; |
| 1606 | errorVal->mSrcStart = srcIdx; |
| 1607 | errorVal->mSrcEnd = srcIdx + srcLen; |
| 1608 | //int checkEnd = srcIdx + srcLen; |
| 1609 | for (int i = srcIdx; i < srcIdx + srcLen; i++) |
| 1610 | { |
| 1611 | char c = bfSource->mSrc[i]; |
| 1612 | if ((c == '\r') || (c == '\n')) |
| 1613 | break; |
| 1614 | errorVal->mSrcEnd = i + 1; |
| 1615 | } |
| 1616 | //errorVal->mSrcEnd = srcIdx + srcLen; |
| 1617 | FixSrcStartAndEnd(bfSource, errorVal->mSrcStart, errorVal->mSrcEnd); |
| 1618 | mErrorSet.Add(BfErrorEntry(errorVal)); |
| 1619 | mErrors.push_back(errorVal); |
| 1620 | mLastWasAdded = true; |
| 1621 | |
| 1622 | mLastWasDisplayed = WantsRangeDisplayed(bfSource, srcIdx, srcLen, false); |
| 1623 | if (mLastWasDisplayed) |
| 1624 | { |
| 1625 | String errorStart = "ERROR"; |
| 1626 | /*if ((int)mErrors.size() > 1) |
| 1627 | errorStart += StrFormat(" #%d", mErrors.size());*/ |
| 1628 | MessageAt(":error", errorStart + ": " + error, bfSource, srcIdx, srcLen, flags); |
| 1629 | } |
| 1630 | return errorVal; |
| 1631 | } |
| 1632 | |
| 1633 | void BfPassInstance::FixSrcStartAndEnd(BfSourceData* bfSource, int& startIdx, int& endIdx) |
| 1634 | { |
no test coverage detected