On Wed, Feb 18, 2015 at 8:22 PM, Dmitry Stogov <dmi...@zend.com> wrote:
> I think the AST API shouldn't use "public" properties. > Using it, we will have to construct the whole tree of objects, duplicating > information from AST. > I would propose SimpleXML approach instead - construct object only for > node(s) we currently access. > > So at first we will construct just single object referring to AST root. > Then traversing it we will create and destroy objects for necessary nodes. > > To access children I would propose to implementing ArrayAccess interface. > > > $ast = \php\ast\parse($string); > foreach ($ast as $child) { > echo "\t" . $child->getKindName() . "\n"; > foreach ($child as $grandchild) { > echo "\t" . $child->getKindName() . "\n"; > > } > } > > Thanks. Dmitry. > I've considered using this approach, but decided against it because it introduces a lot of "magic" for unclear gains. Lazily creating the objects means we have to keep around the entire AST arena while at least one node referencing it is alive. So if you're analyzing a large project with a few thousand files and keep around a few nodes in some cases, you end up not just with the memory usage of those nodes, but with the memory usage of the entire ASTs. Furthermore in many cases you'll just traverse the entire AST, in which case you'll need to instantiate all nodes anyway and the lazy instantiation will only hurt. In any case, performance of constructing a full AST is pretty good - I don't remember the exact numbers, but ast\parse_code() is only slightly slower than doing token_get_all() on the same code. Nikita