2012-04-27 37 views
3

默认情况下,生成的XText工件会从我的DSL生成代码到默认插座(默认为src-gen文件夹)。我知道你可以在fsa.generateFile(“myfile.txt”,“MY_OUTLET_NAME”,“某些文件内容”)中明确地传递出口配置名称。如何为生成的XText DSL添加多个插座

我,因为我想用我的XTEXT DSL生成代码,并希望使用代沟模式和生成的代码名为“SRC一次”文件夹中。

我使用XText 2.2.1。

我的问题:

1)在哪里,我怎么这样定义 “MY_OUTLET_NAME” 我的插座?

2)有没有办法防止覆盖特定插座中的现有文件?

回答

4

实现自定义IOutputConfigurationProvider应该做的伎俩

10

该提示的形式基督教迪特里希指出我朝着正确的方向发展。以下是我结束的代码。

我创建了一个新类MyOutputConfigurationProvider实现了IOutputConfigurationProvider。 getOutputConfigurations方法返回两个输出配置,默认值为src-gen和自定义src-gen-once正确的设置仅用于生成源一次。

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

} 

要使用MyOutputConfigurationProvider实现增加配置方法,以你的模块类:

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

这是非常有帮助!一旦我在编辑器(DefaultUiModule)中使用它,我将不得不将它工作到独立的生成器(用于命令行构建)。如果你已经这样做了,一个指针将不胜感激。 – John 2012-08-29 16:59:05

+2

我发现你的例子非常有用。但它缺少一些东西,一些挖到周围导致这个URL:http://xtextcasts.org/episodes/15-output-configurations – 2014-07-19 02:25:47

+0

感谢分享 – Chris 2016-10-05 18:33:00