grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals generate myDsl "http://www.xtext.org/example/mydsl/MyDsl" Model: elements+=Element*; Element: First | Second; First: 'first' name=ID; Second: 'second' item=Reference; Reference: 'refers' reference=[First];
first object second refers object
first object second refers object second refers newObject
first newObject
java.lang.RuntimeException: No EObjectDescription could be found in Scope Reference.reference for Model.elements[0]->First'newObject' Semantic Object: Model.elements[2]->Second.item->Reference URI: file:/C:/Users/flug/runtime-EclipseXtext/example/example.mydsl EStructuralFeature: myDsl::Reference.reference
public static void createNewObject(IPath path) { Injector injector = MydslActivator.getInstance().getInjector(MydslActivator.ORG_XTEXT_EXAMPLE_MYDSL_MYDSL); XtextResourceSet resourceSet = injector.getInstance(XtextResourceSet.class); resourceSet.addLoadOption(XtextResource.OPTION_RESOLVE_ALL, Boolean.TRUE); URI modelURI = URI.createFileURI(path.toString()); Resource resource = resourceSet.getResource(modelURI, true); Model model = (Model) resource.getContents().get(0); Model modelForObject = MyDslFactory.eINSTANCE.createModel(); First newObject = MyDslFactory.eINSTANCE.createFirst(); newObject.setName("newObject"); modelForObject.getElements().add(newObject); URI objectURI = modelURI.trimSegments(1).appendSegment("newObject.mydsl"); Resource objectResource = resourceSet.createResource(objectURI); objectResource.getContents().add(modelForObject); try { objectResource.save(Collections.EMPTY_MAP); } catch (IOException e) { e.printStackTrace(); } Reference reference = MyDslFactory.eINSTANCE.createReference(); reference.setReference(newObject); Second second = MyDslFactory.eINSTANCE.createSecond(); second.setItem(reference); model.getElements().add(second); try { resource.save(Collections.EMPTY_MAP); } catch (IOException e) { e.printStackTrace(); } }
XtextResourceSet resourceSet = injector.getInstance(XtextResourceSet.class);
XtextResourceSet resourceSet = (XtextResourceSet) injector.getInstance(XtextLiveScopeResourceSetProvider.class).get(project);
@Inject XtextLiveScopeResourceSetProvider provider;
XtextResourceSet resourceSet = (XtextResourceSet) injector.getInstance(XtextLiveScopeResourceSetProvider.class).get(project);
You can ask the injector for the stuff? Using this still won't change anything.
public class MyDslHandler extends AbstractHandler { @Inject XtextLiveScopeResourceSetProvider rsp; @Override public Object execute(ExecutionEvent event) throws ExecutionException { ISelection selection = HandlerUtil.getCurrentSelection(event); if (selection instanceof IStructuredSelection) { IStructuredSelection structuredSelection = (IStructuredSelection) selection; Object firstElement = structuredSelection.getFirstElement(); if (firstElement instanceof IFile) { IFile file = (IFile) firstElement; URI modelURI = URI.createPlatformResourceURI(file.getFullPath().toString(), true); XtextResourceSet resourceSet = (XtextResourceSet) rsp.get(file.getProject()); resourceSet.addLoadOption(XtextResource.OPTION_RESOLVE_ALL, Boolean.TRUE); Resource resource = resourceSet.getResource(modelURI, true); Model model = (Model) resource.getContents().get(0); Model modelForObject = MyDslFactory.eINSTANCE.createModel(); First newObject = MyDslFactory.eINSTANCE.createFirst(); newObject.setName("newObject"); modelForObject.getElements().add(newObject); URI objectURI = modelURI.trimSegments(1).appendSegment("newObject."+file.getFileExtension()); Resource objectResource = resourceSet.createResource(objectURI); objectResource.getContents().add(modelForObject); try { objectResource.save(Collections.EMPTY_MAP); } catch (IOException e) { e.printStackTrace(); } Reference reference = MyDslFactory.eINSTANCE.createReference(); reference.setReference(newObject); Second second = MyDslFactory.eINSTANCE.createSecond(); second.setItem(reference); model.getElements().add(second); try { resource.save(Collections.EMPTY_MAP); } catch (IOException e) { e.printStackTrace(); } // TODO Auto-generated method stub } } return null; } }