php-parser icon indicating copy to clipboard operation
php-parser copied to clipboard

[feature] implement a visitor & filter helper

Open ichiriac opened this issue 7 years ago • 2 comments

implement a visitor helper in order to handle AST transversal :

const ast = parser.parse('...some code...');

// visiting child nodes :
ast.visit(function(node) {
  // do something
});

// filtering a list of nodes
const nodes = ast.filter(function(node) {
  return node.kind === 'something';
});

NOTE : this is implemented on each node, can be used on program node as in the example, or on any other node

ichiriac avatar Oct 07 '18 15:10 ichiriac

Is anything happening with this? I'm trying to get a complete traversable AST but from the types and documentation, I cannot tell how basic traversing is supposed to be achieved. I am very interested in using this package but am having trouble getting started. Any help would be appreciated.

Does anyone have a demo of basic tree traversal? I can only see as deep as the class declaration. Also, the AST seems to print nicely but is showing no children of my class, and no errors...

cedw032 avatar Jan 20 '21 12:01 cedw032

Hi @cedw032, glad to see your interest for this library.

If you want to see some usage you can check this other project, but it may seem hard to read : https://github.com/glayzzle/php-reflection

You have the documentation here : https://php-parser.glayzzle.com/readme and the structure of nodes is documented here : https://php-parser.glayzzle.com/api/ast.js

The main idea of the visitor is to recursivelly scan each property node, and to launch the visit callback when you find a kind property on an entity.

Here a pseudo example :

function visit(node, parent, cb) {
  cb(node.kind, node, parent);
  for(var k in node) {
    var child = node[k];
    if (typeof child.type === 'string') {
     cb(child.kind, child, node);
    } else if (Array.isArray(child) ... ) {
       ....
    } else if (typeof child === 'object) { 
       ....
    }
  }
}

And the filter is something similar with filtering callback and returns an array of nodes

ichiriac avatar Feb 01 '21 13:02 ichiriac