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
Post a Comment