java - traversing xtext ast from the project code -


i have dsl grammar in xtext using in eclipse plugin. in plugin user manually creates new file (like blog.dmodel file in https://eclipse.org/xtext/documentation/102_domainmodelwalkthrough.html)

in plugin code, when user right clicks in dmodel file, can select right click menu option triggers method called traverseast() method finds

    iworkspaceroot root = workspace.getroot();     iproject project = root.getproject(projectname);     ifolder folder = project.getfolder(path);     ifile file = folder.getfile(filename); 

i understand ifile not can use traverse ast, trying following approach

    @inject     static resourceset resourceset;     public traverseast(){         iworkspaceroot root = workspace.getroot();         iproject project = root.getproject(projectname);         ifolder folder = project.getfolder(path);         ifile file = folder.getfile(filename);         org.eclipse.emf.common.util.uri uri = org.eclipse.emf.common.util.uri.createplatformresourceuri(file.getfullpath().tostring(), true);         resourceset set  = new resourcesetimpl();         resource resource = set.createresource(uri);         treeiterator<object> x1 = ecoreutil.getallcontents(resource, true);         treeiterator<object> x2 = ecoreutil.getallcontents(resource, false); } 

my resource org.eclipse.xtext.linking.lazy.lazylinkingresource@1230a38d uri='platform:/resource/demo/src/blog.dmodel'

but both x1 , x2 empty.

what doing wrong?

_____edit______ per christian dietrich suggestions code

    iworkspaceroot root = workspace.getroot();     iproject project = root.getproject(projectname);     ifolder folder = project.getfolder(path);     ifile file = folder.getfile(filenamewithoutextension + suffix);     org.eclipse.emf.common.util.uri uri = org.eclipse.emf.common.util.uri.createplatformresourceuri(file.getfullpath().tostring(), true);     iresourcesetprovider rs1 = iresourceserviceprovider.registry.instance.getresourceserviceprovider(uri).get(iresourcesetprovider.class);     resourceset rs = rs1.get(project);     resource r = rs.getresource(uri, true); 

the uri value

platform:/resource/demo/src/blog.dmodel 

rs1

org.eclipse.xtext.ui.resource.xtextresourcesetprovider@2faab150 factoryproxy[key=key[type=org.eclipse.xtext.resource.xtextresourceset, annotation=[none]], provider=com.google.inject.internal.constructorbindingimpl$factory@6185cb4d] 

rs org.eclipse.xtext.resource.synchronizedxtextresourceset@39fcefea resources=[org.eclipse.xtext.linking.lazy.lazylinkingresource@25d48650 uri='platform:/resource/demo/src/blog.dmodel']

r

org.eclipse.xtext.linking.lazy.lazylinkingresource@25d48650 uri='platform:/resource/demo/src/blog.dmodel' 

but content []

edit 2_

sharing more code per request.

my eclipse menu handler code basemenuhandler.java following code activated when user clicking on option in drop down menu. standard addition of option eclipse menu static public class insertevents { @override public object execute(executionevent event) throws executionexception { iworkspace workspace = resourcesplugin.getworkspace(); iworkbenchpage page = platformui.getworkbench().getactiveworkbenchwindow().getactivepage(); traverse.traverseast(page, workspace); }

import org.eclipse.core.resources.ifile; import org.eclipse.core.resources.ifolder; import org.eclipse.core.resources.iproject; import org.eclipse.core.resources.iresource; import org.eclipse.core.resources.iworkspace; import org.eclipse.core.resources.iworkspaceroot; import org.eclipse.core.runtime.coreexception; import org.eclipse.emf.common.util.treeiterator; import org.eclipse.emf.ecore.resource.resource; import org.eclipse.emf.ecore.resource.resourceset; import org.eclipse.emf.ecore.util.ecoreutil; import org.eclipse.jface.viewers.iselection; import org.eclipse.ui.ieditorinput; import org.eclipse.ui.ieditorpart; import org.eclipse.ui.iworkbenchpage; import org.eclipse.ui.iworkbenchwindow; import org.eclipse.ui.partinitexception; import org.eclipse.ui.platformui; import org.eclipse.ui.ide.ide; import org.eclipse.xtext.resource.iresourceserviceprovider; import org.eclipse.xtext.ui.resource.iresourcesetprovider; public class traverse{     public static void traverseast(iworkbenchpage page, iworkspace workspace) {         ifile ifile = getselectedifile();         if (ifile != null) {             string filename = ifile.getname();             string filenamewithoutextension = filename.replace(ifile.getfileextension().tostring(), "");             string projectname = ifile.getproject().getname();             string path = ifile.getprojectrelativepath().tostring().replace("/" + filename, "");             iworkspaceroot root = workspace.getroot();             iproject project = root.getproject(projectname);             ifolder folder = project.getfolder(path);             ifile file = folder.getfile(filenamewithoutextension + "dmodel");             if (suffix.equals("dmodel")){                string path1 = file.getfullpath().tostring();             org.eclipse.emf.common.util.uri uri = org.eclipse.emf.common.util.uri.createplatformresourceuri(file.getfullpath().tostring(), true);             iresourcesetprovider rs1 = iresourceserviceprovider.registry.instance.getresourceserviceprovider(uri).get(iresourcesetprovider.class);             resourceset rs = rs1.get(project);             resource r = rs.getresource(uri, true);             treeiterator<object> x1 = ecoreutil.getallcontents(r, true);             treeiterator<object> x2 = ecoreutil.getallcontents(r, false);  }           } 

the blog.dmodel code 15 minutes tutorial without changes here: https://eclipse.org/xtext/documentation/102_domainmodelwalkthrough.html ____edit 3____ following our conversation i've created main under xtext project (blog.mydsl)

package blog.mydsl;  import org.eclipse.emf.common.util.treeiterator; import org.eclipse.emf.common.util.uri; import org.eclipse.emf.ecore.resource.resource; import org.eclipse.emf.ecore.resource.resourceset; import org.eclipse.emf.ecore.util.ecoreutil; import org.example.domainmodel.domainmodelstandalonesetup;  import com.google.inject.injector;  public class main {      public static void main(string[] args) {         uri uri = uri.createuri("/users/desktop/demo.mydsl");         injector = new domainmodelstandalonesetup().createinjectoranddoemfregistration();         resourceset rs = i.getinstance(resourceset.class);         resource r = rs.getresource(uri, true);         treeiterator<object> x1 = ecoreutil.getallcontents(r, true);         while (x1.hasnext()) {             system.out.println(x1.next());         }         treeiterator<object> x2 = ecoreutil.getallcontents(r, false);         while (x2.hasnext()) {             system.out.println(x2.next());         }     }  } 

this seems working. since did not following injector = new domainmodelstandalonesetup().createinjectoranddoemfregistration(); in original code, should way go? should move plugin code blog.mydsl src folder? should uri?

the following should work.

@inject iresourcesetprovider resourcesetprovider; ... uri uri = uri.createplatformresourceuri(file.getfullpath().tostring(), true); resourceset rs = resourcesetprovider.get(project); resource r = rs.getresource(uri, true); 

if dont create code via guice (yourdslexecutableextensionfactory) can obtain injector or iresourcesetprovider via iresourceserviceprovider.registry.instance.getresourceserviceprovider(uri).get(iresourcesetprovider.class);

update:

which code shared (i had improvise lot) looks more debugging issue. see

org.eclipse.emf.common.util.uri uri = org.eclipse.emf.common.util.uri     .createplatformresourceuri(file.getfullpath().tostring(), true); iresourcesetprovider rs1 = iresourceserviceprovider.registry.instance.getresourceserviceprovider(uri)         .get(iresourcesetprovider.class); resourceset rs = rs1.get(project); resource r = rs.getresource(uri, true); treeiterator<object> x1 = ecoreutil.getallcontents(r, true); while(x1.hasnext()) {     system.out.println(x1.next()); } treeiterator<object> x2 = ecoreutil.getallcontents(r, false); while(x2.hasnext()) {     system.out.println(x2.next()); } 

Comments

Popular posts from this blog

jOOQ update returning clause with Oracle -

java - Warning equals/hashCode on @Data annotation lombok with inheritance -

java - BasicPathUsageException: Cannot join to attribute of basic type -