Hi,
I get the following NPE when using the new serializer to serialize a model constructed by a M2M transformation. The model seems to be correct, i.e. no feature assignment is missing.
java.lang.NullPointerException
at org.eclipse.xtext.serializer.sequencer.AbstractSyntacticSequencer.accept(AbstractSyntacticSequencer.java:104)
at org.eclipse.xtext.serializer.sequencer.AbstractSyntacticSequencer.navigateToAbsorber(AbstractSyntacticSequencer.java:426)
at org.eclipse.xtext.serializer.sequencer.AbstractSyntacticSequencer.navigateToAbsorber(AbstractSyntacticSequencer.java:414)
at org.eclipse.xtext.serializer.sequencer.AbstractSyntacticSequencer.finish(AbstractSyntacticSequencer.java:346)
at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.finish(SequenceFeeder.java:369)
at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:442)
at xxx.cml.serializer.AbstractCmlSemanticSequencer.sequence_WhenUnlessExpression(AbstractCmlSemanticSequencer.java:2308)
at xxx.cml.serializer.AbstractCmlSemanticSequencer.createSequence(AbstractCmlSemanticSequencer.java:1084)
at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptAction(SequenceFeeder.java:292)
at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:95)
at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:403)
at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:439)
at xxx.cml.serializer.AbstractCmlSemanticSequencer.sequence_WhenUnlessExpression(AbstractCmlSemanticSequencer.java:2308)
at xxx.cml.serializer.AbstractCmlSemanticSequencer.createSequence(AbstractCmlSemanticSequencer.java:1084)
at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:299)
at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:325)
at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:215)
at xxx.cml.serializer.AbstractCmlSemanticSequencer.sequence_ConditionalExpression(AbstractCmlSemanticSequencer.java:1174)
at xxx.cml.serializer.AbstractCmlSemanticSequencer.createSequence(AbstractCmlSemanticSequencer.java:257)
at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptAction(SequenceFeeder.java:292)
at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:95)
at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:403)
at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:439)
at xxx.cml.serializer.AbstractCmlSemanticSequencer.sequence_AdditiveExpression(AbstractCmlSemanticSequencer.java:1097)
at xxx.cml.serializer.AbstractCmlSemanticSequencer.createSequence(AbstractCmlSemanticSequencer.java:125)
at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:299)
at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:325)
at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:222)
at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:401)
at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:439)
The relevant part of the grammar is the following:
Expression
: ConditionalExpression
| WhenUnlessExpression
| SwitchExpression
;
ConditionalExpression
: 'if' condition=Expression 'then' valueIfTrue=Expression 'else' valueIfFalse=Expression
;
WhenUnlessExpression returns Expression
: ConditionalOrExpression ({WhenUnlessExpression.value=current} operator=('when' | 'unless') condition=Expression)?
;
SwitchExpression
: 'switch' expression=Expression '{' (caseClauses+=CaseClause)* ('default' ':' defaultExpression=Expression) '}'
;
CaseClause
: 'case' caseExpressions+=Expression (':' 'case' caseExpressions+=Expression)* ':' valueExpression=Expression
;
ConditionalOrExpression returns Expression
: ConditionalAndExpression ({ConditionalOrExpression.left=current} operator='||' right=ConditionalAndExpression)*
;
... // left out
Primary returns Expression
: ParenthesizedExpression
| Literal
... // left out
;
ParenthesizedExpression returns Expression
: '(' Expression ')'
;
The mysterious issue is that this problem only occurs if two WhenUnlessExpression objects are nested (you can see this in the stack trace).
Are there any ideas on how to fix this problem? Is there an alternative formulation of the grammar for which the serializer is successful?
How to adapt the serializer? I guess sequence_WhenUnlessExpression will have to be adapted. But how?
I'd appreciate any hints on how to fix this problem.
Best regards,
Tim