2012-04-27 3 views
3

Par défaut, les artefacts XText générés génèrent du code à partir de mon DSL vers la sortie par défaut (qui est par défaut le dossier src-gen). Je sais que vous pouvez explicitement passer le nom de la configuration de sortie dans fsa.generateFile ("myfile.txt", "MY_OUTLET_NAME", "Certains fichiers de contenu").Comment ajouter plusieurs prises pour le XText DSL généré

Je le fais parce que je veux générer du code avec mon XText DSL et que je veux utiliser le modèle de génération de gap et générer du code dans un dossier appelé "src-once".

J'utilise XText 2.2.1.

Mes questions:

1) Où et comment puis-je définir mes points de vente comme "MY_OUTLET_NAME"? 2) Y a-t-il un moyen d'empêcher l'écrasement des fichiers existants dans une prise spécifique?

Répondre

4

mettre en œuvre une coutume IOutputConfigurationProvider devrait faire l'affaire

10

L'indice forme Christian Dietrich m'a orienté dans la bonne direction. Voici le code que j'ai fini avec.

J'ai créé une nouvelle classe MyOutputConfigurationProvider qui implémente IOutputConfigurationProvider. La méthode getOutputConfigurations renvoie deux configurations de sortie, la src-gen par défaut et une src-gen- personnalisée avec les paramètres corrects pour générer des sources une seule fois.

package com.my.dsl; 

import static com.google.common.collect.Sets.newHashSet; 

import java.util.Set; 

import org.eclipse.xtext.generator.IFileSystemAccess; 
import org.eclipse.xtext.generator.IOutputConfigurationProvider; 
import org.eclipse.xtext.generator.OutputConfiguration; 

public class MyOutputConfigurationProvider implements 
    IOutputConfigurationProvider { 

public final static String DEFAULT_OUTPUT_ONCE = "DEFAULT_OUTPUT_ONCE"; 

/** 
* @return a set of {@link OutputConfiguration} available for the generator 
*/ 
public Set<OutputConfiguration> getOutputConfigurations() { 
    OutputConfiguration defaultOutput = new OutputConfiguration(IFileSystemAccess.DEFAULT_OUTPUT); 
    defaultOutput.setDescription("Output Folder"); 
    defaultOutput.setOutputDirectory("./src-gen"); 
    defaultOutput.setOverrideExistingResources(true); 
    defaultOutput.setCreateOutputDirectory(true); 
    defaultOutput.setCleanUpDerivedResources(true); 
    defaultOutput.setSetDerivedProperty(true); 

    OutputConfiguration onceOutput = new OutputConfiguration(DEFAULT_OUTPUT_ONCE); 
    onceOutput.setDescription("Output Folder (once)"); 
    onceOutput.setOutputDirectory("./src-gen-once"); 
    onceOutput.setOverrideExistingResources(false); 
    onceOutput.setCreateOutputDirectory(true); 
    onceOutput.setCleanUpDerivedResources(false); 
    onceOutput.setSetDerivedProperty(true); 
    return newHashSet(defaultOutput, onceOutput); 
} 

} 

Pour utiliser le MyOutputConfigurationProvider mise en œuvre ajouter une méthode de configuration à votre classe de module:

/** 
* Use this class to register components to be used within the IDE. 
*/ 
public class MyDslUiModule extends com.my.dsl.ui.AbstractMyDslUiModule { 
public MyDslUiModule(AbstractUIPlugin plugin) { 
    super(plugin); 
} 

@Override 
public void configure(Binder binder) { 
    super.configure(binder); 

    binder.bind(IOutputConfigurationProvider.class).to(MyOutputConfigurationProvider.class).in(Singleton.class); 
} 

}

+0

Ceci est très utile! Une fois que je l'aurai fonctionné dans l'éditeur (DefaultUiModule), je devrai travailler dans le générateur autonome (pour la construction en ligne de commande). Si vous avez déjà fait cela, un pointeur serait grandement apprécié. – John

+2

Je trouve que votre exemple illustratif est très utile. Mais il manquait quelque chose, certains creusant autour conduit à cette URL: http://xtextcasts.org/episodes/15-output-configurations –

+0

Merci pour le partage – Chris

Questions connexes