Community
Participate
Working Groups
Build Identifier: Version: 4.2.0 Build id: I20120315-1300 Xcore has a Ecore and GenModel inside it. So Xtext should accept it as a valid file to be used in the wizard that create project from existing Ecore models. Reproducible: Always
A possible solution should not introduce a new dependency to Xcore.
I imagine (without having looked at a line of code) that one "just" needs to allow choosing files with .xcore extension and that any other code should, rather than assume the EPackage is the first and only object in the resource.getContents(), find the EPackage among the contents. I agree there must be no bundle dependencies on Xcore because such circularity is impossible. Note that serialized Xcore resources are already registered as part of the generated_package extension point and the code reading the resources handles them without Xcore dependencies using the above approach.
Created attachment 219466 [details] EPackageChooser Patch
Status Report: I added the "xcore" extension to be recognized by the wizard used to create an Xtext project from Ecore models (see patch). I tried to complete the wizard and ran into three exceptions: ** First exception (repeatable)** Happens after a user selects the EMF Generator Model and clicks OK. In EPackageChooser.createEPackageInfosFromGenModel() line 64: for (TreeIterator<EObject> i = resource.getAllContents(); i.hasNext();) { 2 [main] ERROR org.eclipse.xtext.linking.lazy.LazyLinkingResource - resolution of uriFragment 'xtextLink_::0.4.0.7.0.4::3::/0' failed. java.lang.NullPointerException at org.eclipse.emf.ecore.xcore.util.XcoreJvmInferrer.getJvmTypeReference(XcoreJvmInferrer.java:2113) at org.eclipse.emf.ecore.xcore.util.XcoreJvmInferrer$8$5.inferStructure(XcoreJvmInferrer.java:1079) at org.eclipse.emf.ecore.xcore.util.XcoreJvmInferrer$8$5.inferStructure(XcoreJvmInferrer.java:1) at org.eclipse.emf.ecore.xcore.util.XcoreJvmInferrer$JvmElementInferrer.<init>(XcoreJvmInferrer.java:151) at org.eclipse.emf.ecore.xcore.util.XcoreJvmInferrer$8$5.<init>(XcoreJvmInferrer.java:1074) at org.eclipse.emf.ecore.xcore.util.XcoreJvmInferrer$8.inferDeepStructure(XcoreJvmInferrer.java:1074) at org.eclipse.emf.ecore.xcore.util.XcoreJvmInferrer.inferDeepStructure(XcoreJvmInferrer.java:245) at org.eclipse.emf.ecore.xcore.util.XcoreJvmInferrer.inferDeepStructure(XcoreJvmInferrer.java:230) at org.eclipse.emf.ecore.xcore.scoping.XcoreImportedNamespaceAwareScopeProvider$EClassifierScope$EcoreDataTypeAliasEObjectDescription.getElement(XcoreImportedNamespaceAwareScopeProvider.java:510) at org.eclipse.emf.ecore.xcore.scoping.XcoreImportedNamespaceAwareScopeProvider$EClassifierScope$EcoreDataTypeAliasEObjectDescription.getEObjectOrProxy(XcoreImportedNamespaceAwareScopeProvider.java:460) at org.eclipse.emf.ecore.xcore.scoping.XcoreImportedNamespaceAwareScopeProvider$1.apply(XcoreImportedNamespaceAwareScopeProvider.java:97) at org.eclipse.emf.ecore.xcore.scoping.XcoreImportedNamespaceAwareScopeProvider$1.apply(XcoreImportedNamespaceAwareScopeProvider.java:1) at com.google.common.collect.Iterators$7.computeNext(Iterators.java:645) at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:141) at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:136) at org.eclipse.xtext.scoping.impl.ImportScope.getLocalElementsByName(ImportScope.java:154) at org.eclipse.emf.ecore.xcore.scoping.XcoreImportedNamespaceAwareScopeProvider$4.getLocalElementsByName(XcoreImportedNamespaceAwareScopeProvider.java:382) at org.eclipse.xtext.scoping.impl.ImportScope.getSingleLocalElementByName(ImportScope.java:140) at org.eclipse.emf.ecore.xcore.scoping.XcoreImportedNamespaceAwareScopeProvider$4.getSingleLocalElementByName(XcoreImportedNamespaceAwareScopeProvider.java:376) at org.eclipse.xtext.scoping.impl.AbstractScope.getSingleElement(AbstractScope.java:102) at org.eclipse.xtext.scoping.impl.AbstractScope.getSingleElement(AbstractScope.java:105) at org.eclipse.xtext.scoping.impl.AbstractScope.getSingleElement(AbstractScope.java:105) at org.eclipse.xtext.scoping.impl.AbstractScope.getSingleElement(AbstractScope.java:105) at org.eclipse.xtext.scoping.impl.AbstractScope.getSingleElement(AbstractScope.java:105) at org.eclipse.xtext.scoping.impl.AbstractScope.getSingleElement(AbstractScope.java:105) at org.eclipse.xtext.linking.impl.DefaultLinkingService.getLinkedObjects(DefaultLinkingService.java:121) at org.eclipse.xtext.linking.lazy.LazyLinkingResource.getEObject(LazyLinkingResource.java:179) at org.eclipse.xtext.xbase.resource.XbaseResource.access$0(XbaseResource.java:1) at org.eclipse.xtext.xbase.resource.XbaseResource$2.exec(XbaseResource.java:239) at org.eclipse.xtext.xbase.resource.XbaseResource$2.exec(XbaseResource.java:1) at org.eclipse.xtext.util.OnChangeEvictingCache.execWithoutCacheClear(OnChangeEvictingCache.java:124) at org.eclipse.xtext.xbase.resource.XbaseResource.getEObject(XbaseResource.java:237) at org.eclipse.emf.ecore.xcore.resource.XcoreResource.getEObject(XcoreResource.java:184) at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.getEObject(ResourceSetImpl.java:223) at org.eclipse.emf.ecore.util.EcoreUtil.resolve(EcoreUtil.java:197) at org.eclipse.emf.ecore.util.EcoreUtil.resolve(EcoreUtil.java:257) at org.eclipse.emf.ecore.impl.BasicEObjectImpl.eResolveProxy(BasicEObjectImpl.java:1473) at org.eclipse.emf.ecore.xcore.impl.XGenericTypeImpl.getType(XGenericTypeImpl.java:232) at org.eclipse.emf.ecore.xcore.util.XcoreEcoreBuilder$3.run(XcoreEcoreBuilder.java:562) at org.eclipse.emf.ecore.xcore.util.XcoreEcoreBuilder.link(XcoreEcoreBuilder.java:121) at org.eclipse.emf.ecore.xcore.resource.XcoreModelAssociator.installDerivedState(XcoreModelAssociator.java:81) at org.eclipse.xtext.resource.DerivedStateAwareResource.installDerivedState(DerivedStateAwareResource.java:125) at org.eclipse.xtext.resource.DerivedStateAwareResource.getContents(DerivedStateAwareResource.java:48) at org.eclipse.emf.ecore.resource.impl.ResourceImpl$4.getChildren(ResourceImpl.java:519) at org.eclipse.emf.common.util.AbstractTreeIterator.hasAnyChildren(AbstractTreeIterator.java:97) at org.eclipse.emf.common.util.AbstractTreeIterator.hasNext(AbstractTreeIterator.java:85) at org.eclipse.xtext.xtext.ui.wizard.ecore2xtext.EPackageChooser.createEPackageInfosFromGenModel(EPackageChooser.java:64) at org.eclipse.xtext.xtext.ui.wizard.ecore2xtext.EPackageChooser.open(EPackageChooser.java:150) at org.eclipse.xtext.xtext.ui.wizard.ecore2xtext.WizardSelectImportedEPackagePage$3.widgetSelected(WizardSelectImportedEPackagePage.java:106) at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:248) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1276) at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3554) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3179) at org.eclipse.jface.window.Window.runEventLoop(Window.java:825) at org.eclipse.jface.window.Window.open(Window.java:801) at org.eclipse.ui.actions.NewProjectAction.run(NewProjectAction.java:117) at org.eclipse.jface.action.Action.runWithEvent(Action.java:498) at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:584) at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:501) at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:411) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1276) at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3554) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3179) at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2701) at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2665) at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2499) at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:679) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:668) at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:124) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:353) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:180) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:629) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:584) at org.eclipse.equinox.launcher.Main.run(Main.java:1438) at org.eclipse.equinox.launcher.Main.main(Main.java:1414) === Non repeatable exceptions: I got two ClassCastExceptions maybe when I was doing the Xtext project wizard starting from a genmodel generated from the Xcore model. Will verify later. XPackageImpl to EPackage ResourceSetImpl to XTextResourceSet ==== Generating the Xtext editor works and testing the editor works.
Is XcoreJavaProjectProvider kicking in to provide the information needed for class loading? Probably getJavaProject should kick in. What it returns will depend on what resources are in the resource set. If some other resource is first, that could be a problem if its project doesn't have Ecore and Xbase lib dependencies, or other dependencies needed by the Xcore model...
Fixed in master https://git.eclipse.org/r/#/c/31633/
Requested via bug 522520. -M.