扩展xtext新项目向导

时间:2018-01-04 17:43:01

标签: java eclipse xtext

我正在使用xtext 2.13 / java8创建带有IDE的DSL,如"使用Xtext和XTend第2版"实现特定于域的语言。 IDE包括一个新项目向导,DSL包含一个生成Java代码的代码生成器。生成的java代码依赖于作为DSL项目一部分提供的另一个支持插件中的一些辅助类。 我可以导出更新站点并安装到新的eclipse中。 在那里,我可以创建一个新的DSL项目,将DSL文件编译成java。 我想扩展新项目向导,以便我可以自动将我的支持插件的依赖项添加到新项目中生成的MANIFEST文件中。我可以在创建项目后手动添加它(插件存在于已安装的功能中),但我不希望用户必须这样做。 org.eclipse.xtext.ui.wizard.AbstractPluginProjectCreator具有添加日志包的依赖关系的代码,但我没有看到使用任何扩展点扩展或覆盖该逻辑的任何方法。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:2)

事实证明这并不太难,但需要花费半天的时间进行实验才能找到它。

xtext项目在.ui.wizard包中的src-gen下的* .ui插件中定义了一个生成的MyDSLProjectCreator类,它定义了我们需要覆盖的方法:

@Override
protected List<String> getRequiredBundles() {
    return Lists.newArrayList(DSL_PROJECT_NAME);
}

默认情况下,这会将DSL项目包添加到新项目的依赖项中。我还需要添加支持插件。我无法编辑这个生成的文件,但我可以扩展它,所以我在扩展此类的相同.ui.wizard包的src文件夹中定义了MyExtendedProjectCreator类(java源代码):

public class MyExtendedProjectCreator extends MyDslProjectCreator {

@Override
protected List<String> getRequiredBundles() {
    return Lists.newArrayList(DSL_PROJECT_NAME,
            "my.plugin.id");
}

}

要调用该项目创建者而不是默认项,我必须覆盖MyDslUiModule类中的另一个方法。这可以在src(xtend文件)下的.ui包中找到:

@FinalFieldsConstructor
class MyDslUiModule extends AbstractMyDslUiModule {
  public def override Class<? extends IProjectCreator> bindIProjectCreator() {
     MyExtendedProjectCreator;
  }
}