经过大量研究,数小时的删除标记和调试后,我终于设法删除了我想要的错误。当然,这是一种糟糕的糟糕方式,但我已经到了一个地步,我只想让它不管它是如何完成的。
如果您想删除在 jsdt 验证过程中创建的现有问题,您需要执行以下操作(并且您不能省略任何内容):
因此,您基本上必须关心两件事。
在验证过程结束时将创建或已经创建的实际问题标记。
验证过程产生的问题。它们属于类型CategorizedProblem
,可以通过传递给方法的ReconcileContext
对象获得。reconcile()
在我看来,CategorizedProblem
在验证过程之后 s 将被转换为问题标记。
所以你需要做的是:
- 删除其中所有文件的所有不需要的问题标记
buildStarting
(这会从项目中即将验证的所有文件中删除问题标记)
- 迭代( )的
CategorizedProblem
对象ReconcileContext
getProblems()
- 创建一个仅包含
CategorizedProblem
您要保留的 s的新数组
- 将此新数组设置为
ReconcileContext
withputProblems()
- 再次删除该文件的不需要的标记(我不知道为什么需要这样做,请不要问,我不在乎 :-/)
这种validationParticipant 的示例实现可能如下所示:(这将过滤掉抱怨方法之外的return 语句的问题:
[...ommited imports ...]
public class MyValidationParticipant extends org.eclipse.wst.jsdt.core.compiler.ValidationParticipant{
@Override
public boolean isActive(IJavaScriptProject project) {
return true;
}
@Override
public void buildStarting(BuildContext[] files, boolean isBatch) {
super.buildStarting(files, isBatch);
for(BuildContext context : files){
IFile file = context.getFile();
deleteUnwantedMarkers(file);
}
}
@Override
public void reconcile(ReconcileContext context) {
IResource resource = context.getWorkingCopy().getResource();
CategorizedProblem[] newProblems = new CategorizedProblem[0];
ArrayList<CategorizedProblem> newProblemList = new ArrayList<CategorizedProblem>();
CategorizedProblem[] probs = context.getProblems("org.eclipse.wst.jsdt.core.problem");
if(probs != null){
for(CategorizedProblem p : probs){
if(!(p.getMessage().equals("Cannot return from outside a function or method."))){
newProblemList.add(p);
}
}
}
}
context.putProblems("org.eclipse.wst.jsdt.core.problem", newProblemList.toArray(newProblems));
deleteUnwantedMarkers(resource);
}
public static void deleteUnwantedMarkers(IResource resource){
if(resource.isSynchronized(IResource.DEPTH_INFINITE)){
try {
IMarker[] markers = resource.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE);
if(markers != null && markers.length > 0){
for(IMarker m : markers){
Object message = m.getAttribute(IMarker.MESSAGE);
if(message.equals("Cannot return from outside a function or method.")){
m.delete();
}
}
}
}catch (CoreException e) {
e.printStackTrace();
}
}
}
}
正如我所说,这是一个糟糕的解决方案,因为代码依赖于错误消息的字符串。应该有更好的方法来识别您不想遇到的问题。
不要忘记在您的 plugin.xml 中为ValidationParticipant
.