在JavaScript验证中抑制错误

时间:2012-10-31 07:20:33

标签: eclipse eclipse-plugin eclipse-rcp jsdt

我目前正在开发一个eclipse插件。这个插件包含一个项目性质,它取决于jsdt的javaScript性质。

现在,在JavaScripts的一些细节上,我的本质项目可以包含的内容有点特殊。

  • 它们可以包含“编译器提示”,它们是以#
  • 开头的基本语句
  • 它们可以包含函数之外的return语句

但是在这两点上,jsdt的标准验证进入并将它们标记为错误(通常是正确的)。我已经设法在JavaScript验证器的属性中过滤掉这些错误(手动)。

我的问题是,如何从我的性质项目中自动排除jsdt验证中的这些错误?

2 个答案:

答案 0 :(得分:2)

JSDT使用具体的语法分析器来生成语法错误。 你不能禁用它。只能配置语义错误或警告。

但是,您可以禁用JSDT的整个验证。

下面的解决方案将禁止在我们保存java脚本文件的某些更改时生成的错误和警告。 (自动构建,构建)

  1. 打开项目的属性对话框。
  2. 选择建设者项目。
  3. 取消选中“JavaScript Validator”。然后按确定按钮。
  4. 问题视图
  5. 中删除当前错误和警告

    在编辑时,此解决方案无法消除编辑器中的错误或警告注释。只有在您编辑时,它们才会暂时显示在编辑器上。

答案 1 :(得分:0)

经过大量的研究,删除标记和调试后数小时终于成功删除了我想要的错误。当然,以一种坏的方式,但是我已经到了一个地步,我只是希望这个工作无论如何工作。

如果您想要删除在jsdt验证过程中创建的现有问题,您需要执行以下操作(并且您不能忽略任何内容):

因此,您基本上需要关注两件事。

  1. 将在验证过程中创建或已经创建

    的实际问题标记。

  2. 验证过程创建的问题。它们属于CategorizedProblem类型,可以通过传递给ReconcileContext方法的reconcile()对象获取。

  3. 在我看来,CategorizedProblem将在验证过程后转换为问题标记。

    所以你需要做的是:

    • 删除buildStarting中所有文件的所有不需要的问题标记(这会从项目中即将验证的所有文件中删除问题标记)
    • 迭代CategorizedProblemReconcileContext
    • 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添加适当的扩展名。