Excellent testing! You just uncover the edge case that I missed. When the cursor is at the very beginning of the property, CM tokenizer gives us the token of the whitespace before the cursor and not the token on the right of the cursor. So in that case we need to call TokenUtils.moveNextToken() one more time to get the colon.

I also like your suggestion to have the cursor *after* the colon for consistency.