在运行时配置Xtext生成器

时间:2019-02-17 11:34:44

标签: eclipse generator xtext inject preference

我已经用Xtext实现了DSL,并且我试图找到一种方法来动态配置mydsl.ui Eclipse插件中的代码生成。

我介绍了一个首选项参数以配置生成器。

我用MyDslRuntimeModule注入了一个自定义的GeneratorConfiguration对象

然后,通过自定义BuilderParticipant(在plugin.xml中配置)的“ build”方法在此对象中设置首选项参数。

// In mydsl plugin    
class MyDslRuntimeModule extends AbstractMyDslRuntimeModule {

    def Class<? extends IGeneratorConfiguration> bindIGeneratorConfiguration() {
        return GeneratorConfiguration;
   }

}

// In mydsl.ui plugin
package mydsl.ui;

public class MyBuildPartecipant extends BuilderParticipant {

@Inject IGeneratorConfiguration generatorConfiguration;

@Override
public void build(IBuildContext context, IProgressMonitor monitor) throws CoreException {

    ScopedPreferenceStore scopedPreferenceStore = new ScopedPreferenceStore(InstanceScope.INSTANCE, "ID");

    generatorConfiguration.setGeneratorProperty(scopedPreferenceStore.getInt("myDslProperty"));

    super.build(context, monitor);
}

// In mydsl plugin
class MyDslGenerator extends AbstractGenerator {

@Inject IGeneratorConfiguration generatorConfiguration;

    override void doGenerate(Resource resource, IFileSystemAccess2 fsa, IGeneratorContext context) {

        println("Compiling with " + generatorConfiguration.generatorProperty)  

结果是,通过mydsl.ui插件(Eclipse ui)的MyBuildPartecipant类中的@Inject装饰器获得的GeneratorConfiguration对象不同于从mydsl插件(Xtext生成器插件)的MyDslGenerator类中获得的GeneratorConfiguration对象。

如何将参数从eclipse ui插件传递给Xtext生成器插件(非ui插件),以便动态配置代码生成?

谢谢 保罗

2 个答案:

答案 0 :(得分:0)

我解决了:

// In mydsl plugin    
class MyDslRuntimeModule extends AbstractMyDslRuntimeModule {

    def IGeneratorConfiguration bindIGeneratorConfiguration() {
        return new GeneratorConfiguration();
   }

答案 1 :(得分:0)

您应将GeneratorConfiguration类标记为@Singleton

或使用配置方法添加单例绑定

def void configureIGeneratorConfiguration(Binder binder) {
    binder.bind(IGeneratorConfiguration).to(GeneratorConfiguration).in(Scopes.SINGLETON)
} 

或使用@SingletonBinding

注释类绑定
@SingletonBinding
def Class<? extends IGeneratorConfiguration> bindIGeneratorConfiguration() {
    GeneratorConfiguration
}

如果将内容注入GeneratorConfiguration类中,您将无法使用