2017-05-25 5 views
0

libclangの助けを借りて軽量のC++エディタを作成しようとしています。Eclipse Editor Plugin:Textmarkerがエディタでスタイル情報を上書きします

新しい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); 
} 

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フォーラムでこの質問をしましたが、誰もそれに答えませんでした...(here

+0

これを行うことができるように思われるので、Javaエディタのソースを調べることができます。 'DefaultDamagerRepairer'を使うようです。 –

答えて

0

私は自分自身で答えを見つけました。ファイルにマーカーを追加した後、マーカー領域が無効になったため、今回は「createPresentation」メソッドが再び呼び出されます。

これは、無効化された領域でif(newTokens != oldTokens)が構文の強調表示を破った理由です。問題を解決するためにifを削除しました。

関連する問題