Have a look at Neovim with its Tree-Sitter parser, it enables such 'growing selections' natively.
It's also relatively easy to write plugins based on the parsed AST. I wrote treesitter-unit[1] making it easy to select/modify the subtree of the selection.