Xtext,在LaunchMydslShortcut中获取Iselection Input
Xtext, get Iselection Input in the LaunchMydslShortcut
我正在尝试用 Xtext
制作一个简单的 DSL 并用解释器执行它,语法是最初的 Hello Word 项目。
我可以成功执行 .Text
文件。
在 org.xtext.example.mydsl.ui
项目中,我在 plugin.xml
文件中将其写入 运行 来自我的 class 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 :
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)
.
所以问题是,两者之间有什么区别?为什么我的项目使用第一个?我该如何使用第二个?
例如,当您从包资源管理器启动生成器时,将调用第一个 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。
我正在尝试用 Xtext
制作一个简单的 DSL 并用解释器执行它,语法是最初的 Hello Word 项目。
我可以成功执行 .Text
文件。
在 org.xtext.example.mydsl.ui
项目中,我在 plugin.xml
文件中将其写入 运行 来自我的 class 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 :
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)
.
所以问题是,两者之间有什么区别?为什么我的项目使用第一个?我该如何使用第二个?
例如,当您从包资源管理器启动生成器时,将调用第一个 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。