@NotNull public LogicalPosition hostToInjected(@NotNull LogicalPosition hPos) { assert isValid(); DocumentEx hostDocument = myDelegate.getDocument(); int hLineEndOffset = hPos.line >= hostDocument.getLineCount() ? hostDocument.getTextLength() : hostDocument.getLineEndOffset(hPos.line); LogicalPosition hLineEndPos = myDelegate.offsetToLogicalPosition(hLineEndOffset); if (hLineEndPos.column < hPos.column) { // in virtual space LogicalPosition iPos = myDocumentWindow.hostToInjectedInVirtualSpace(hPos); if (iPos != null) { return iPos; } } int hOffset = myDelegate.logicalPositionToOffset(hPos); int iOffset = myDocumentWindow.hostToInjected(hOffset); return offsetToLogicalPosition(iOffset); }
@NotNull public LogicalPosition injectedToHost(@NotNull LogicalPosition pos) { assert isValid(); // beware the virtual space int column = pos.column; int lineStartOffset = myDocumentWindow.getLineStartOffset(pos.line); int lineEndOffset = myDocumentWindow.getLineEndOffset(pos.line); if (column > lineEndOffset - lineStartOffset) { // in virtual space, calculate the host pos as an offset from the line end int delta = column - (lineEndOffset - lineStartOffset); int baseOffsetInHost = myDocumentWindow.injectedToHost(lineEndOffset); LogicalPosition lineStartPosInHost = myDelegate.offsetToLogicalPosition(baseOffsetInHost); return new LogicalPosition(lineStartPosInHost.line, lineStartPosInHost.column + delta); } else { int offset = lineStartOffset + column; int hostOffset = getDocument().injectedToHost(offset); int hostLineNumber = getDocument().getDelegate().getLineNumber(hostOffset); int hostLineStart = getDocument().getDelegate().getLineStartOffset(hostLineNumber); return new LogicalPosition(hostLineNumber, hostOffset - hostLineStart); } }