| 2737 | } |
| 2738 | |
| 2739 | void BfModule::UpdateSrcPos(BfAstNode* astNode, BfSrcPosFlags flags, int debugLocOffset) |
| 2740 | { |
| 2741 | // We set force to true when we MUST get the line position set (for navigation purposes, for example) |
| 2742 | if (((mBfIRBuilder->mIgnoreWrites)) && ((flags & BfSrcPosFlag_Force) == 0)) |
| 2743 | return; |
| 2744 | |
| 2745 | BF_ASSERT((!mAwaitingInitFinish) || (mBfIRBuilder->mIgnoreWrites)); |
| 2746 | |
| 2747 | if (astNode == NULL) |
| 2748 | return; |
| 2749 | |
| 2750 | auto bfParser = astNode->GetSourceData()->ToParserData(); |
| 2751 | if (bfParser == NULL) |
| 2752 | return; |
| 2753 | if ((mCurFilePosition.mFileInstance == NULL) || (mCurFilePosition.mFileInstance->mParser != bfParser)) |
| 2754 | { |
| 2755 | if (mCurFilePosition.mFileInstance != NULL) |
| 2756 | { |
| 2757 | BF_ASSERT(mFileInstanceMap.GetCount() != 0); |
| 2758 | mCurFilePosition.mFileInstance->mPrevPosition = mCurFilePosition; |
| 2759 | } |
| 2760 | |
| 2761 | auto bfFileInstance = GetFileFromNode(astNode); |
| 2762 | if (bfFileInstance->mPrevPosition.mFileInstance != NULL) |
| 2763 | { |
| 2764 | mCurFilePosition = bfFileInstance->mPrevPosition; |
| 2765 | } |
| 2766 | else |
| 2767 | { |
| 2768 | mCurFilePosition.mFileInstance = bfFileInstance; |
| 2769 | mCurFilePosition.mCurLine = 0; |
| 2770 | mCurFilePosition.mCurColumn = 0; |
| 2771 | mCurFilePosition.mCurSrcPos = 0; |
| 2772 | } |
| 2773 | } |
| 2774 | |
| 2775 | int srcPos = astNode->GetSrcStart() + debugLocOffset; |
| 2776 | |
| 2777 | BF_ASSERT(srcPos < bfParser->mSrcLength); |
| 2778 | |
| 2779 | auto* jumpEntry = bfParser->mJumpTable + (srcPos / PARSER_JUMPTABLE_DIVIDE); |
| 2780 | if (jumpEntry->mCharIdx > srcPos) |
| 2781 | jumpEntry--; |
| 2782 | mCurFilePosition.mCurLine = jumpEntry->mLineNum; |
| 2783 | mCurFilePosition.mCurSrcPos = jumpEntry->mCharIdx; |
| 2784 | mCurFilePosition.mCurColumn = 0; |
| 2785 | |
| 2786 | while (mCurFilePosition.mCurSrcPos < srcPos) |
| 2787 | { |
| 2788 | if (bfParser->mSrc[mCurFilePosition.mCurSrcPos] == '\n') |
| 2789 | { |
| 2790 | mCurFilePosition.mCurLine++; |
| 2791 | mCurFilePosition.mCurColumn = 0; |
| 2792 | } |
| 2793 | else |
| 2794 | { |
| 2795 | mCurFilePosition.mCurColumn++; |
| 2796 | } |
no test coverage detected