Eclipse Editor插件:Textmarker在编辑器

时间:2017-05-25 16:39:52

标签: eclipse eclipse-plugin

我试图在libclang的帮助下创建一个轻量级的C ++编辑器。

我使用一个新的problemmarker类型来标记clang和令牌范围给出的编译器警告和错误以进行语法着色。

enter image description here

正如您在上图中所看到的,错误标记的波浪线会覆盖语法着色。是否有PresentationReconciler考虑到某些标记的行仍然可以有其他样式信息?

我添加了一些可能与解决问题相关的代码段: 我的plugin.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>

   <extension
         point="org.eclipse.ui.editors">
      <editor
            name="CXX Editor"
            extensions="cpp"
            icon="icons/sample.gif"
            contributorClass="org.eclipse.ui.texteditor.BasicTextEditorActionContributor"
            class="cppeditor.editors.CppEditor"
            id="cppeditor.editors.CppEditor">
      </editor>
   </extension>
   <extension
         id="cppeditor.problemmarker"
         name="clang Error"
         point="org.eclipse.core.resources.markers">
      <super
            type="org.eclipse.core.resources.problemmarker">
      </super>
      <super
            type="org.eclipse.core.resources.textmarker">
      </super>
      <persistent
            value="true">
      </persistent>
   </extension>
</plugin>

将标记添加到IFile资源的方法:

public void addMarkerToFile(IFile file, IDocument fileDocument) throws CoreException, BadLocationException{
    IMarker marker = file.createMarker("cppeditor.problemmarker");
    marker.setAttribute(IMarker.SEVERITY, this.severity);
    marker.setAttribute(IMarker.MESSAGE, this.message);
    marker.setAttribute(IMarker.LINE_NUMBER, this.line);
    int startOffset = fileDocument.getLineOffset(this.line-1);
    int endOffset = fileDocument.getNumberOfLines() > this.line ? 
             fileDocument.getLineOffset(this.line) : fileDocument.getLength()-1;
    marker.setAttribute(IMarker.CHAR_START, startOffset);
    marker.setAttribute(IMarker.CHAR_END, endOffset);
}

&#34; createPresentation&#34; PresentationRepairer的方法

@Override
public void createPresentation(TextPresentation presentation, ITypedRegion region) {
    CppDocument doc = (CppDocument) this.fDocument;
    Token[] newTokens = doc.getTokens();
    if(newTokens != oldTokens){
        for(Token t : newTokens){
            addRange(
                presentation,
                t.getStart(),
                t.getEnd() - t.getStart(),
                attributeMap.get(t.getKind()));     
        }
        oldTokens = newTokens;
    }
}

注意:我已经在eclipse论坛中提出了这个问题,但是没有人回答......(见here

1 个答案:

答案 0 :(得分:0)

我自己找到了答案。将标记添加到文件后,再次调用“createPresentation”方法,这次是因为标记区域无效。

这就是为什么if(newTokens != oldTokens)打破了无效区域的语法高亮显示。我删除了if以解决问题。