2012-04-27 38 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