[英]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.