我想在我的DSL日食中添加第三类,所以我可以单独看到错误,警告和myNewCat
。
我还希望有一个非常相似(相同的参数)函数,如warning()
和error()
,所以我可以从验证类中调用myNewCat()
。
最简单的方法是什么?
示例结果应如何
答案 0 :(得分:1)
“问题”视图使用标记属性对问题进行分组,其中一个属性是严重性(即错误,警告,信息),但您可以将其他标记属性分组,例如:类型。您可以从“视图”菜单中选择“问题”视图中的分组(“问题”视图右上角的白色向下箭头) - >分组依据 - > ...
可以使用org.eclipse.ui.markerSupport
扩展点来自定义可用的分组(参见Marker Support Reference)。我不认为在“严重性”分组中添加额外的严重性级别是可行的,因为固定数量的严重性级别在几个地方是硬编码的,例如org.eclipse.ui.internal.views.markers.Markers.getMarkerCounts(MarkerEntry[])
,但您可以创建自己的分组,这可能取决于严重性级别和其他附加条件。
此时,您可能还想考虑您要添加的组是否真的是另一个与错误,警告和信息(例如次要警告,推荐或类似信息)一致的严重性,或者您是否确实需要不同类型的分组。但是我们假设你想要另一个严重级别。
要根据自定义严重性属性添加自定义分组,请将以下扩展名添加到您的UI项目plugin.xml
:
<extension point="org.eclipse.ui.ide.markerSupport">
<markerContentGeneratorExtension generatorId="org.eclipse.ui.ide.problemsGenerator" id="org.example.mydsl.problemGeneratorExtension">
<markerGrouping id="org.example.mydsl.customSeverityGrouping" label="Custom severity">
<markerGroupingEntry id="org.example.mydsl.errorSeverity" label="Errors" priority="30" />
<markerGroupingEntry id="org.example.mydsl.warningSeverity" label="Warnings" priority="20" />
<markerGroupingEntry id="org.example.mydsl.infoSeverity" label="Infos" priority="10" />
<markerGroupingEntry id="org.example.mydsl.myAdditionalSeverity" label="My Additional severity" priority="5" />
<markerAttributeGrouping attribute="customseverity" markerType="org.eclipse.core.resources.problemmarker">
<markerAttributeMapping markerGroupingEntry="org.example.mydsl.errorSeverity" value="2" />
<markerAttributeMapping markerGroupingEntry="org.example.mydsl.warningSeverity" value="1" />
<markerAttributeMapping markerGroupingEntry="org.example.mydsl.infoSeverity" value="0" />
<markerAttributeMapping markerGroupingEntry="org.example.mydsl.myAdditionalSeverity" value="10" />
</markerAttributeGrouping>
</markerGrouping>
</markerContentGeneratorExtension>
</extension>
markerGroupingEntry
元素定义类别:三个众所周知的类别和您的其他严重性级别org.example.mydsl.myAdditionalSeverity
。 markerGroupingEntry
元素用于根据标记属性“customseverity”的值填充这些类别的问题。当属性“customseverity”的值为10时,将填充您的其他严重性级别。
现在您可以从“问题视图菜单 - &gt;分组依据 - &gt;自定义严重性”中打开此分组
在此之后,您必须确保实际设置了属性值。我认为这样做的地方是org.eclipse.xtext.ui.editor.validation.MarkerCreator.setMarkerAttributes(Issue, IResource, IMarker)
所以你必须创建自己的子类MydslMarkerCreator
:
package org.example.xsduse.ui.validation
import org.eclipse.core.resources.IMarker
import org.eclipse.core.resources.IResource
import org.eclipse.core.runtime.CoreException
import org.eclipse.xtext.ui.editor.validation.MarkerCreator
import org.eclipse.xtext.validation.Issue
class XsduseMarkerCreator extends MarkerCreator {
public static val CUSTOM_SEVERITY = "customseverity"
override protected setMarkerAttributes(Issue issue, IResource resource, IMarker marker) throws CoreException {
super.setMarkerAttributes(issue, resource, marker)
if (issue.code.startsWith("org.example.mydsl.customseverityissues.")) {
marker.setAttribute(XsduseMarkerCreator.CUSTOM_SEVERITY, 10)
} else {
marker.setAttribute(XsduseMarkerCreator.CUSTOM_SEVERITY, marker.getAttribute(IMarker.SEVERITY))
}
}
}
使用org.eclipse.xtext.diagnostics.Severity
传递标准严重性级别严重性,这是一个枚举,因此您无法扩展它。因此,您无法使用它来传递额外的严重性级别。例如,我使用问题代码来传输此信息,使用公共前缀来处理所有其他严重性级别的问题。对于其他严重性级别,我重新使用了原始严重性属性,该属性在super.setMarkerAttributes(...)
中设置。
不要忘记在UI模块(MydslUiModule
)中注册该课程:
...
class MydslUiModule extends AbstractMydslUiModule {
def Class<? extends MarkerCreator> bindMarkerCreator() {
XsduseMarkerCreator
}
...
}
现在,您可以像往常一样使用验证程序,并使用以“org.example.mydsl.customseverity”开头的问题代码。将在您的新类别中显示。
在我的例子中创建像error(),warning()等函数没有意义,因为我在问题代码中传输了信息,但是如果你决定使用不同的通道,你可能想要实际实现它们。