Pre means the children are visited before the parent and post means the
parent is visited before it's children.

Yeah I guessed on the method name of the traverse method. :) (I couldn't
remember, I'm not looking at the code.)

In our case it did really matter because I only wanted SCRIPT children.

More complex linters and things need to have the option which order because
it would allow a break in logic when things are encountered a certain way.

Mike

On Thu, Jul 9, 2015 at 12:49 PM, Frédéric THOMAS <[email protected]>
wrote:

> > You could have just implemented Callback with process() and created your
> > won constructor if that makes it more clear, it wasn't neccessary to
> > subclass but, it was there so, ya know. :)
>
> I got that and that wasn't a problem.
>
> > The base class why my design and for all the passes I did, I needed the
> > callbacks. See NodeTraversal.travese() I think it is, that is what
> actually
> > calls the callbacks and shouldTravese(), it's in the GCC API.
>
> Actually, process() calls:
> NodeTraversal.traverseRoots(compiler, this, externs, root);
>
> Which in turn calls:
>       traverseBranch(externs, scopeRoot);
>       Preconditions.checkState(root.getParent() == scopeRoot);
>       traverseBranch(root, scopeRoot);
>
> I was asking, why should it traverse the most out of external scoped node
> of the root and the root itself ?
>
> traverseBranch then call shouldTravese() which may call visit but the doc
> says:
>
> /**
>  * Callback for tree-based traversals
>  */
> public interface Callback {
>   /**
>    * Visits a node in pre order (before visiting its children) and decides
>    * whether this node's children should be traversed. If children are
>    * traversed, they will be visited by
>    * {@link #visit(NodeTraversal, Node, Node)} in postorder.<BR>
>    * Implementations can have side effects (e.g. modifying the parse
>    * tree).<BR>
>    * @return whether the children of this node should be visited
>    */
>   boolean shouldTraverse(NodeTraversal nodeTraversal, Node n, Node parent);
>
>   /**
>    * Visits a node in postorder (after its children have been visited).
>    * A node is visited only if all its parents should be traversed
>    * ({@link #shouldTraverse(NodeTraversal, Node, Node)}).<BR>
>    * Implementations can have side effects (e.g. modifying the parse
>    * tree).<BR>
>    */
>   void visit(NodeTraversal t, Node n, Node parent);
>
> It is where I didn't get the pre / post orders, if shouldTraverse()
> returns true, the visit() children is called which if fine too me but in
> the doc of visit() they talk about postorder (and I'm lost here): A node is
> visited only if all its parents should be traversed, does it mean it will
> traverse all the parents ? or "all its parents should have been already
> traversed" ?
>
> I'm confused, can you explain ?
>
> > JFlex is used to create the RawASDocTokenizer. So yes, if a grammar was
> > created for asdoc parsing in antlr, we could get rid of JFlex dependency
> > because I think that is the only place it's used.
>
> Good to know !-)
>
> Thanks,
> Frédéric THOMAS
>
>
> ----------------------------------------
> > Date: Thu, 9 Jul 2015 12:17:04 -0400
> > Subject: Re: [FalconJX] Collection Imports branch
> > From: [email protected]
> > To: [email protected]
> >
> > On Thu, Jul 9, 2015 at 12:01 PM, Frédéric THOMAS <
> [email protected]>
> > wrote:
> >
> >>> You're not traversing anything, it just happens that the base class is
> >>> abstract and defines callbacks for recursion. In your case you just
> want
> >> a
> >>> "processing" compiler pass.
> >>>
> >>> A plain old compiler pass wouldn't require visiting all nodes, just a
> >>> process().
> >>>
> >>> Don't worry about it, the two you overrode are just stubs.
> >>
> >> Well, I got I did an override :-) I just was trying to understand the
> base
> >> classes.
> >>
> >
> >
> > The base class why my design and for all the passes I did, I needed the
> > callbacks. See NodeTraversal.travese() I think it is, that is what
> actually
> > calls the callbacks and shouldTravese(), it's in the GCC API.
> >
> > You could have just implemented Callback with process() and created your
> > won constructor if that makes it more clear, it wasn't neccessary to
> > subclass but, it was there so, ya know. :)
> >
> >
> >
> >>
> >> Anyway, thanks again Mike for your explanations !
> >>
> >> I will now go back on Falcon starting from the beginning trying to
> >> understand the scan / parse phase, even if I understand approximatively
> how
> >> theoretically it should work, it seems a huge thing to me in there, I
> see
> >> JFlex, ANTLR, btw I thought it was possible to do the scan / parse with
> >> ANTLR only, am I wrong ? if not why are we using JFlex too ?
> >>
> >
> >
> > JFlex is used to create the RawASDocTokenizer. So yes, if a grammar was
> > created for asdoc parsing in antlr, we could get rid of JFlex dependency
> > because I think that is the only place it's used.
> >
> > Mike
> >
> >
> >
> >>
> >> I will try to experiment, even with ANTLR4.x
> >>
> >> Frédéric THOMAS
> >>
> >>
> >> ----------------------------------------
> >>> Date: Thu, 9 Jul 2015 11:25:09 -0400
> >>> Subject: Re: [FalconJX] Collection Imports branch
> >>> From: [email protected]
> >>> To: [email protected]
> >>>
> >>> You're not traversing anything, it just happens that the base class is
> >>> abstract and defines callbacks for recursion. In your case you just
> want
> >> a
> >>> "processing" compiler pass.
> >>>
> >>> A plain old compiler pass wouldn't require visiting all nodes, just a
> >>> process().
> >>>
> >>> Don't worry about it, the two you overrode are just stubs.
> >>>
> >>> Mike
> >>>
> >>> On Thu, Jul 9, 2015 at 11:13 AM, Frédéric THOMAS <
> >> [email protected]>
> >>> wrote:
> >>>
> >>>>> Other than that, merge/commit it man! thanks, looks good to me, we
> will
> >>>> see
> >>>>> if anything else comes up.
> >>>>
> >>>> Thanks, done !
> >>>>
> >>>> But I'm still confuse with the pattern:
> >>>>
> >>>> I didn't get well this thing about pre / post order in the Callback
> >>>> interface maybe I didn't get what it means, isn't supposed to be
> >> recursive
> >>>> descendant only, how does it work ?
> >>>> I used process() which traverseRoots of both externs (the most out of
> >>>> parent) and the given node, why 2 nodes have to be traversed in the
> same
> >>>> function ?
> >>>>
> >>>> Frédéric THOMAS
> >>>>
> >>>>
> >>>> ----------------------------------------
> >>>>> Date: Wed, 8 Jul 2015 16:46:34 -0400
> >>>>> Subject: [FalconJX] Collection Imports branch
> >>>>> From: [email protected]
> >>>>> To: [email protected]
> >>>>>
> >>>>> Hey Fred,
> >>>>>
> >>>>> Couple things;
> >>>>>
> >>>>> 1. CollectImportsPass
> >>>>>
> >>>>> Should probably be; (process() only gets called once)
> >>>>>
> >>>>> @Override
> >>>>> public void process(Node externs, Node root)
> >>>>> {
> >>>>> for (ClassReference reference : model.getClasses())
> >>>>> {
> >>>>> collectClassImports(reference);
> >>>>> }
> >>>>>
> >>>>> for (FunctionReference reference : model.getFunctions())
> >>>>> {
> >>>>> collectFunctionImports(reference);
> >>>>> }
> >>>>> }
> >>>>>
> >>>>> @Override
> >>>>> public boolean shouldTraverse(final NodeTraversal nodeTraversal,
> final
> >>>>> Node n, final Node parent)
> >>>>> {
> >>>>> return false;
> >>>>> }
> >>>>>
> >>>>> @Override
> >>>>> public void visit(final NodeTraversal t, final Node n, final Node
> >>>>> parent)
> >>>>> {
> >>>>> }
> >>>>>
> >>>>>
> >>>>> Other than that, merge/commit it man! thanks, looks good to me, we
> will
> >>>> see
> >>>>> if anything else comes up.
> >>>>>
> >>>>> Mike
> >>>>
> >>>>
> >>
> >>
>
>

Reply via email to