3

デフォルトでは、生成された XText アーティファクトは、私の DSL からデフォルトのアウトレット (デフォルトは src-gen フォルダー) にコードを生成します。fsa.generateFile("myfile.txt", "MY_OUTLET_NAME", "Some file content") でアウトレット構成名を明示的に渡すことができることを知っています。

XText DSL でコードを生成し、ジェネレーション ギャップ パターンを使用して、"src-once" というフォルダーにコードを生成するためです。

XText 2.2.1 を使用しています。

私の質問:

1) 「MY_OUTLET_NAME」などのアウトレットをどこでどのように定義すればよいですか?

2) 特定のアウトレットにある既存のファイルを上書きしないようにする方法はありますか?

4

2 に答える 2

10

クリスチャン・ディートリッヒからのヒントは、私を正しい方向に向けてくれました。以下は、私が最終的に得たコードです。

IOutputConfigurationProviderを実装する新しいクラスMyOutputConfigurationProviderを作成しました。getOutputConfigurationsメソッドは、デフォルトのsrc-genとカスタムsrc-gen-onceの2 つの出力構成を、ソースを 1 回だけ生成するための正しい設定で返します。

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

}

于 2012-05-01T11:21:24.343 に答える
4

カスタム IOutputConfigurationProvider を実装すると、うまくいくはずです

于 2012-04-27T20:52:29.457 に答える