4

私は現在、Eclipseプラグインを開発しています。このプラグインには、jsdt の JavaScript の性質に依存するプロジェクトの性質が含まれています。

ここでいくつかの詳細を説明すると、私の性質のプロジェクトに含めることができる JavaScript はいくぶん特別なものです。

  • これらには、基本的に # で始まるステートメントである「コンパイラ ヒント」を含めることができます。
  • 関数の外に return ステートメントを含めることができます

しかし、この 2 つの時点で jsdt の標準的な検証が行われ、エラーとしてマークされます (通常は正しい)。このエラーは、JavaScript バリデーターのプロパティで (手動で) 除外することができました。

私の質問は、私の性質を持つプロジェクトのjsdtの検証からこれらのエラーを自動的に除外するにはどうすればよいですか?

4

2 に答える 2

2

JSDT は、構文エラーを生成する具象構文パーサーを使用します。これを無効にすることはできません。セマンティクス エラーまたは警告のみを設定できます。

ただし、JSDT の検証全体を無効にすることができます。

以下の解決策は、java スクリプト ファイルにいくつかの変更を保存するときに生成されるエラーと警告を抑制します。(オートビルド、ビルド)

  1. プロジェクトのプロパティ ダイアログを開きます。
  2. ビルダーアイテムを選択します。
  3. 「JavaScript バリデーター」のチェックを外します。OKボタンを押します。
  4. 問題ビューから現在のエラーと警告を削除します

この解決策では、編集中にエディターでエラーまたは警告の注釈を排除することはできません。それらは、編集時にのみ一時的にエディターに表示されます。

于 2012-11-07T12:03:52.157 に答える
0

多くの調査、マーカーの削除とデバッグに何時間も費やした後、最終的に必要なエラーを削除することができました。もちろん、悪い悪い方法ですが、どのように行ってもこれが機能するようにしたいところまで来ました。

jsdt の検証プロセス中に作成された既存の問題を削除したい場合は、次のことを行う必要があります (何も省略してはなりません)。

そのため、基本的に気をつけなければならないことが 2 つあります。

  1. 検証プロセスの最後に作成される、または既に作成されている実際の問題マーカー。

  2. 検証プロセスによって作成された問題。それらは型であり、メソッドに渡されるオブジェクトCategorizedProblemによって取得できます。ReconcileContextreconcile()

CategorizedProblems は、検証プロセス後に問題マーカーに変換されるようです。

だからあなたがする必要があるのは:

  • 内のすべてのファイルの不要な問題マーカーをすべて削除しますbuildStarting(これにより、検証しようとしているプロジェクト内のすべてのファイルから問題マーカーが削除されます)。
  • ( )のCategorizedProblemオブジェクトを繰り返すReconcileContextgetProblems()
  • CategorizedProblem保持したいのみを含む新しい配列を作成します
  • この新しい配列をReconcileContextwithに設定します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

于 2013-01-03T09:54:50.487 に答える