- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我所拥有的:我在编辑器中将错误显示为红色下划线,并在问题 View 中显示为其他错误。我为此使用标记,但也通过以下代码创建注释:
@TextEditorScoped
public class ErrorHighlighter {
private final IAnnotationModel annotationModel;
private String content = "";
private final Set<Annotation> annotations = Sets.newConcurrentHashSet();
private static final String ERRORMARKERID = "org.eclipse.rwth.syntaxerror";
private static final String WARNINGMARKERID = "org.eclipse.rwth.syntaxwarning";
@Inject
public ErrorHighlighter(@Nullable IAnnotationModel annotationModel, IStorage storage,
ObservableModelStates observableModelStates) {
this.annotationModel = annotationModel;
if (annotationModel != null) {
observableModelStates.getModelStates().stream()
.filter(modelState -> modelState.getStorage().equals(storage))
.forEach(this::acceptModelState);
observableModelStates.addStorageObserver(storage, this::acceptModelState);
}
}
public void acceptModelState(ModelState modelState) {
for (Annotation annotation : annotations) {
annotationModel.removeAnnotation(annotation);
annotations.remove(annotation);
}
IMarker[] problems = null;
int depth = IResource.DEPTH_INFINITE;
IFile file = Misc.getEditorInput(modelState.getStorage()).getAdapter(IFile.class);
try { //Remove all problem Markers when rebuilding the Model
problems = file.findMarkers(ERRORMARKERID, true, depth);
for(IMarker m: problems){
m.delete();
}
problems = file.findMarkers(WARNINGMARKERID, true, depth);
for(IMarker m: problems){
m.delete();
}
} catch (CoreException e) {
e.printStackTrace();
}
try {
content = IOUtils.toString(modelState.getStorage().getContents(), "UTF-8");
} catch (IOException e) {
e.printStackTrace();
} catch (CoreException e) {
e.printStackTrace();
}
displaySyntaxErrors(modelState);
displayAdditionalErrors(modelState);
}
private void displaySyntaxErrors(ModelState modelState) {
ImmutableMultimap<Interval, String> syntaxErrors = modelState.getSyntaxErrors();
for (Interval interval: syntaxErrors.keys()) {
for (String message : syntaxErrors.get(interval)) {
Display.getDefault().asyncExec(() -> displayError(interval, message));
}
}
}
private void displayAdditionalErrors(ModelState modelState) {
Multimap<Interval, String> additionalErrors = modelState.getAdditionalErrors();
for (Interval interval: additionalErrors.keys()) {
for (String message : additionalErrors.get(interval)) {
Display.getDefault().asyncExec(() -> displayError(interval, message));
}
}
}
private void displayError(Interval interval, String message) {
int startIndex = interval.a;
int stopIndex = interval.b + 1;
Annotation annotation = null;
// Annotation annotation =
// new Annotation("org.eclipse.ui.workbench.texteditor.error", false, message);
// annotations.add(annotation);
// annotationModel.addAnnotation(annotation, new Position(startIndex, stopIndex - startIndex));
IMarker marker = null;
try { //create Marker to display Syntax Errors in Problems View
IFile file = (IFile) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor().getEditorInput().getAdapter(IFile.class);
if (file != null) {
if(message.charAt(message.length()-1) == 'W'){
marker = file.createMarker(WARNINGMARKERID);
marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_WARNING);
} else {
marker = file.createMarker(ERRORMARKERID);
marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR);
}
marker.setAttribute(IMarker.MESSAGE, message);
marker.setAttribute(IMarker.CHAR_START, startIndex);
marker.setAttribute(IMarker.CHAR_END, stopIndex);
marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_HIGH);
int lineNumber = 0;
if(!content.isEmpty() && content.length()>=stopIndex){ //Convert StartIndex to Line Number
String[] lines = content.substring(0, stopIndex).split("\r\n|\r|\n");
lineNumber = lines.length;
}
marker.setAttribute(IMarker.LINE_NUMBER, lineNumber);
}
} catch (CoreException e) {
e.printStackTrace();
}
IMarker[] problems = null;
int depth = IResource.DEPTH_INFINITE;
IFile file = (IFile) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor().getEditorInput().getAdapter(IFile.class);
try { //Remove all problem Markers when rebuilding the Model
problems = file.findMarkers(ERRORMARKERID, true, depth);
for(IMarker m: problems){
for(IMarker n: problems){
if(MarkerUtilities.getCharStart(m) == MarkerUtilities.getCharStart(n) && m != n && MarkerUtilities.getMessage(m).equals(MarkerUtilities.getMessage(n))){
m.delete();
}
}
}
} catch (CoreException e) {
e.printStackTrace();
}
if(marker != null){
Annotation a = new MarkerAnnotation(marker);
annotations.add(a);
annotationModel.addAnnotation(a, new Position(startIndex, stopIndex - startIndex));
}
}
}
在我的 SourceViewerConfiguration 中,我使用以下代码覆盖 getTextHover 和 getAnnotationHover:
@Override
public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) {
return new DefaultAnnotationHover(true);
}
public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType) {
return new DefaultTextHover(sourceViewer);
}
我还用以下代码覆盖 getQuickAssistAssistant:
public IQuickAssistAssistant getQuickAssistAssistant(ISourceViewer sourceViewer) {
IQuickAssistAssistant quickAssist = new QuickAssistAssistant();
quickAssist.setQuickAssistProcessor(new TFQuickAssistProcessor());
quickAssist.setInformationControlCreator(getInformationControlCreator(sourceViewer));
return quickAssist;
}
有了这个,我可以右键单击代码中的错误并选择“快速修复”,这将导致出现一个框,其中显示我的快速修复建议。
我想要什么:当我将鼠标悬停在错误上方时,如何使此框出现?提前致谢
最佳答案
回答我自己的问题:我用以下方法替换了 getTextHover
方法:
public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType) {
return new AbstractAnnotationHover(true) {
public Object getHoverInfo2(ITextViewer textViewer, IRegion hoverRegion) {
IAnnotationModel model = ((SourceViewer) textViewer).getAnnotationModel();
@SuppressWarnings("unchecked")
Iterator<Annotation> parent =
((IAnnotationModelExtension2)model).getAnnotationIterator(hoverRegion.getOffset(),
hoverRegion.getLength(), true, true);
Iterator<?> iter = new JavaAnnotationIterator(parent, false);
Annotation annotation = null;
Position position = null;
while (iter.hasNext()) {
Annotation a = (Annotation) iter.next();
Position p = model.getPosition(a);
annotation = a;
position = p;
}
return new AnnotationInfo(annotation, position, textViewer) {
public ICompletionProposal[] getCompletionProposals() {
ICompletionProposal proposal1 = null;
IMarkerResolution [] resolutions = null;
ICompletionProposal [] com = null;
if (annotation instanceof MarkerAnnotation) {
resolutions = new ErrorResolution().getResolutions(((MarkerAnnotation) annotation).getMarker());
if(resolutions.length != 0){
proposal1 = new MarkerResolutionProposal(resolutions[0],
((MarkerAnnotation) annotation).getMarker());
return new ICompletionProposal[] { proposal1 };
}
}
return com ;
}
};
}
};
}
这将导致错误上方出现一个悬停框,提供快速修复。希望这有帮助!
关于java - Eclipse插件: Implement Quick Fix proposals on hovering over errors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37587545/
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 3 年前。 Improve this qu
如何修复找不到插件“proposal-numeric-separator”,当我尝试构建我的 React 应用程序时收到此错误,我尚未弹出该应用程序: ./src/index.js Error: [B
我想我可能遇到了一个小故障。昨晚我遇到了一个错误,说“找不到插件”proposal-class-static-block”。确保 ./available-plugins.js 中有一个条目。”每次我在
TL;博士:当与会者为事件提议了新时间时,组织者是否可以通过 Google Calendar API 检索提议的新时间,例如来自 Events: get或 Events: list ? 示例流程 组织
目前,我正在研究 React 项目。它工作正常。但是现在每当我启动 npm 时。它给了我错误 - $ react-scripts start i 「wds」: Project is running a
同时等待 question 的答复我想讨论可能的实现计划/细节,或者总体上回答实现以下内容有多困难以及需要哪些工具/技术: (摘自所提到的问题): Suppose you need to implem
我在我的 package.json 中添加了这两个 devDependencies: "@babel/plugin-proposal-class-properties": "^7.1.0", "@ba
我最近在 Win7 64 计算机上安装了 Eclipse Kepler CDT。它运行良好(嗯,有点),但是 - 它一直在运行,状态栏显示 Updating RPM packages proposal
在 Paxos made simple 中,Lamport 将算法的阶段 2 (a) 描述如下: If the proposer receives a response to its prepare
我有这样一个项目结构: /main-folder /apps /app — // I want to import "project-b" here /node_modules
最近一篇关于 HTML5 的文章说,Proposed Recommendation 日期是 2022 年,Candidate Recommendation 日期是 2012 年。 我想知道“Propo
Macports 是我在 Mac 上检查过的唯一打包系统,但我不喜欢它。(它需要将所有应用程序安装在特定位置。这可能是它显示 Python2.5 作为依赖项甚至需要安装的原因虽然我已经有了它。)对于一
我的应用程序在浏览器中运行良好,并在我启动 android 构建时使用 Cordova Geolocation 作为插件我收到此错误 An unhandled exception occurred:
在 c++20 的范围库中,所有 View 都有第二个版本。 例如,std::ranges::views::filter 我们有实际的类(class),std::ranges::filter_view
我刚刚添加了 this babel 插件,以便利用从 'a/module' 导出 aDefault。 效果很好,因为我可以从其他文件导入这样的导出,但 eslint 也不放过我。它无情地突出了我的导出
我所拥有的:我在编辑器中将错误显示为红色下划线,并在问题 View 中显示为其他错误。我为此使用标记,但也通过以下代码创建注释: @TextEditorScoped public class Erro
我正在扩展 eclipse jdt 的内容辅助, 我编写了一个实现 IJavaCompletionProposalComputer 的类, 我的代码如下: final static String[]
我最近下载了 Eclipse,当我按下 Ctrl+Space 时,它没有显示任何建议。 例如,如果我有一个名为 TotalElements 的变量并且在代码的另一个地方,当我键入 Tota 然后按 c
有没有办法在 eclipse 的内容辅助功能中禁用消息“No Default Proposals”? 内容辅助功能真的很棒。然而,每当 eclipse 找不到匹配的插入并显示以下内容时,这真的很烦人:
我在 Eclipse 4.x (Juno) 中工作。 我刚买了一台 4k 显示器,数百万程序员肯定会很快购买 :-)。 我试图让 Eclipse 在非常密集(高 DPI)的环境中工作。我设法更改了所有
我是一名优秀的程序员,十分优秀!