我如何编写 Intellij 插件来显示来自静态分析的 python class 方法 return 值(对于非常简单的表达式)?

how do I write Intellij plugin to display python class methods return value from static analysis (for very simple expressions)?

我想编写 Intellij 插件,它可以显示 return 由 class def() 在 python 中编辑的值。我希望尽可能多地评估这些值并通过静态分析来完成。我需要它仅适用于一个特定用例中的非常简单的表达式。

我们的 python 代码库中有 class 定义,由许多 非常 简单的 def() 组成。 所有 defs 只是一个 return 语句 returning 非常简单的表达式。 所有代码都遵循相同的模式并使用很少的 python 运算符。

代码很长,很难理解。 在这个 class 中“定义”几次后,我不记得自己在哪里了。

我希望一些 intellij 插件可以减轻痛苦。

举个例子。这是一个简短且非常简化的代码片段。希望这足以证明问题。

class SomeClass(object):
    def __init__(self, param):
        self.param = param
    def a(self):
        return self.param + 1
    def b(self):
        return self.a + otherfunc()
    def c(self):
        return self.b + 3

我希望插件显示以下内容:

class SomeClass(object):
    def __init__(self, param):
        self.param = param
    def a(self): # = param + 1
        return self.param + 1
    def b(self): # = param + 1 + otherfunc()
        return self.a + otherfunc()
    def c(self): # = param + 1 + otherfunc() + 3
        return self.b + 3

这只是一个例子,真正的代码更有意义。但是表达式本身就是这么简单。

评论代表插件输出。我希望这些值始终作为代码提示、工具提示或其他内容可见。并在我输入时进行更新。

我不想评估 defs,因为某些值在运行前不可用。我想从 AST 中获取表达式本身。

显然这在一般情况下是不可能做到的。但是我在我们的代码库中有一个非常具体的用例 其中使用了非常小的 python 子集。所有代码都遵循相同的模式。

我已经在 python 中使用 ast 模块执行此操作。我想知道是否有办法在 Intellij 中即时执行相同的操作。

有什么方法可以实现吗?或类似的东西? 有没有类似的插件?

我怀疑是否存在。至少不完全是。所以我想尝试自己实现它。 (用例很常见而且很烦人)。 我浏览了一些 Intellij Platform Plugin SDK 文档。我仍然不清楚从哪里开始。

那么从头开始或使用另一个插件作为示例来实现它的最简单方法是什么?

是否有一个开源插件可以做类似的事情,我可以看看如何自己实现它?

我最好的猜测是我需要实施:

但我不知道如何开始实施上述任何一项。 (我大概能猜出 PSI 部分)

我搜索了现有的插件,但找不到任何接近的插件。我浏览了文档,完成了教程,但我无法弄清楚我需要使用哪些扩展。

我考虑过为此使用调试器,但我看不到调试器如何帮助我。

任何帮助(插件、教程、扩展、插件示例或实施细节)将不胜感激。谢谢。

你要找的是一些extension point that will change the text user sees. I suggest you to look at the annotator class but maybe this is not the best extension point for you and you will need to find more suitable one (this is the most difficult part of creating plugins for JetBrain's IDEs). Full list of all available extension points you can find here.

找到正确的扩展点后,您需要实施它并更改 plugin.xml 以让 IDE 知道已进行了一些更改。

一些有用的链接: