4

我目前正在开发一个 Eclipse 插件。这个插件包含一个依赖于 jsdt 的 JavaScript 特性的项目特性。

现在在一些细节上,我的项目可以包含的 JavaScript 有点特别。

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

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

我的问题是,我怎样才能将这些错误排除在自动为具有我性质的项目的 jsdt 验证中?

4

2 回答 2

2

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

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

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

  1. 打开项目的属性对话框。
  2. 选择建造者项目。
  3. 取消选中“JavaScript 验证器”。并按确定按钮。
  4. 从问题视图中删除当前错误和警告

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

于 2012-11-07T12:03:52.157 回答
0

经过大量研究,数小时的删除标记和调试后,我终于设法删除了我想要的错误。当然,这是一种糟糕的糟糕方式,但我已经到了一个地步,我只想让它不管它是如何完成的。

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

因此,您基本上必须关心两件事。

  1. 在验证过程结束时将创建或已经创建的实际问题标记。

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

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

所以你需要做的是:

  • 删除其中所有文件的所有不需要的问题标记buildStarting(这会从项目中即将验证的所有文件中删除问题标记)
  • 迭代( )的CategorizedProblem对象ReconcileContextgetProblems()
  • 创建一个仅包含CategorizedProblem您要保留的 s的新数组
  • 将此新数组设置为ReconcileContextwithputProblems()
  • 再次删除该文件的不需要的标记(我不知道为什么需要这样做,请不要问,我不在乎 :-/)

这种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.

于 2013-01-03T09:54:50.487 回答