3

我想获得两个版本的代码文件(Java/C#)之间的差异 - 并从中获得受影响的方法(名称)列表。这是否已实施?

我认为这需要对从差异返回的行进行 AST 分析。

这样做的目的是改进 checkstyle/findbugs 以仅处理 Sprint 期间触及的方法。

我查看了 eclipse 的 diff 过程:

http://dev.eclipse.org/viewsvn/index.cgi/org.eclipse.compare.tests/src/org/eclipse/compare/tests/

看起来它只适用于行号 - 而不是实际的 AST。我对 line#=>methodName 映射感兴趣。

4

3 回答 3

1

我不知道这是否会/可以帮助您,但是 Eclipse 中的 diff/compare 在它的顶部面板中执行此操作(下面是并排的两个文件/版本)。图形,是的,但也许那里有一个 API 供“公共”使用?

于 2009-05-25T07:03:38.697 回答
1

您可以使用 eclipse 的比较 api,即使不使用 eclipse 本身。搜索org.eclipse.compare

于 2009-05-25T09:28:34.737 回答
0

不知道它是否在其他地方实施。

但是你是对的,你需要一个 AST,只是为了确定方法体是什么,但你还需要名称和类型解析 + 调用图来确定两个名为 SAM 的方法是否实际上在同一个类中,因此是“版本”彼此的。

我们的 DMS Software Reengineering Toolkit 具有 Java 解析器并构造名称/类型解析和完整的调用图,因此可用于确定“方法匹配”。(当然,您可能会作弊并决定如果方法名称相同,则它们必须是变体,但是您会在 Get 和 Set 等方面得到很多误报,如果您经常这样做,那些误报会非常分散注意力)。确定了哪些“匹配”后,可以显示它们的文本。如果有很多 API 文件要比较,这将很有用。

另一种方法是将 SD 的“Smart Diff”应用于您知道是原始版本和更改版本的 Java 文件对。它比较 AST 并找到将一个映射到另一个的最小编辑。如果旧方法和新方法完全相似,它会发现并告诉您如何编辑一种方法以获得另一种方法。请参阅http://www.semdesigns.com/Products/SmartDifferencer/index.html

于 2009-06-17T10:22:39.617 回答