簡體   English   中英

Eclipse編輯器插件:Textmarker覆蓋編輯器中的樣式信息

[英]Eclipse Editor Plugin: Textmarker overwrites style information in the editor

我試圖在libclang的幫助下創建一個輕量級的C ++編輯器。

我使用新的問題標記類型來標記由clang和令牌范圍給出的編譯器警告和錯誤,以進行語法着色。

在此處輸入圖片說明

如上圖所示,錯誤標記的波浪線覆蓋了語法顏色。 是否有一個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);
}

PresentationRepairer的“ createPresentation”方法

@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論壇上問過這個問題,但是沒有人回答...(請參閱此處

我自己找到了答案。 在將標記添加到文件之后,再次調用“ createPresentation”方法,這是因為標記區域無效。

這就是if(newTokens != oldTokens)在無效區域突出顯示語法的原因。 我刪除了if要解決的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM