2017-01-15 4 views
0

AprèsXtext: Appeler le générateur à partir d'un menu contextuel

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

et en utilisant EclipseResourceFileSystemAccess2 au lieu de EclipseResourceFileSystemAccess lorsque la ligne

final EclipseResourceFileSystemAccess2 fsa = fileAccessProvider.get(); 

donnent une exception. La seule information que j'ai est

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

Je ne sais pas comment obtenir la trace de pile dans Eclipse.

Le code du blog fonctionne-t-il toujours dans la version la plus récente de Xtext?

Update 1

Snippets de plugin.xml

Handler:

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

Commandes:

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

Répondre

1

cela fonctionne fondamentalement, si vous faites la mise à jour de EclipseResourceFileSystemAccess et Stuff (peut-être) IGenerator. Je suppose que dans votre cas, vous ne définissez pas les Accesses ProgressMonitor et d'autres accessoires.

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

} 

et assurez-vous d'enregistrer le gestionnaire correctement. le

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

est essentiel, surtout qu'il se compose de 2 parties, la ExtensionFactory suivie d'un : suivi du nom de la classe réelle

+0

La variable 'fileAccessProvider' est nulle dans ma mise en œuvre. – Johan

+0

Comment ressemble l'enregistrement de handler dans plugin.xml? –

+0

Vous devez écrire xxx.YourdslExecutsbleExtensionFactory: xxx.YourHandler ne fonctionne guice –