2013-04-30 78 views
0

我目前正在开发编程导师。这些导师是独立的Java应用程序。我使用Eclipse JDT来解析Java源代码并构建相应的抽象语法树。此外,我想捕获如果学生在Eclipse中编译他的代码时将会启动的错误消息。 Eclipse使我们能够解析和跟踪特定字符串代码的错误消息(无需上下文)。在编译完字符串之后,我收到了9条错误消息。当我在Eclipse项目中粘贴该代码时,我收到了大约90条错误消息。显然,目的是尽可能多地跟踪错误。我怀疑这取决于源代码的上下文。跟踪Eclipse JDT编译器错误消息(IProblem)

为此,我尝试以编程方式创建工作区内的项目并创建包含源代码字符串的文件。但是,执行我的Java应用程序时,出现以下错误消息:

Exception in thread "main" java.lang.IllegalStateException: Workspace is closed. 
    at org.eclipse.core.resources.ResourcesPlugin.getWorkspace(ResourcesPlugin.java:399) 
    at com.example.helloworld.JavaErr.main(JavaErr.java:67) 

我阅读了许多关于此主题的文章。我们似乎只能在Eclipse插件项目中访问工作区内的资源。在放弃这个“解决方案”路径之前,是否有可能知道我们是否可以在外部独立Java应用程序中以编程方式访问工作区及其所有资源?

回答

0

我最终需要解决char []源代码与其环境(setEnvironment)之间的绑定,并设置编译单元的名称。通过设置环境,我们可以绕过工作区并通过导入适当的库(类路径)和源代码(源路径)来创建自己的“虚拟”项目。

如果有人想要检索语法错误,他只需启用语句的恢复。因此,我们能够在独立Java应用程序中解析外部Java文件,并检索与实际Eclipse项目中相同数量的错误(包声明错误除外)。

下面是代码片段我使用:

 File file = new File(""); 
     String srcCode = Files.toString(file, Charsets.UTF_8); 
     ASTParser parser = ASTParser.newParser(AST.JLS3); 
     parser.setSource(srcCode.toCharArray()); 
     parser.setKind(ASTParser.K_COMPILATION_UNIT); 
     Map options = JavaCore.getOptions(); 
     JavaCore.setComplianceOptions(JavaCore.VERSION_1_5, options); 
     parser.setCompilerOptions(options); 

     String[] classpath = {"", "", ""}; 
     String[] sourcepath = {""}; 

     parser.setEnvironment(classpath, sourcepath, null, true); 
     parser.setUnitName(""); 
     parser.setResolveBindings(true); 
     parser.setBindingsRecovery(true); 
     parser.setStatementsRecovery(true); 
     CompilationUnit cu = (CompilationUnit) parser.createAST(null); 
     cu.accept(new ASTVisitor2(cu));