4

この記事に続いて、Eclipse jdt/astを試してみようとしています。

これは入力としてのJavaコードです:

class Hello
{
    int hello()
    {
        int a = 0, b = 3;
        /* hello */
        {
            b = a * 3;
        }
        return a;
    }
    public static void main(String[] args)
    {   
        int z = 0, i = 3;
        /* hello */
        {
            i = z * 3;
        }
    }
}

ASTViewを使用すると、VariableDeclarationFragment対応するバインディングがあることを示します。 ここに画像の説明を入力してください

ただし、このビジターコードではVariableDeclarationFragment node、4つのローカル変数(a、b、z、i)のnull値をresolveBinding()戻り値として常に取得します。

これの何が問題になっていますか?私は日食インディゴを使用しています。

ここに画像の説明を入力してください

これはASTを取得するためのコードです

private static CompilationUnit createCompilationUnit(String sourceFile) {
    String source = readWithStringBuilder(sourceFile);
    ASTParser parser = ASTParser.newParser(AST.JLS3); 
    parser.setKind(ASTParser.K_COMPILATION_UNIT);
    parser.setSource(source.toCharArray()); // set source
    parser.setResolveBindings(true); // we need bindings later on
    return (CompilationUnit) parser.createAST(null /* IProgressMonitor */); // parse
}
4

3 に答える 3

5

これは、setResolveBindingsドキュメントの次の理由で発生します。

バインディング情報はJavaモデルから取得されます。これは、コンパイル単位がJavaモデルを基準にして配置されている必要があることを意味します。これは、ソースコードがsetSource(ICompilationUnit)またはsetSource(IClassFile)のいずれかからのものである場合に自動的に発生します。ソースがsetSource(char [])によって提供される場合、場所は、setProject(IJavaProject)またはsetEnvironment(String []、String []、String []、boolean)とユニット名setUnitName(文字列)。ドキュメントコメントチェックに影響を与えるコンパイラオプションは、ドキュメントコメント内のノードのバインディングが解決されるかどうかにも影響を与える可能性があることに注意してください。

つまり、(リンクから)そのようなものを使用できるということです。

IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IProject project = root.getProject("someJavaProject");
project.open(null /* IProgressMonitor */);

IJavaProject javaProject = JavaCore.create(project);

setProject呼び出しを追加します。

private static CompilationUnit createCompilationUnit(String sourceFile,
        IJavaProject javaProject) {
    String source = readWithStringBuilder(sourceFile);
    ASTParser parser = ASTParser.newParser(AST.JLS3); 
    parser.setKind(ASTParser.K_COMPILATION_UNIT);
    parser.setSource(source.toCharArray()); // set source
    parser.setProject(javaProject);
    parser.setResolveBindings(true); // we need bindings later on
    return (CompilationUnit) parser.createAST(null /* IProgressMonitor */); // parse
}

2番目のアプローチ(なしsetProject):

private static CompilationUnit createCompilationUnit(String sourceFile,
        String unitName) {
    String source = readWithStringBuilder(sourceFile);
    ASTParser parser = ASTParser.newParser(AST.JLS3); 
    parser.setKind(ASTParser.K_COMPILATION_UNIT);
    parser.setSource(source.toCharArray()); // set source
    String[] classpathEntries = ...;
    String[] sourcepathEntries = ...;
    parser.setEnvironment(classpathEntries, sourcepathEntries, null, true);
    parser.setUnitName(unitName);
    parser.setResolveBindings(true);
    // optional
    // parser.setBindingsRecovery(true);
    return (CompilationUnit) parser.createAST(null /* IProgressMonitor */); // parse
}
于 2012-10-09T00:01:03.107 に答える
0

これは、現在のプロジェクトでASTParserを実行するソースコードをインポートする必要があることを意味しますか?

現在、UIMAフレームワークを組み込んだASTParserを使用しています。そのフレームワークでは、char[]でのみソースコードを取得できました。対応するIJavaProjectとUnitNameを取得する方法がわかりません。これは、char []に.setSource()を設定する場合に必要です。

于 2013-03-01T23:52:33.593 に答える
0

次のコードを使用してこれを解決してみました

protected static CompilationUnit parseStatements(String source) {
    ASTParser parser = ASTParser.newParser(AST.JLS8);
       parser.setSource(source.toCharArray());
    parser.setKind(ASTParser.K_COMPILATION_UNIT);
    parser.setResolveBindings(true);

    parser.setEnvironment( // apply classpath
            new String[] { "//home//user//Projects//SmartCopy//ASTParser_Test//bin" }, //
            null, null, true);
    parser.setUnitName("any_name");
    final CompilationUnit cu = (CompilationUnit) parser.createAST(null);
    return cu;

}


static void newcheckVariableDeclaration(){
    String source ="package javaproject;" // package for all classes
            + "class Dummy {"
            + "int j;" //
            + "   public void add(){"
            + "int x=0,y=0;"
            + "j=x+y;\n" //
            + "   }" //
            + "}"; 

    final CompilationUnit root = parseStatements(source);
    root.accept(new ASTVisitor() {
        public boolean visit(SimpleName node) {
            System.out.println(node.toString());
            if(node.resolveBinding() == null){
                System.out.println(node.toString()+" is not declared");
            }
            else{
                System.out.println(node.toString() + " is declared");
            }
            System.out.println();
            return true;
        }
    });
于 2014-07-02T20:51:11.893 に答える