On Jan 30, 10:49 am, wolffiex <[email protected]> wrote:
> Hi list,
> I've been a happy Rhino user for a long time, but I'm looking at
> getting deeper into it, in order to add this feature to my app: Given
> the string source of a function, I'd like to get a list of all the
> closed-over variables within it. So, for instance:
>
> myNewApi.getFreeVariables("function(a){ var b = 2; return a+b+c
> +d; }");
>
> would return the list of "c" and "d".
>
> I've poked around the source for 1.7R2 but I didn't see any javadoc
> that would suggest how to do this. Even a pointer in the right
> direction would be very helpful.
>
> Thanks!
> A

Ok solved. I've pasted example code below. Now a follow up question:
is Parser.parse thread safe, or do I need a new instance for each
thread?

   public ScriptableObject getFreeVariables(String f){
        ScriptOrFnNode firstFunction = null;
        try{
            ScriptOrFnNode node = parser.parse(f, "free variable
getter", 0);
            firstFunction = node.getFunctionNode(0);
        }catch (Exception e){
            logger.error("Can't find function in " + f);
        }
        ScriptableObject jsSet = makeJSObject();
        if (firstFunction != null){
            Set<String> varNames = new HashSet<String>();
            addVarNames(firstFunction, varNames);
            final Map<String,? extends Object> symbolTable =
firstFunction.getSymbolTable();
            if (symbolTable != null)
varNames.removeAll(symbolTable.keySet());
            for (String varName : varNames){
                jsSet.put(varName, jsSet, true);
            }
        }
        return jsSet;
    }

    private void addVarNames(final Node fn, final Set<String> vars) {
        if (fn.getType() == Token.NAME) {
            vars.add(fn.getString());
        }

        if (fn.hasChildren()){
            Node p = fn.getFirstChild();
            do{
                addVarNames(p, vars);
                p = p.getNext();
            }while(p!=null);

        }

    }
_______________________________________________
dev-tech-js-engine-rhino mailing list
[email protected]
https://lists.mozilla.org/listinfo/dev-tech-js-engine-rhino

Reply via email to