Настройте генератор Xtext во время выполнения - PullRequest
0 голосов
/ 17 февраля 2019

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

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

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

Затем я установил параметр предпочтения в этом объекте в методе "build" пользовательского 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 ui в плагин генератора Xtext (не плагин ui) для динамической настройки генерации кода?

Спасибо Paolo

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

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

или добавьте одноэлементную привязку с помощью метода конфигурации

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

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

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

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

0 голосов
/ 17 февраля 2019

Я решил с помощью:

// In mydsl plugin    
class MyDslRuntimeModule extends AbstractMyDslRuntimeModule {

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