Parsing/serializing xtend scripts with active annotations

99 views
Skip to first unread message

David Méndez

unread,
Jul 21, 2014, 9:20:11 AM7/21/14
to xtend...@googlegroups.com
Hello! :D

I have a problem and I would like to know if you have some ideas about what may be wrong. Thanks a lot in advance for your support,

I am trying to merge two Xtend files according to certain merging policies I am able to define at the level of the corresponding XMI models. Of course, to do that I need to first parse the scripts, execute the merging policy and then serialize the merged model. 

In a first experiment, I try to parse and serialize exactly the same Xtend file (i.e., without merging nothing) just to be sure that the parsing/serializing procedure is correct. My problem appears just there!

The parsing process seems to work correctly since (1) there are not exceptions in the console and (2) the model loaded in memory (that I can see in the debugger or by console marks) seems to be complete and correct; it includes solving the proxies so I am sure that this is not the problem.

HOWEVER, I get an exception when I want to serialize the model I just loaded. It is important to mention, that this exception does not appears always. In fact, I have tested my little prototype in large Xtend files without any problem. The exception appears when I use the variable _self in binary expressions (It works correctly if I use that variable in unary expressions). The variable _self is a variable I generate as a parameter of the method by using ActiveAnnotations. 

Here a brief example:

@Aspect(className=typeof(StateMachine)) // This is my active annotation

class StateMachineAspect {


    LinkedList<String> events = new LinkedList<String>()

    String currentEvent = ""


    def public void step () { // The active annotation includes the parameter _self to this method!

                          

        println(_self.currentEvent// So, I can actually use that parameter in the body of the method :D 

                               // In fact, I do not have any problems if I use this variable here. The 

                               //   parse/serialize process works correctly!

                               // As you can see, this parameter can be used as the reserved word "this"

                               //   In the context of my project, we need this parameter instead of the "this"


        while(_self.events.size() > 0){ // MY PROBLEM APPEARS IN THIS LINE, IN THE BOOLEAN EXPRESSION OF THE WHILE

     _self.currentEvent = _self.events.pop

     var ArrayList<Transition> transitions = _self.calculateTransitions();

     transitions.get(0).fire()

}

    }


Now, you can find some instructions that produce errors and some others that don't! As you can see, it is really difficult to realize what the problem actually is!


It fails!   while(_self.events.size() > 0){ ...


It works!   var LinkedList<String> myArray = _self.events

       while(myArray.size() > 0){ ...


It fails!   while(_self.events.size().compareTo(0) == -1){ ...


It works!   var LinkedList<String> myArray = _self.events

       while(myArray.size().compareTo(0) == -1){ ...



It works!   while(_self.events.size().equals(0)){ ... // :O Yes, it works!


It works!   var LinkedList<String> myArray = _self.events

       while(myArray.size().equals(0)){ ...


It works!   while(1 == 2){ ...


As you can see, the problem seems to be only the binary expressions in the presence of the _self variable. I would appreciate some ideas about how can I proceed to solve this issue.


Best regards,



By the way... the exception I get is in the following:



java.lang.RuntimeException: Operator [super] is not supported.

Semantic Object: XtendFile.xtendTypes[0]->XtendClass'StateMachineAspect'.members[5]->XtendFunction'step'.expression->XBlockExpression.expressions[1]->XWhileExpression.predicate->XBinaryOperation

Context: XExpression

at org.eclipse.xtext.serializer.diagnostic.ISerializationDiagnostic$ExceptionThrowingAcceptor.accept(ISerializationDiagnostic.java:70)

at org.eclipse.xtext.xbase.serializer.XbaseSemanticSequencer.sequence_XAdditiveExpression_XAndExpression_XAssignment_XEqualityExpression_XMultiplicativeExpression_XOrExpression_XOtherOperatorExpression_XRelationalExpression(XbaseSemanticSequencer.java:138)

at org.eclipse.xtend.core.serializer.AbstractXtendSemanticSequencer.createSequence(AbstractXtendSemanticSequencer.java:216)

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 org.eclipse.xtext.xbase.serializer.AbstractXbaseSemanticSequencer.sequence_XWhileExpression(AbstractXbaseSemanticSequencer.java:1405)

at org.eclipse.xtend.core.serializer.AbstractXtendSemanticSequencer.createSequence(AbstractXtendSemanticSequencer.java:1051)

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:239)

at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:396)

at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:441)

at org.eclipse.xtext.xbase.serializer.AbstractXbaseSemanticSequencer.sequence_XBlockExpression(AbstractXbaseSemanticSequencer.java:1060)

at org.eclipse.xtend.core.serializer.AbstractXtendSemanticSequencer.createSequence(AbstractXtendSemanticSequencer.java:251)

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:403)

at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:441)

at org.eclipse.xtend.core.serializer.AbstractXtendSemanticSequencer.sequence_Member(AbstractXtendSemanticSequencer.java:1432)

at org.eclipse.xtend.core.serializer.AbstractXtendSemanticSequencer.createSequence(AbstractXtendSemanticSequencer.java:1200)

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:239)

at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:396)

at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:441)

at org.eclipse.xtend.core.serializer.AbstractXtendSemanticSequencer.sequence_Type(AbstractXtendSemanticSequencer.java:1607)

at org.eclipse.xtend.core.serializer.AbstractXtendSemanticSequencer.createSequence(AbstractXtendSemanticSequencer.java:1150)

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:239)

at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:396)

at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:441)

at org.eclipse.xtend.core.serializer.AbstractXtendSemanticSequencer.sequence_File(AbstractXtendSemanticSequencer.java:1295)

at org.eclipse.xtend.core.serializer.AbstractXtendSemanticSequencer.createSequence(AbstractXtendSemanticSequencer.java:1184)

at org.eclipse.xtext.serializer.impl.Serializer.serialize(Serializer.java:85)

at org.eclipse.xtext.serializer.impl.Serializer.serialize(Serializer.java:108)

at org.eclipse.xtext.serializer.impl.Serializer.serialize(Serializer.java:130)

at org.eclipse.xtext.resource.XtextResource.doSave(XtextResource.java:344)

at org.eclipse.emf.ecore.resource.impl.ResourceImpl.save(ResourceImpl.java:1430)

at org.eclipse.emf.ecore.resource.impl.ResourceImpl.save(ResourceImpl.java:999)

at behavioralMerging.extension.XtendClassLoader.saveXtendFile(XtendClassLoader.java:65)

at behavioralMerging.extension.BehavioralMergingExtensionTestsStandAloneRuntime.testBehavioralMergingExtension(BehavioralMergingExtensionTestsStandAloneRuntime.java:51)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:606)

at junit.framework.TestCase.runTest(TestCase.java:168)

at junit.framework.TestCase.runBare(TestCase.java:134)

at junit.framework.TestResult$1.protect(TestResult.java:110)

at junit.framework.TestResult.runProtected(TestResult.java:128)

at junit.framework.TestResult.run(TestResult.java:113)

at junit.framework.TestCase.run(TestCase.java:124)

at junit.framework.TestSuite.runTest(TestSuite.java:243)

at junit.framework.TestSuite.run(TestSuite.java:238)

at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83)

at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)

at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)




Sven Efftinge

unread,
Jul 22, 2014, 3:16:37 AM7/22/14
to xtend...@googlegroups.com
What you are trying sounds at least a bit uncommon.
You could file a bugzilla and attach a small example to reproduce the issue.

Sven

--
You received this message because you are subscribed to the Google Groups "Xtend Programming Language" group.
To unsubscribe from this group and stop receiving emails from it, send an email to xtend-lang+...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

signature.asc

David Méndez

unread,
Jul 25, 2014, 3:27:32 AM7/25/14
to xtend...@googlegroups.com
Thanks for your answer Sven, 

However, before that I would like to be completely sure that there is not a mistake in my code. I will go by parts.
What is the correct injector for obtaining the corresponding ResourceSet that is able to parse my Xtend file?

Thanks in advance,

David Méndez

unread,
Jul 28, 2014, 5:36:29 AM7/28/14
to xtend...@googlegroups.com
Hi Sven,

I have been studying the problem in more detail. I tried to update the version of Xtend to the latest one to see if I can find some solutions. The problem becomes even worst: nothing works (even the files without active annotations). I built a simple example with the error and i submitted a bug in bugzilla. https://bugs.eclipse.org/bugs/show_bug.cgi?id=440522

We will see how this evolves,

Thanks for your support,

-- Dave,
Reply all
Reply to author
Forward
0 new messages