Xtext:从上下文菜单调用生成器

时间:2017-01-15 19:59:54

标签: xtext

https://christiandietrich.wordpress.com/2011/10/15/xtext-calling-the-generator-from-a-context-menu/

并在行

时使用EclipseResourceFileSystemAccess2代替EclipseResourceFileSystemAccess
final EclipseResourceFileSystemAccess2 fsa = fileAccessProvider.get();

给出例外。我唯一的信息是

// Compiled from InvocationTargetException.java (version 1.8 : 52.0, super bit)
public class java.lang.reflect.InvocationTargetException extends java.lang.ReflectiveOperationException {

我不知道如何在Eclipse中获取堆栈跟踪。

博客中的代码是否仍然在Xtext的最新版本中运行?

更新1

plugin.xml的片段

处理程序:

<extension
   point="org.eclipse.ui.handlers">
  <handler
      class="tuks.mcrl2.dsl.ui.handlers.Mcrl22Lps"
      commandId="tuks.mcrl2.dsl.ui.commands.mcrl2lps">
  </handler>
 </extension> 

命令:

<extension
   point="org.eclipse.ui.commands">
 <command
      categoryId="tuks.mcrl2.dsl.ui.category.processalgebra"
      defaultHandler="tuks.mcrl2.dsl.ui.handlers.Mcrl22Lps"
      description="Conver a mclr2 file to lps"
      id="tuks.mcrl2.dsl.ui.commands.mcrl2lps"
      name="mcrl22lps">
 </command>
 <category
      id="tuks.mcrl2.dsl.ui.category.processalgebra"
      name="Process Algebra">
 </category>
</extension>  

1 个答案:

答案 0 :(得分:1)

如果你从EclipseResourceFileSystemAccess和Stuff以及(可能)IGenerator进行更新,它基本上可以工作。 我假设你没有设置Accesses ProgressMonitor和其他道具。

package org.xtext.example.mydsl.ui.handler;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.xtext.builder.EclipseResourceFileSystemAccess2;
import org.eclipse.xtext.generator.GeneratorContext;
import org.eclipse.xtext.generator.IGenerator2;
import org.eclipse.xtext.resource.IResourceDescriptions;
import org.eclipse.xtext.ui.resource.IResourceSetProvider;

import com.google.inject.Inject;
import com.google.inject.Provider;

public class GenerationHandler extends AbstractHandler implements IHandler {

    @Inject
    private IGenerator2 generator;

    @Inject
    private Provider<EclipseResourceFileSystemAccess2> fileAccessProvider;

    @Inject
    IResourceDescriptions resourceDescriptions;

    @Inject
    IResourceSetProvider resourceSetProvider;

    @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;
                IProject project = file.getProject();
                IFolder srcGenFolder = project.getFolder("src-gen");
                if (!srcGenFolder.exists()) {
                    try {
                        srcGenFolder.create(true, true,
                                new NullProgressMonitor());
                    } catch (CoreException e) {
                        return null;
                    }
                }

                final EclipseResourceFileSystemAccess2 fsa = fileAccessProvider.get();
                fsa.setProject(project);
                fsa.setOutputPath("src-gen");
                fsa.setMonitor(new NullProgressMonitor()); 
                URI uri = URI.createPlatformResourceURI(file.getFullPath().toString(), true);
                ResourceSet rs = resourceSetProvider.get(project);
                Resource r = rs.getResource(uri, true);
                generator.doGenerate(r, fsa, new GeneratorContext());

            }
        }
        return null;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }

}

并确保正确注册处理程序。 在

class="org.xtext.example.mydsl.ui.MyDslExecutableExtensionFactory:org.xtext.example.mydsl.ui.handler.GenerationHandler"

至关重要,尤其是它由2部分组成,ExtensionFactory后跟:后跟实际的班级名称

相关问题