src/vs/editor/common/cursor/cursorAtomicMoveOperations.ts/AtomicTabMoveOperations/whitespaceVisibleColumn
class AtomicTabMoveOperations:	public static whitespaceVisibleColumn(lineContent: string, position: number, tabSize: number): [number, number, number] {
		const lineLength = lineContent.length;
		let visibleColumn = 0;
		let prevTabStopPosition = -1;
		let prevTabStopVisibleColumn = -1;
		for (let i = 0; i < lineLength; i++) {
			if (i === position) {
				return [prevTabStopPosition, prevTabStopVisibleColumn, visibleColumn];
			}
			if (visibleColumn % tabSize === 0) {
				prevTabStopPosition = i;
				prevTabStopVisibleColumn = visibleColumn;
			}
			const chCode = lineContent.charCodeAt(i);
			switch (chCode) {
				case CharCode.Space:
					visibleColumn += 1;
					break;
				case CharCode.Tab:
					// Skip to the next multiple of tabSize.
					visibleColumn = CursorColumns.nextRenderTabStop(visibleColumn, tabSize);
					break;
				default:
					return [-1, -1, -1];
			}
		}
		if (position === lineLength) {
			return [prevTabStopPosition, prevTabStopVisibleColumn, visibleColumn];
		}
		return [-1, -1, -1];
	}