gpt4 book ai didi

java - Groovy:如何从 AST 中获取静态推断的返回类型

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:08:26 28 4
gpt4 key购买 nike

我使用 Groovy 允许用户编写脚本和自定义我的 Java 应用程序的某些部分。我正在使用所有用户提供的脚本的静态编译。

我的问题是:如果我的代码期望收到例如作为用户脚本结果的 boolean 类型的值,我有什么方法可以检查提供的用户脚本是否总是返回 boolean 值而不实际执行脚本?换句话说,我如何访问静态 groovy 编译器执行的类型推断的结果?我希望能够在用户编辑脚本内容时告诉他们“嘿,您的脚本并不总是返回 boolean 值”。

最佳答案

没有直接的方法,但有可能。 boolean 值特别难,因为编译器会很乐意应用各种类型强制转换(例如,将 int 转换为 boolean 而不会提示)。我遇到了完全相同的问题并执行了以下步骤:

  1. 将返回类型设置为 boolean 值的 ASTTransformation(不是必需的,是早期迭代的半成品)
  2. ASTTransformation 对所有返回语句进行计量
  3. TypeCheckingExtension 访问 ReturnStatements 并验证它们是 boolean 类型
  4. ASTTransformation 使用 TypeCheckingExtension 执行静态类型转换

对于 1:

扩展 ClassCodeVisitorSupport,在 visitMethod 中标识您要返回 boolean 值的所有方法(例如检查匹配的命名约定)

MethodNodereturnType设置为ClassHelper.boolean_TYPE

对于 2:

对于与上面相同的方法调用 org.codehaus.groovy.classgen.ReturnAdder.visitMethod

对于 3:

扩展AbstractTypeCheckingExtension,覆盖afterVisitMethod。此时,AbstractTypeCheckingExtension 将推断出该方法内所有表达式的下限。使用 ClassCodeVisitorSupport 子类并覆盖 visitReturnStatement。使用 getType(statement.expression) 获取推断类型。请注意,这可能不同于 statement.expression.type(根据 AST 的类型)。对非 boolean 类型调用 addStaticTypeError

对于 4:

扩展StaticTypesTransformation覆盖 newVisitor 并创建一个新的 StaticTypeCheckingVisitor 并在其上调用 addTypeCheckingExtension 以添加您的 TypeCheckingExtension

GitHub 项目

https://github.com/MeneDev/groovy-dsl-building-blocks-enforce-return-type

它甚至可以作为依赖项重用 ;)

关于java - Groovy:如何从 AST 中获取静态推断的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50337623/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com