> 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.
My lack of experience in it doesn't help to figure it out but I will try to keep that in mind in case I will encounter this case :-) Thanks again !! Frédéric THOMAS ---------------------------------------- > Date: Thu, 9 Jul 2015 12:57:06 -0400 > Subject: Re: [FalconJX] Collection Imports branch > From: [email protected] > To: [email protected] > > 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 >>>>>> >>>>>> >>>> >>>> >> >>
