Настройте генератор Xtext во время выполнения

Я реализовал с помощью Xtext DSL и пытаюсь найти способ динамической настройки генерации кода в плагине mydsl.ui Eclipse.

Я ввел параметр предпочтения для настройки генератора.

Я внедрил пользовательский объект GeneratorConfiguration с помощью MyDslRuntimeModule.

Затем я устанавливаю параметр предпочтения в этом объекте в методе «сборки» пользовательского BuilderParticipant (настроенного в plugin.xml).

// 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)  

В результате объект GeneratorConfiguration, полученный с помощью декоратора @Inject в классе MyBuildPartecipant плагина mydsl.ui (eclipse ui), отличается от объекта, полученного в классе MyDslGenerator плагина mydsl (плагин генератора Xtext).

Как я могу передать параметр из плагина пользовательского интерфейса eclipse в плагин генератора Xtext (не плагин пользовательского интерфейса), чтобы динамически настроить генерацию кода?

Спасибо, Паоло.


person Marpa    schedule 17.02.2019    source источник


Ответы (2)


Я решил с:

// In mydsl plugin    
class MyDslRuntimeModule extends AbstractMyDslRuntimeModule {

    def IGeneratorConfiguration bindIGeneratorConfiguration() {
        return new GeneratorConfiguration();
   }
person Marpa    schedule 17.02.2019

вы должны пометить класс GeneratorConfiguration знаком @Singleton.

или добавьте одноэлементную привязку, используя метод configure

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

или аннотировать привязку класса с помощью @SingletonBinding

@SingletonBinding
def Class<? extends IGeneratorConfiguration> bindIGeneratorConfiguration() {
    GeneratorConfiguration
}

способ, которым вы это делаете, не будет работать, если вы вводите материал в класс GeneratorConfiguration

person Christian Dietrich    schedule 17.02.2019
comment
Спасибо за поддержку и за ваш вклад в Xtext. Моя ошибка возникла из-за копии AbstractMyDslRuntimeModule, public Class<? extends IGenerator2> bindIGenerator2() { return MyDslGenerator.class; } ведет себя как синглтон. - person Marpa; 18.02.2019
comment
на самом деле это не так. генератор создается только один раз, поэтому это только один экземпляр, но не синглтон - person Christian Dietrich; 18.02.2019