我已经用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插件),以便动态配置代码生成?
谢谢 保罗
答案 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类中,您将无法使用