我目前正在开发一个eclipse插件。这个插件包含一个项目性质,它取决于jsdt的javaScript性质。
现在,在JavaScripts的一些细节上,我的本质项目可以包含的内容有点特殊。
但是在这两点上,jsdt的标准验证进入并将它们标记为错误(通常是正确的)。我已经设法在JavaScript验证器的属性中过滤掉这些错误(手动)。
我的问题是,如何从我的性质项目中自动排除jsdt验证中的这些错误?
答案 0 :(得分:2)
JSDT使用具体的语法分析器来生成语法错误。 你不能禁用它。只能配置语义错误或警告。
但是,您可以禁用JSDT的整个验证。
下面的解决方案将禁止在我们保存java脚本文件的某些更改时生成的错误和警告。 (自动构建,构建)
在编辑时,此解决方案无法消除编辑器中的错误或警告注释。只有在您编辑时,它们才会暂时显示在编辑器上。
答案 1 :(得分:0)
经过大量的研究,删除标记和调试后数小时终于成功删除了我想要的错误。当然,以一种坏的方式,但是我已经到了一个地步,我只是希望这个工作无论如何工作。
如果您想要删除在jsdt验证过程中创建的现有问题,您需要执行以下操作(并且您不能忽略任何内容):
org.eclipse.wst.jsdt.core.compiler.ValidationParticipant
isActive()
,buildStarting()
和reconcile()
方法。因此,您基本上需要关注两件事。
将在验证过程中创建或已经创建
的实际问题标记。验证过程创建的问题。它们属于CategorizedProblem
类型,可以通过传递给ReconcileContext
方法的reconcile()
对象获取。
在我看来,CategorizedProblem
将在验证过程后转换为问题标记。
所以你需要做的是:
buildStarting
中所有文件的所有不需要的问题标记(这会从项目中即将验证的所有文件中删除问题标记)CategorizedProblem
(ReconcileContext
)getProblems()
个对象
CategorizedProblem
的新数组ReconcileContext
putProblems()
这样的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
添加适当的扩展名。