Прямого пути нет, но это возможно. Boolean особенно сложен, так как компилятор с радостью применяет все виды приведений типов (например, преобразует int в boolean без жалоб). У меня была точно такая же проблема, и я сделал следующие шаги:
- ASTTransformation для установки типа возвращаемого значения в логическое значение (необязательно, был артефактом полуработающей более ранней итерации)
- ASTTransformation для материализации всех возвращаемых операторов
- TypeCheckingExtension, чтобы посетить ReturnStatements и убедиться, что они имеют тип boolean
- ASTTransformation для выполнения статического преобразования типов с помощью TypeCheckingExtension
Для 1:
Расширить ClassCodeVisitorSupport
, в visitMethod
указать все методы, которые вы хотите вернуть логическое (например, проверить соответствие соглашений об именах)
Установите returnType
для MethodNode
на ClassHelper.boolean_TYPE
Для 2:
Для тех же методов, что и выше, вызовите org.codehaus.groovy.classgen.ReturnAdder.visitMethod
Для 3:
Расширить AbstractTypeCheckingExtension
, переопределить afterVisitMethod
. На этом этапе AbstractTypeCheckingExtension
выведет нижнюю границу всех выражений внутри метода. Используйте ClassCodeVisitorSupport
подкласс и переопределите visitReturnStatement
. Используйте getType(statement.expression)
, чтобы получить предполагаемый тип. Обратите внимание, что это может отличаться от statement.expression.type
(тип в соответствии с AST). Вызовите addStaticTypeError
для не булева типа.
Для 4:
Продлить StaticTypesTransformation
Переопределите newVisitor
и создайте новый StaticTypeCheckingVisitor
и вызовите addTypeCheckingExtension
, чтобы добавить TypeCheckingExtension
Проект GitHub
https://github.com/MeneDev/groovy-dsl-building-blocks-enforce-return-type
Может даже использоваться в качестве зависимости;)