多くの調査、マーカーの削除とデバッグに何時間も費やした後、最終的に必要なエラーを削除することができました。もちろん、悪い悪い方法ですが、どのように行ってもこれが機能するようにしたいところまで来ました。
jsdt の検証プロセス中に作成された既存の問題を削除したい場合は、次のことを行う必要があります (何も省略してはなりません)。
そのため、基本的に気をつけなければならないことが 2 つあります。
検証プロセスの最後に作成される、または既に作成されている実際の問題マーカー。
検証プロセスによって作成された問題。それらは型であり、メソッドに渡されるオブジェクトCategorizedProblem
によって取得できます。ReconcileContext
reconcile()
CategorizedProblem
s は、検証プロセス後に問題マーカーに変換されるようです。
だからあなたがする必要があるのは:
- 内のすべてのファイルの不要な問題マーカーをすべて削除します
buildStarting
(これにより、検証しようとしているプロジェクト内のすべてのファイルから問題マーカーが削除されます)。
- ( )の
CategorizedProblem
オブジェクトを繰り返すReconcileContext
getProblems()
CategorizedProblem
保持したいのみを含む新しい配列を作成します
- この新しい配列を
ReconcileContext
withに設定します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
。