Add support for syntactic classification.

Tests pending.
I would probably cache result of `getWidth` since internally it calls `getStart` to compute start position and `getStart` now involves scanning + walk upward to get source file