Xtext,在LaunchMydslShortcut中获取Iselection输入

时间:2016-11-22 13:45:49

标签: eclipse dsl xtext xtend

我正在尝试使用Xtext创建一个简单的DSL并使用解释器执行它,语法是最初的 Hello Word 项目。
我可以成功执行.Text文件 在org.xtext.example.mydsl.ui项目中,我在plugin.xml文件中编写此内容以从我的班级LaunchMydslShortcut运行项目。

  <extension
    point="org.eclipse.debug.ui.launchShortcuts">
 <shortcut
       class="org.xtext.example.mydsl.ui.MyDslExecutableExtensionFactory:org.xtext.example.mydsl.ui.launch.LaunchMydslShortcut"
       icon="icon/sample.gif"
       id="org.xtext.example.mydsl.u.launchMyDsl"
       label="MyDsll"
       modes="run">

       <contextualLaunch>
       <enablement>
         <with variable="selection">
           <count value="1"/>
           <iterate
                 ifEmpty="false"
                 operator="and">
              <adapt type="org.eclipse.core.resources.IFile"/>
                <test property="org.eclipse.debug.ui.matchesPattern"
                      value="*.mydsl"/>
           </iterate>
         </with>
       </enablement>
       <contextLabel
          mode="run"
          label="Run Mydsl"/>
     </contextualLaunch>

 </shortcut>
</extension>

这是我的LaunchMydslShortcut课程:

class LaunchMydslShortcut implements ILaunchShortcut {
    @Inject
    private IResourceForEditorInputFactory resourceFactory;

    override launch(ISelection selection, String mode) {
        println("launch from selection")

    }

    override launch(IEditorPart editor, String mode) {
        val input = editor.editorInput

        if (editor instanceof XtextEditor && input instanceof FileEditorInput) {
            val resource = resourceFactory.createResource(input)
            resource.load(newHashMap())
            println("launch Doooone")
        }
    }
}

但是,我希望使用launch(IEditorPart editor, String mode)函数,但它会执行launch(ISelection selection, String mode)
所以问题是,两者之间的差异是什么?为什么我的项目使用第一个?以及如何使用第二个?

1 个答案:

答案 0 :(得分:0)

例如,当您从包浏览器启动生成器时,会调用第一个void launch(ISelection selection, String mode)

从编辑器上下文菜单启动时调用第二个void launch(IEditorPart editor, String mode)

您可以使用Utility获取所需的输入文件,然后创建IResource。

很好的例子是org.eclipse.xtext.xtext.launcher.WorkflowLaunchUtils.workflowFileFor(ISelection)org.eclipse.xtext.xtext.launcher.WorkflowLaunchUtils.workflowFileFor(IEditorPart)它适用于mwe2文件,但很容易将它用于你的DSL。