manage eopposite references coming from imported metamodel [message #1765199] |
Wed, 07 June 2017 09:13  |
Eclipse User |
|
|
|
Hi everybody,
I have this metamodel

I create a Xtext grammar from this metamodel
// automatically generated by Xtext
grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals
import "http://www.xtext.org/example/mydsl/MyDsl"
import "http://www.eclipse.org/emf/2002/Ecore" as ecore
Model returns Model:
{Model}
'Model'
name=ID
'{'
('classAs' '{' classAs+=ClassA ( "," classAs+=ClassA)* '}' )?
'}';
ClassA returns ClassA:
{ClassA}
'ClassA'
name=ID
'{'
// ('referingbs' '(' referingbs+=[ClassB|ID] ( "," referingbs+=[ClassB|ID])* ')' )?
('classb' '{' classb+=ClassB ( "," classb+=ClassB)* '}' )?
'}';
ClassB returns ClassB:
'ClassB'
name=ID
'{'
'target' target=[ClassA|ID]
'}';
My models are saved as XMI using a mechanism described in previous posts (That is not the issue).
The problem comes from the "referingbs" reference which is an eopposite reference to "target" reference.
When I create a model containing an instance of ClassB that refers to ClassA instance via target reference,
Xtext throws an error
java.lang.RuntimeException: Could not serialize ClassA:
ClassA.referingbs violates the upper bound: It holds 1 values, but only 0 are allowed.
Semantic Object: Model'model1'.classAs[0]->ClassA'class1'
URI: temp.my
Context: ClassA returns ClassA
at org.eclipse.xtext.serializer.diagnostic.ISerializationDiagnostic$ExceptionThrowingAcceptor.accept(ISerializationDiagnostic.java:131)
at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:503)
at org.xtext.example.mydsl.serializer.MyDslSemanticSequencer.sequence_ClassA(MyDslSemanticSequencer.java:59)
at org.xtext.example.mydsl.serializer.MyDslSemanticSequencer.sequence(MyDslSemanticSequencer.java:38)
at org.eclipse.xtext.serializer.sequencer.AbstractSemanticSequencer.createSequence(AbstractSemanticSequencer.java:67)
at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:325)
at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:352)
at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:263)
at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:434)
at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:501)
at org.xtext.example.mydsl.serializer.MyDslSemanticSequencer.sequence_Model(MyDslSemanticSequencer.java:92)
at org.xtext.example.mydsl.serializer.MyDslSemanticSequencer.sequence(MyDslSemanticSequencer.java:44)
at org.eclipse.xtext.serializer.sequencer.AbstractSemanticSequencer.createSequence(AbstractSemanticSequencer.java:67)
at org.eclipse.xtext.serializer.impl.Serializer.serialize(Serializer.java:115)
at org.eclipse.xtext.serializer.impl.Serializer.serialize(Serializer.java:128)
at org.eclipse.xtext.serializer.impl.Serializer.serialize(Serializer.java:192)
at org.eclipse.xtext.resource.XtextResource.doSave(XtextResource.java:386)
at org.eclipse.emf.ecore.resource.impl.ResourceImpl.save(ResourceImpl.java:1430)
I found this message https://www.eclipse.org/forums/index.php?t=msg&th=1079030&goto=1737136&#msg_1737136
that proposes to customize ITransientValueService feature.
I customize it by adding the following
class MyDslRuntimeModule extends AbstractMyDslRuntimeModule {
def Class<? extends LegacyTransientValueService> bindITransientValueService2() {
MyDslTransientValueService
}
}
public class MyDslTransientValueService extends LegacyTransientValueService {
@Override
public ValueTransient isValueTransient(EObject semanticObject, EStructuralFeature feature) {
if (feature == MyDslPackage.Literals.CLASS_A__REFERINGBS) {
return ValueTransient.YES;
}
return super.isValueTransient(semanticObject, feature);
}
}
However the original error always appears (ClassA.referingbs violates the upper bound: It holds 1 values, but only 0 are allowed).
My question: how can I resolve this eopposite issue in Xtext?
I share the complete case-study containing an example (in the org.eclipse.example.mydsl.example project)
if someone is interested to reproduce.
best regards
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.04978 seconds