【问题标题】:Add methods to an assigned closure with GroovyDSL使用 GroovyDSL 将方法添加到分配的闭包
【发布时间】:2015-06-09 18:26:54
【问题描述】:

Geb 使用名为content 的静态字段来定义页面或模块的内容。 content 字段的值是一个闭包。

 
class GebishOrgHomePage extends Page {
    static content = {
        manualsMenu {
            module MenuModule, $("#header-content ul li", 0)
        }
        links { $('.link-list li a') }
    }
}

Intellij 已经支持此内容 dsl,但它不支持 modulemoduleList 方法。这会在使用模块时导致有限的自动完成支持。

为了解决这个问题,我想编写一个 GroovyDSL 脚本,将缺少的方法定义添加到内容闭包及其嵌套闭包中。但是,我不知道如何将方法添加到未传递给方法的闭包中,因为enclosingCall 需要具体的方法名称。

另一件事是这些方法必须具有这样的通用返回类型:


<T extends Module> T module(Class<T> m) {
    // return an instance of T
}

【问题讨论】:

    标签: intellij-idea geb groovydsl


    【解决方案1】:

    如果您使用latest snapshot,那么您的IDE 将理解module() 调用。这完全取决于您所追求的 moving module() to Navigator - 自动完成和强类型。

    查看当前版本的 Geb 之书section 6.4moduleList() 将在未来的版本中消失,该部分解释了要使用的内容。 module() 采用 map 参数来初始化模块属性的方法也将运行,您现在自己初始化模块并将实例传递给 module(),并且在 6.4 中有一个这样做的示例。感谢所有这些,您将在 IntelliJ 中获得关于模块定义和使用的自动完成功能。

    【讨论】:

    • 感谢您的信息,但缺少一些重载
    • 例如&lt;T extends Module&gt; T module(Map params, Class&lt;? extends Module&gt; moduleClass, Navigator base)
    • 我在回答中解释了重载发生了什么以及改用什么。
    • 对不起,我误读了您关于重载的答案,请问您为什么要停用 moduleList 和重载的 module 方法?我喜欢旧方法,因为它们从一开始就明确了内容闭包中应该发生的事情。乍一看,新方法看起来更难理解,因为您现在可以将模块放在 $ 选择器的前面或后面,甚至在 collect 闭包中。我知道它以编程方式工作,但我认为阅读起来不太清楚。 - 谢谢
    • 这一切的目标是使它的类型更强大,以便您从 IDE 获得自动完成功能。 IntelliJ 将理解传递给采用参数化模块的默认构造函数的映射的键和值,并且当它们被传递给采用 module() 方法的旧映射时,它将无法自动完成它们。这就是为什么我们引入了对使用模块实例的支持,而不仅仅是使用这些方法的类,我认为采用module() 的地图不会被保留。现在想想,我们可以保留 moduleList() 辅助方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2016-04-13
    • 2010-11-25
    • 2011-09-19
    相关资源
    最近更新 更多