2017-05-25 77 views
0

我試圖在libclang的幫助下創建一個輕量級的C++編輯器。Eclipse Editor插件:Textmarker在編輯器中覆蓋樣式信息

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

enter image description here

正如你可以在上面的圖片看到的,誤差標記的波浪線覆蓋語法着色。是否有一個PresentationReconciler考慮到某些標記行可能還有其他樣式信息?

我添加了一些代碼片段,可能是有關解決問題: 我plugin.xml文件:

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); 
} 

的:

<?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資源的方法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; 
    } 
} 

注:我已經在日食論壇上問過這個問題,但沒有人回答...(見here

+0

您可以嘗試查看Java編輯器源代碼,因爲它似乎可以執行此操作。它似乎使用'DefaultDamagerRepairer'。 –

回答

0

我自己找到了答案。在向文件添加標記之後,再次調用「createPresentation」方法,這次是因爲標記區域失效。

這就是爲什麼if(newTokens != oldTokens)打破了無效區域的語法突出顯示。我刪除了if以解決問題。