gpt4 book ai didi

java - 从项目代码中遍历xtext ast

转载 作者:行者123 更新时间:2023-11-30 07:14:55 24 4
gpt4 key购买 nike

我在 xtext 中有一个 dsl 语法,我在 eclipse 插件中使用它。在插件中,用户手动创建一个新文件(如 https://eclipse.org/Xtext/documentation/102_domainmodelwalkthrough.html 中的 blog.dmodel 文件)

在我的插件代码中,当用户右键单击 dmodel 文件时,他可以从右键单击菜单中选择一个选项,该选项会触发名为 traverseAST() 的方法该方法当前查找

    IWorkspaceRoot root = workspace.getRoot();
IProject project = root.getProject(projectName);
IFolder folder = project.getFolder(path);
IFile file = folder.getFile(fileName);

我知道 IFile 不是我可以用来遍历 AST 的东西,所以我正在尝试以下方法

    @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);
}

我的资源是org.eclipse.xtext.linking.lazy.LazyLinkingResource@1230a38d uri='platform:/resource/demo/src/blog.dmodel'

但是 x1 和 x2 都是空的。

我做错了什么?

____编辑____根据 Christian Dietrich 的建议,我的代码现在是

    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);

uri 值为

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]

rsorg.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'

但内容是[]

编辑2_

每个请求共享更多代码。

我的 Eclipse 菜单处理程序代码BaseMenuHandler.java 当用户单击下拉菜单中的选项时,将激活以下代码。这是 Eclipse 菜单中标准添加的选项 静态公共(public)类InsertEvents { @覆盖 公共(public)对象执行(ExecutionEvent事件)抛出ExecutionException { IWorkspace 工作空间 = ResourcesPlugin.getWorkspace(); IWorkbenchPage 页面 = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); Traverse.traverseAST(页面,工作空间); }

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);

}


}

blog.dmodel 代码是 15 分钟的教程,没有任何更改: https://eclipse.org/Xtext/documentation/102_domainmodelwalkthrough.html____编辑3____跟随我们的谈话我在 xtext 项目 (blog.mydsl) 下创建了 main

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 i = 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());
}
}

}

这似乎有效。因为我没有做类似以下的事情 注入(inject)器 i = new DomainmodelStandaloneSetup().createInjectorAndDoEMFRegistration();在我的原始代码中,这应该是要走的路吗?我应该将插件代码移至 blog.mydsl src 文件夹吗?我应该查看 URI 吗?

最佳答案

以下内容应该有效。

@Inject
IResourceSetProvider resourceSetProvider;
...
URI uri = URI.createPlatformResourceURI(file.getFullPath().toString(), true);
ResourceSet rs = resourceSetProvider.get(project);
Resource r = rs.getResource(uri, true);

如果您不通过 guice (YourDslExecutableExtensionFactory) 创建代码,您可以通过 IResourceServiceProvider.Registry 获取 InjectorIResourceSetProvider .INSTANCE.getResourceServiceProvider(uri).get(IResourceSetProvider.class);

更新:

您共享的代码(我必须即兴创作很多)看起来更像是一个调试问题。参见

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());
}

关于java - 从项目代码中遍历xtext ast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38575987/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com