首页 > 解决方案 > JDT ASTParser:无法解析为类型/变量

问题描述

我是新来的,我目前正在使用 eclipse-jdt 开发一个独立的源代码解析器。我目前有一个无法解决的问题。源代码解析器应该(在这种情况下)在日志文件中写入编译器消息:

以下代码来自访客:

for (IProblem problem : problems) {
    if (problem.isError()) {
        final String msg = "Problem count: " + problems.length + " in " + resource.getAbsolutePath()
                + "\n\tERROR: " + problem.getSourceLineNumber() + " > " + problem.getMessage();
        logger.log(Level.INFO, msg);
        continue; // do not count errors
    }
    // ... 
    logCompilerMessage(getFullQualifiedName(), mainAuthor, problem);
}

例如,在解析方法 readData 时:

package testproj.pckg.billing;
//...
public class Bill {
    private boolean readData(MODETYPE modeType) { 
        // MODETYPE is an enum in other class but in the same package
    }
}

该程序会将枚举 MODETYPE “分类”为 Bill2.java 类中的错误:

package testproj.pckg.billing;
// ...
public class Bill2 {
    // ...
}

enum MODETYPE { 
    // ...
}

输出将如下所示:

问题计数:E:\ws\preview\project\src\testproj\pckg\billing\Bill.java 中的 8 个
错误:1925 > MODETYPE 无法解析为类型

这是我的解析方法:

private void parse(ProjectInfo project, File resource) {
    final ASTParser parser = ASTParser.newParser(AST.JLS11);
    parser.setResolveBindings(true);
    parser.setBindingsRecovery(true);
    parser.setStatementsRecovery(true);
    parser.setKind(ASTParser.K_COMPILATION_UNIT);
    parser.setCompilerOptions(project.getCompilerOptions());

    final Path sourcePath = Paths.get(resource.toURI());
    final char[] source = sourceToChar(sourcePath);
    if (source == null) {
        return;
    }
    parser.setSource(source);
    parser.setUnitName(resource.getName());

    final String[] sources = project.getProjectRelatedSources();
    final String[] classpaths = project.getProjectRelatedClasspaths();
    final String[] encoders = listOfEncoders(sources);

    parser.setEnvironment(classpaths, sources, encoders, true);
    // accept visitor(s)
}

编辑:我忘了给你看我的 getCompilerOptions 方法:

private Map<String, String> getCompilerOptions(ProjectInfo project) {
    final Map<String, String> list = JavaCore.getOptions();
    list.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_11);
    list.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_11);
    list.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.ENABLED);
    list.put(JavaCore.COMPILER_DOC_COMMENT_SUPPORT, JavaCore.ENABLED);

    final Config config = new Config(project.getProjectPath() + File.separator + ".settings",
            "org.eclipse.jdt.core.prefs");
    for (String key : config.keySet()) {
        list.put(key, config.value(key));
    }
    return list;
}

Config 只是我用来初始化程序的属性文件的处理程序。在这种情况下,我从 eclipse 项目中读取属性文件 org.eclipse.jdt.core.prefs 并将其作为 Map 返回。

在我们的 IDE 上一切正常并正确检测到,但在独立解析器上却不知何故。有人可以帮我吗?谢谢指教!

最好的问候, lftdbmr

标签: javaeclipse-jdt

解决方案


推荐阅读