如何为生成的XText DSL添加多个出口

reh*_*hos 3 dsl xtext outlet

默认情况下,生成的XText工件会从我的DSL生成代码到默认插座(默认为src-gen文件夹).我知道您可以在fsa.generateFile("myfile.txt","MY_OUTLET_NAME","某些文件内容")中明确传递插座配置名称.

我是因为我想用我的XText DSL生成代码,并希望使用代间隙模式并在名为"src-once"的文件夹中生成代码.

我正在使用XText 2.2.1.

我的问题:

1)我在哪里以及如何定义"MY_OUTLET_NAME"等网点?

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

reh*_*hos 10

提示形式Christian Dietrich指出我正确的方向.下面是我最终得到的代码.

我创建了一个新类MyOutputConfigurationProvider,它实现了IOutputConfigurationProvider.该getOutputConfigurations方法返回两个输出配置,缺省SRC根和定制根一次SRC具有用于产生源仅一次正确的设置.

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

}
Run Code Online (Sandbox Code Playgroud)

要使用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);
}
Run Code Online (Sandbox Code Playgroud)

}

  • 我发现你的说明性例子非常有用.但它缺少一些东西,一些挖掘导致这个URL:http://xtextcasts.org/episodes/15-output-configurations (2认同)