grappa icon indicating copy to clipboard operation
grappa copied to clipboard

NullPointerException when adding an element to a collection inside rule method

Open ghost opened this issue 11 years ago • 1 comments

When adding an element to a collection inside a method that creates a rule, a NullPointerException occurs during "createParser".

Example:

package test;

import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.parboiled.Parboiled;
import org.parboiled.Rule;
import org.parboiled.support.Var;

import com.github.parboiled1.grappa.parsers.EventBusParser;

public class NpeOnMap {

    public static void main(String[] args) {
        TestParser parser = Parboiled.createParser(TestParser.class);
    }

    public static class TestParser extends EventBusParser<String> {

        Rule relativity() {
            final Map<String, String> map = new LinkedHashMap<>();
//          map.put("x", "y"); // NPE
            final List<String> list = new LinkedList<>();
//          list.add("x"); // NPE
            Var<String> m = new Var<>();
            return sequence("a", m.set(match()));
//          return sequence("a", "b"); // No NPE in any case
        }

    }

}

The NPE only occurs when using "match()" inside the returned rule. If no "match()" is used, then any other code works fine.

StackTrace:

Exception in thread "main" java.lang.RuntimeException: Error creating extended parser class: null
    at org.parboiled.Parboiled.createParser(Parboiled.java:75)
    at test.NpeOnMap.main(NpeOnMap.java:17)
Caused by: java.lang.NullPointerException
    at org.parboiled.transform.process.ImplicitActionsConverter.getDependents(ImplicitActionsConverter.java:180)
    at org.parboiled.transform.process.ImplicitActionsConverter.isImplicitAction(ImplicitActionsConverter.java:110)
    at org.parboiled.transform.process.ImplicitActionsConverter.walkNode(ImplicitActionsConverter.java:83)
    at org.parboiled.transform.process.ImplicitActionsConverter.walkNode(ImplicitActionsConverter.java:92)
    at org.parboiled.transform.process.ImplicitActionsConverter.walkNode(ImplicitActionsConverter.java:92)
    at org.parboiled.transform.process.ImplicitActionsConverter.process(ImplicitActionsConverter.java:73)
    at org.parboiled.transform.ParserTransformer.runMethodTransformers(ParserTransformer.java:122)
    at org.parboiled.transform.ParserTransformer.extendParserClass(ParserTransformer.java:98)
    at org.parboiled.transform.ParserTransformer.transformParser(ParserTransformer.java:66)
    at org.parboiled.Parboiled.createParser(Parboiled.java:67)
    ... 1 more

ghost avatar Feb 05 '15 09:02 ghost

This is due to an incorrect gathering of arguments when building the rule.

Fixing that will be quite a chore to do... Delaying to 2.2.

fge avatar May 15 '15 09:05 fge