智能搜索和生成Java代码,最好使用Python?

时间:2010-04-23 22:22:41

标签: java python parsing code-generation

基本上,我在Java中进行了大量的一次性代码生成,大规模重构等。

我选择的工具语言是Python,但我会采用你能提供的任何解决方案。


以下是我想要的简化插图,以伪代码

为界面生成实施

search within my project:
  for each Interface as iName:
    write class(name=iName+"Impl", implements=iName)
    search within the body of iName:
      for each Method as mName:
        write method(name=mName, body="// TODO implement this...")

基本上,我正在寻找的工具可以让我:

  • 根据Java结构解析文件(“搜索接口”)
  • 搜索由语言元素和类型(“SomeClass类型的变量”,“对SomeClass实例的doStuff()方法调用”进行语境化的单词)
  • 使用结构上下文(“在当前结果的主体内”)运行搜索
  • 可以轻松替换或生成代码(如上所述生成帮助程序,或者替换函数,“将接口重命名为Foo”,“插入行Blah.Blah()”等。)

关键是,我不想花很多时间写这些东西,因为它们通常是一次性的。但有时我需要的东西比grep提供的东西更聪明。写一个简单版本并不难,但如果我要使用这样的东西,我希望它能够很强大。

有关工具/库的任何建议可以帮助我实现这一目标吗?


编辑以添加一些说明

  1. Python绝对没有必要;我会接受那些。我只是建议有选择。
  2. 这与IDE重构结合使用;有时它只是没有做我想做的一切。
  3. 在我用于代码生成的情况下(如上所述),它用于增加其他代码生成器的输出。例如我们使用的库输出了大量的接口,我们需要对每个接口进行标准实现,以将其与我们的代码库相连接。

3 个答案:

答案 0 :(得分:2)

首先,我不知道在Python中实现的任何专门用于重构Java代码的工具或库,而Google搜索没有给我任何线索。

其次,我认为编写如此体面的工具或库来重构Python中的Java将是一项艰巨的任务。您必须在Python中实现Java编译器前端(词法分析器/解析器,AST构建器和类型分析器),然后找出如何将其与程序编辑器集成。我并不感到惊讶,因为已经存在成熟的替代品,所以没有人这样做过。

第三,在没有对源代码进行全面分析的情况下进行重构(但是使用模式匹配)将无法进行复杂的重构,并且很可能在实现者没有想到的边缘情况下出错。我希望这是OP当前运作的水平......

鉴于前景黯淡,有哪些替代方案:

另一种方法是使用现有的Java IDE之一(例如NetBeans,Eclipse,IDEA等)作为重构工具。 OP将无法在Python代码中扩展此类工具的功能,但他可能不会真正需要。我希望这些IDE中至少有一个可以满足他所需要的95%,并且(如果他是现实的话)应该足够好。特别是当您认为IDE具有许多附带功能时,有助于使重构更容易;例如结构化编辑,撤消/重做,增量编译,智能代码完成,智能搜索,类型和调用层次结构视图等。

(除此之外......如果现有的IDE不够好(@WizardOfOdds - 只有OP可以进行调用!!),尝试扩展现有IDE的重构功能比重新启动更有意义。一种不同的实现语言。)

根据他实际做的事情,模型驱动的代码生成可能是另一种选择。例如,如果由于经常创建和重新创建对象模型而发生重构,那么另一种方法是使用某些建模语言对模型进行编码并从这些模型生成代码。在做这种事情时,我选择的工具是Eclipse EMF和相关技术。 EMF技术包括编辑器生成,XML序列化,持久性,查询,模型到模型转换等。我已经使用EMF来实现和推出具有50到100个不同类的对象模型的项目,这些类具有复杂的关系和验证要求。当您从更新的模型重新生成时,EMF支持合并源代码编辑是一个关键特性。

答案 1 :(得分:0)

如果您使用Java编码,我强烈建议您使用NetBeans IDE。它内置了这种重构支持。 Eclipse也支持这种事情(虽然我更喜欢NetBeans)。这两个项目都是开源的,所以如果你想看看他们如何执行这个重构,你可以查看它们的源代码。

答案 2 :(得分:0)

Java现在有很多批评,但在工具领域 - 这是不合理的。

我们被宠坏了选择; Eclipse,Netbeans,Intellij是三大IDE。所有这些都提供了极好的搜索和重构水平。我认为Eclipse在Netbeans方面具有优势,而Intellij通常领先于Eclipse

您还可以使用静态分析工具(如FindBugs,CheckTyle等)来查找问题 - 即过长的方法和类,过于复杂的代码。

如果你真的想利用你的Python技能 - 看看Jython。它是一个用Java编写的Python解释器。