我试图在libclang的帮助下创建一个轻量级的C ++编辑器。
我使用一个新的problemmarker类型来标记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);
}
&#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)
答案 0 :(得分:0)
我自己找到了答案。将标记添加到文件后,再次调用“createPresentation”方法,这次是因为标记区域无效。
这就是为什么if(newTokens != oldTokens)
打破了无效区域的语法高亮显示。我删除了if
以解决问题。