如何定义Groovy Closure委托类型?解决IntelliJ方法提示缺失问题
解决IntelliJ中Groovy Closure内方法无提示问题
问题原因
IntelliJ的Groovy代码分析器无法在编译期推断出Closure内部的delegate类型——因为builder.delegate = new CucumberArgs()是运行时赋值的,所以IDE无法识别help()方法的存在,进而出现"No candidates found for method call help"的提示。
解决方案1:给Closure添加显式参数
修改with方法的实现,直接将CucumberArgs实例作为参数传递给Closure,让IDE明确识别参数类型:
class CucumberArgs { private Boolean _help CucumberArgs() {} Boolean getHelp() { return this._help; } CucumberArgs help(Boolean value) { this._help = value; return this; } static CucumberArgs with(Closure<CucumberArgs> builder) { def argsInstance = new CucumberArgs() builder.call(argsInstance) return argsInstance } @Override String toString() { this._help ? 'cucumber-js --help' : '' } } // 使用方式 def args = CucumberArgs.with { CucumberArgs args -> args.help(true) } println args
这种写法既保留了建造者模式的流畅性,又能让IDE正常提示help()方法。
解决方案2:使用@DelegatesTo注解提示IDE
如果想保留原有的无参数Closure写法,可以用Groovy标准库的@DelegatesTo注解,明确告诉IDE Closure的委托类型:
import groovy.lang.DelegatesTo class CucumberArgs { private Boolean _help CucumberArgs() {} Boolean getHelp() { return this._help; } CucumberArgs help(Boolean value) { this._help = value; return this; } static CucumberArgs with( @DelegatesTo(strategy = Closure.DELEGATE_ONLY, value = CucumberArgs) Closure builder ) { builder.delegate = new CucumberArgs() builder.resolveStrategy = Closure.DELEGATE_ONLY return builder.call() } @Override String toString() { this._help ? 'cucumber-js --help' : '' } } // 使用方式不变 def args = CucumberArgs.with { help(true) } println args
@DelegatesTo注解会向IDE传递委托类型信息,让IntelliJ能识别Closure内部的help()方法并给出提示。
内容的提问来源于stack exchange,提问作者Solonotix
相关产品推荐
相关产品推荐

