【问题标题】:How to inspect/read a Java file inside a Gradle plugin如何在 Gradle 插件中检查/读取 Java 文件
【发布时间】:2018-11-18 20:36:04
【问题描述】:

我正在写一个 Gradle 插件,需要扫描 Kotlin 文件并查找类中是否包含某个接口。例如,使用以下 sn-p 代码:

class MyClass {
    interface MyInterface {
        fun doSomething()
    }
}

我的插件将在控制台上打印找到接口 MyInterface,对于这个 sn-p:

class MySecondClass {}

不会打印任何东西。

我已经成功地创建了插件结构和一个像这样的 DefaultTask,我从用户输入中获取需要检查的文件(用 Kotlin 编写):

open class MyGradleTas : DefaultTask() {

    @InputFile lateinit var inputFile: File
    @OutputDirectory lateinit var outputDirectory: File

    @TaskAction
    fun run() {
        // How can I inspect the Java/Kotlin code inside the inputFile object
    }
}

如何检查 inputFile File 对象?有没有办法将其转换为 UAST 或 PSI?如果有,怎么做?

【问题讨论】:

    标签: java gradle kotlin gradle-plugin


    【解决方案1】:

    所以我找到了这个项目:http://javaparser.org/,我相信它会让我朝着正确的方向前进,但欢迎提出任何建议,因为我不知道这是否是首选/正确的方法

    【讨论】:

    • 我会说使用解析器绝对是最安全和最干净的方法,因为您不必担心自己解析文本和跟踪代码结构。 (例如,如果您通过简单地扫描文本来查找interface,则必须确保它没有被注释掉的代码。)JavaParser 看起来适合这项工作,这才是真正重要的。
    • 我相信 JavaParser 不适用于 Kotlin 文件。我在这里的 Github 页面上发了一条消息:github.com/javaparser/javaparser/issues/1640
    • 啊,抱歉。我刚刚检查了 API 的适用性;我假设是因为您建议它处理 Kotlin。我的错。看起来可能有几条来自 this discussion 的潜在客户链接
    【解决方案2】:

    我同意您的想法,即使用解析器是解决此问题的正确方法。我发现 a discussion of parsing Kotlin 指向 GitHub 上使用 antlr4 grammars to parse Kotlin 的 2 个项目。 The second project 似乎基本上是第一个的副本,但提供了一些更有用的示例来说明如何使用它。

    【讨论】:

    • 基于那些自述文件,我不知道如何使用这些工具,但似乎指向了正确的方向......
    • 这应该有助于理解这些工具:tomassetti.me/antlr-mega-tutorial
    猜你喜欢
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    相关资源
    最近更新 更多