Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » TMF (Xtext) » import and scope provider
import and scope provider [message #1764935] Sun, 04 June 2017 11:43 Go to next message
Fy Za is currently offline Fy ZaFriend
Messages: 245
Registered: March 2010
Senior Member
Hi everybody,

I have this EMF metamodel
index.php/fa/29555/0/

I create an Xtext project by importing this existing metamodel.

The Xtext grammar is
// 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}
	name=ID
	( 'import' (^imports+=[Model|STRING])+)?
	greetings+=Greeting*
	persons+=Person*
;
Greeting returns Greeting:
	{Greeting}
	'Greeting'
	name=ID
	'{'
		('applies' '(' applies+=[Person|QualifiedID] ( "," applies+=[Person|QualifiedID])* ')' )?
	'}';

Person returns Person:
	{Person}
	'Person'
	name=ID;

QualifiedID : (ID | QUALIFIED_ID) ;


terminal QUALIFIED_ID : 
  '^'?('a'..'z'|'A'..'Z'|'_')('a'..'z'|'A'..'Z'|'_'|'0'..'9')*  '.' ('a'..'z'|'A'..'Z'|'_')('a'..'z'|'A'..'Z'|'_'|'0'..'9')* ( '.' ('a'..'z'|'A'..'Z'|'_')('a'..'z'|'A'..'Z'|'_'|'0'..'9')* )*;
	


Accordingly to my previous resolved topic https://www.eclipse.org/forums/index.php/t/1086559/
my models are saved as xmi by customizing MyDslUiModule class

class MyDslUiModule extends AbstractMyDslUiModule {
		
	def Class<? extends XtextDocumentProvider> bindXtextDocumentProvider() {
		MyDslDocumentProvider
	}

	override Class<? extends IResourceForEditorInputFactory> bindIResourceForEditorInputFactory() {
		return MyDslResourceForEditorInputFactory
	}
}


I customize the scope provider mechanism to manage the imports clause by adding the following code
class MyDslScopeProvider extends AbstractMyDslScopeProvider {
	override getScope(EObject object, EReference ref) {
		if (object instanceof Model) {
			scope_Model_imports(object as Model, ref)
		} else
			super.getScope(object, ref)
	}

	def IScope scope_Model_imports(Model model, EReference ref) {
		return scopeForModel(model.getImports());
	}

	def IScope scopeForModel(EList<Model> models) {
		var ArrayList<IEObjectDescription> result = new ArrayList<IEObjectDescription>

		for (model : models) {
			result.add(EObjectDescription.create(QualifiedName.create(model.name), model))
		}
		new SimpleScope(IScope.NULLSCOPE, result)
	}
}



Now, let's consider this model

<?xml version="1.0" encoding="UTF-8"?>
<myDsl:Model xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:myDsl="http://www.xtext.org/example/mydsl/MyDsl" name="model1">
  <greetings name="toto" applies="//@persons.0"/>
  <imports href="My2.mydsl#/"/>
  <persons name="titi"/>
</myDsl:Model>


I can be opened with the emf editor, but when I try to open it with the textual editor I obtain this error

java.lang.IllegalArgumentException: Segment cannot be null
	at org.eclipse.xtext.naming.QualifiedName.create(QualifiedName.java:203)
	at org.xtext.example.mydsl.scoping.MyDslScopeProvider.scopeForExtensions(MyDslScopeProvider.java:46)
	at org.xtext.example.mydsl.scoping.MyDslScopeProvider.scope_Model_imports(MyDslScopeProvider.java:38)
	at org.xtext.example.mydsl.scoping.MyDslScopeProvider.getScope(MyDslScopeProvider.java:30)
	at org.eclipse.xtext.serializer.tokens.CrossReferenceSerializer.serializeCrossRef(CrossReferenceSerializer.java:90)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.getToken(SequenceFeeder.java:481)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:262)
	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:71)
	at org.xtext.example.mydsl.serializer.MyDslSemanticSequencer.sequence(MyDslSemanticSequencer.java:41)
	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)
	at org.xtext.example.mydsl.ui.MyDslDocumentProvider.setDocumentContent(MyDslDocumentProvider.java:55)
	at org.eclipse.ui.editors.text.FileDocumentProvider.setDocumentContent(FileDocumentProvider.java:425)
	at org.eclipse.xtext.ui.editor.model.XtextDocumentProvider.setDocumentContent(XtextDocumentProvider.java:183)
	at org.eclipse.ui.editors.text.StorageDocumentProvider.createDocument(StorageDocumentProvider.java:227)
	at org.eclipse.xtext.ui.editor.model.XtextDocumentProvider.createDocument(XtextDocumentProvider.java:141)
	at org.eclipse.ui.editors.text.FileDocumentProvider.createElementInfo(FileDocumentProvider.java:721)
	at org.eclipse.xtext.ui.editor.model.XtextDocumentProvider.createElementInfo(XtextDocumentProvider.java:262)
	at org.eclipse.ui.texteditor.AbstractDocumentProvider.connect(AbstractDocumentProvider.java:392)
	at org.eclipse.ui.texteditor.AbstractTextEditor.doSetInput(AbstractTextEditor.java:4178)
	at org.eclipse.ui.texteditor.StatusTextEditor.doSetInput(StatusTextEditor.java:229)
	at org.eclipse.ui.texteditor.AbstractDecoratedTextEditor.doSetInput(AbstractDecoratedTextEditor.java:1466)
	at org.eclipse.ui.editors.text.TextEditor.doSetInput(TextEditor.java:150)
	at org.eclipse.xtext.ui.editor.XtextEditor.doSetInput(XtextEditor.java:247)
	at org.eclipse.ui.texteditor.AbstractTextEditor$5.run(AbstractTextEditor.java:3154)
	at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:437)
	at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:353)
	at org.eclipse.ui.internal.WorkbenchWindow$14.run(WorkbenchWindow.java:2184)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
	at org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2180)
	at org.eclipse.ui.texteditor.AbstractTextEditor.internalInit(AbstractTextEditor.java:3172)
	at org.eclipse.ui.texteditor.AbstractTextEditor.init(AbstractTextEditor.java:3197)
	at org.eclipse.xtext.ui.editor.XtextEditor.init(XtextEditor.java:288)
	at org.eclipse.ui.internal.EditorReference.initialize(EditorReference.java:362)
	at org.eclipse.ui.internal.e4.compatibility.CompatibilityPart.create(CompatibilityPart.java:318)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55)
	at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:966)
	at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:931)
	at org.eclipse.e4.core.internal.di.InjectorImpl.inject(InjectorImpl.java:151)
	at org.eclipse.e4.core.internal.di.InjectorImpl.internalMake(InjectorImpl.java:375)
	at org.eclipse.e4.core.internal.di.InjectorImpl.make(InjectorImpl.java:294)
	at org.eclipse.e4.core.contexts.ContextInjectionFactory.make(ContextInjectionFactory.java:162)
	at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.createFromBundle(ReflectionContributionFactory.java:105)
	at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.doCreate(ReflectionContributionFactory.java:74)
	at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.create(ReflectionContributionFactory.java:56)
	at org.eclipse.e4.ui.workbench.renderers.swt.ContributedPartRenderer.createWidget(ContributedPartRenderer.java:129)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createWidget(PartRenderingEngine.java:975)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:651)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:757)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$0(PartRenderingEngine.java:728)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:722)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:706)
	at org.eclipse.e4.ui.workbench.renderers.swt.StackRenderer.showTab(StackRenderer.java:1324)
	at org.eclipse.e4.ui.workbench.renderers.swt.LazyStackRenderer$1.handleEvent(LazyStackRenderer.java:72)
	at org.eclipse.e4.ui.services.internal.events.UIEventHandler$1.run(UIEventHandler.java:40)
	at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:233)
	at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:145)
	at org.eclipse.swt.widgets.Display.syncExec(Display.java:4814)
	at org.eclipse.e4.ui.internal.workbench.swt.E4Application$1.syncExec(E4Application.java:211)
	at org.eclipse.e4.ui.services.internal.events.UIEventHandler.handleEvent(UIEventHandler.java:36)
	at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:201)
	at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:197)
	at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1)
	at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
	at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
	at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:135)
	at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:78)
	at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:39)
	at org.eclipse.e4.ui.services.internal.events.EventBroker.send(EventBroker.java:94)
	at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:60)
	at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:374)
	at org.eclipse.e4.ui.model.application.ui.impl.ElementContainerImpl.setSelectedElement(ElementContainerImpl.java:173)
	at org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.showElementInWindow(ModelServiceImpl.java:617)
	at org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.bringToTop(ModelServiceImpl.java:581)
	at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.delegateBringToTop(PartServiceImpl.java:770)
	at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.bringToTop(PartServiceImpl.java:401)
	at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.showPart(PartServiceImpl.java:1214)
	at org.eclipse.ui.internal.WorkbenchPage.busyOpenEditor(WorkbenchPage.java:3261)
	at org.eclipse.ui.internal.WorkbenchPage.access$25(WorkbenchPage.java:3176)
	at org.eclipse.ui.internal.WorkbenchPage$10.run(WorkbenchPage.java:3158)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
	at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:3153)
	at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:3117)
	at org.eclipse.ui.actions.OpenWithMenu.openEditor(OpenWithMenu.java:324)
	at org.eclipse.ui.actions.OpenWithMenu.lambda$0(OpenWithMenu.java:180)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4256)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1501)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1524)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1509)
	at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:1313)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4080)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3706)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022)
	at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150)
	at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1519)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1492)


The error comes from this line in the scope provider
result.add(EObjectDescription.create(QualifiedName.create(model.name), model))

When I debug model variable, it shows myDsl.impl.ModelImpl@3a4f4ec9 (eProxyURI: My2.mydsl#/)
and model.name returns null while the name value is not null as shown in the following model My2.mydsl
<?xml version="1.0" encoding="UTF-8"?>
<myDsl:Model xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:myDsl="http://www.xtext.org/example/mydsl/MyDsl" name="model2">
  <greetings name="dodo" applies="//@persons.0"/>
  <persons name="didi"/>
</myDsl:Model>


How can I resolve this issue, please?
  • Attachment: MyDsl.jpg
    (Size: 29.96KB, Downloaded 1241 times)
Re: import and scope provider [message #1764936 is a reply to message #1764935] Sun, 04 June 2017 11:49 Go to previous messageGo to next message
Fy Za is currently offline Fy ZaFriend
Messages: 245
Registered: March 2010
Senior Member
When I debug imported model ("model" variable) in the scope, all features are null.
It is strange !
index.php/fa/29556/0/
Re: import and scope provider [message #1764937 is a reply to message #1764935] Sun, 04 June 2017 11:50 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14665
Registered: July 2009
Senior Member
QualifiedName.create(model.name)

=> i assume name is null here
=> you need to look why

i assume you loading the xmi is broken regarding the models
and they are proxys that cannot be resolved


Twitter : @chrdietrich
Blog : https://www.dietrich-it.de

[Updated on: Sun, 04 June 2017 11:52]

Report message to a moderator

Re: import and scope provider [message #1764938 is a reply to message #1764937] Sun, 04 June 2017 12:18 Go to previous messageGo to next message
Fy Za is currently offline Fy ZaFriend
Messages: 245
Registered: March 2010
Senior Member
Yes Christian.
name is null.

Any idea/suggestion please?
Re: import and scope provider [message #1764939 is a reply to message #1764937] Sun, 04 June 2017 12:21 Go to previous messageGo to next message
Ed Merks is currently offline Ed MerksFriend
Messages: 33140
Registered: July 2009
Senior Member
Yes it's clearly an unresolved proxy. I see <imports href="My2.mydsl#/"/> in the example. The most common reason a proxy fails to resolve when really it shouldn't is that you didn't load the resource containing that proxy reference with an absolute URI. In an Eclipse environment, use URI.createPlatformResourceURI to reference the resource in the workspace. To reference something in the file system, use URI.createFileURI(file.getAbsolutePath()).

Ed Merks
Professional Support: https://www.macromodeling.com/
Re: import and scope provider [message #1764940 is a reply to message #1764939] Sun, 04 June 2017 12:31 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14665
Registered: July 2009
Senior Member
Make sure you first load all xmi and resolve all proxies
(EcoreUtil.resolveAll ....) before you start involving Xtext


Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: import and scope provider [message #1764941 is a reply to message #1764940] Sun, 04 June 2017 13:03 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14665
Registered: July 2009
Senior Member
(and the same before writing)

Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: import and scope provider [message #1764942 is a reply to message #1764941] Sun, 04 June 2017 13:13 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14665
Registered: July 2009
Senior Member
ps. i am still wondering if your way i the right way to go or if using a embedded xtext editor inside the emf editor would be easier
(have never done this - nor your way though)


Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: import and scope provider [message #1764948 is a reply to message #1764942] Sun, 04 June 2017 17:31 Go to previous messageGo to next message
Fy Za is currently offline Fy ZaFriend
Messages: 245
Registered: March 2010
Senior Member
when I edit manually this model
<?xml version="1.0" encoding="UTF-8"?>
<myDsl:Model xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:myDsl="http://www.xtext.org/example/mydsl/MyDsl" name="model11">
  <greetings name="toto" applies="//@persons.0"/>
  <imports href="My2.mydsl#/"/>
  <persons name="titi"/>
</myDsl:Model>

by changing <imports href="My2.mydsl#/"/> with <imports href="platform:/resource/MyDslExamples/My2.mydsl#/"/>,
the model becomes openable with the textual editor and shows the content
model1 import "model2" Greeting toto { applies ( titi ) } Person titi

So the problem is how to save the uri with "platform:/resource/MyDslExamples/".

I override the method doSave of MyDslResourceImpl by resolveAll
	@Override
	public void doSave(OutputStream outputStream, Map<?, ?> options) throws IOException {
		EcoreUtil.resolveAll(resourceSet);
		super.doSave(outputStream, options);
	}

but nothing happens!
How can I resolve this issue and save path in EMF models with "platform:/resource/"?

Re: import and scope provider [message #1764949 is a reply to message #1764948] Sun, 04 June 2017 17:52 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14665
Registered: July 2009
Senior Member
I am not sure how you created the model in the first place.
It might be a problem of how you create the xtext stuff and co
(You don't create platform resource Uris )
And I have doubts if the complete way you go is a good idea or not
For a multi file approach

So the question is: that is the Uri of the model before saving as xmi



Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: import and scope provider [message #1764972 is a reply to message #1764949] Mon, 05 June 2017 09:17 Go to previous messageGo to next message
Ed Merks is currently offline Ed MerksFriend
Messages: 33140
Registered: July 2009
Senior Member
As I mentioned in the EMF forum, rather than force the serialization content to use absolute URIs, use an absolute URI to load the serialization in the first place.

Ed Merks
Professional Support: https://www.macromodeling.com/
Re: import and scope provider [message #1765162 is a reply to message #1764972] Wed, 07 June 2017 07:45 Go to previous message
Fy Za is currently offline Fy ZaFriend
Messages: 245
Registered: March 2010
Senior Member
Thanks Christian and Ed for your messages.
The issue is resolved by customizing the CrossReferenceSerializer.

Faiez
Previous Topic:NPE in IntelliJ plugin tryting to convert PSIElement to EObject
Next Topic:manage eopposite references coming from imported metamodel
Goto Forum:
  


Current Time: Thu Apr 25 08:28:32 GMT 2024

Powered by FUDForum. Page generated in 0.03769 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top