Xtext:添加另一个问题类别(除了警告和错误)

时间:2016-08-22 10:59:15

标签: validation warnings xtext

我想在我的DSL日食中添加第三类,所以我可以单独看到错误,警告和myNewCat。 我还希望有一个非常相似(相同的参数)函数,如warning()error(),所以我可以从验证类中调用myNewCat()。 最简单的方法是什么?

示例结果应如何 Example what the outcome should look like

1 个答案:

答案 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.myAdditionalSeveritymarkerGroupingEntry元素用于根据标记属性“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()等函数没有意义,因为我在问题代码中传输了信息,但是如果你决定使用不同的通道,你可能想要实际实现它们。