默认情况下,生成的XText工件会从我的DSL生成代码到默认插座(默认为src-gen文件夹)。我知道您可以在fsa.generateFile(“myfile.txt”,“MY_OUTLET_NAME”,“某些文件内容”)中明确传递插座配置名称。
我是因为我想使用我的XText DSL生成代码,并希望使用代间隙模式并在名为“src-once”的文件夹中生成代码。
我正在使用XText 2.2.1。
我的问题:
1)我在哪里以及如何定义我的网点,例如“MY_OUTLET_NAME”?
2)有没有办法防止覆盖特定插座中的现有文件?
答案 0 :(得分:10)
暗示形式Christian Dietrich指出了我正确的方向。下面是我最终得到的代码。
我创建了一个实现IOutputConfigurationProvider的新类 MyOutputConfigurationProvider 。 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 实现,请为模块类添加configure方法:
/**
* 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);
}
}
答案 1 :(得分:4)
实现自定义IOutputConfigurationProvider应该做的伎俩