Groovy的@TypeChecked或@Builder + IntelliJ IDEA = false错误抱怨。这是一个错误吗?

时间:2014-08-08 12:31:37

标签: groovy intellij-idea typechecking

Groovy 2.3.2和IntelliJ IDEA 13.1.4

请考虑以下示例:

1

@TypeChecked
class ImmutabilityUtils {

    static List<Map<String, String>> asImmutable(List<Map<String, String>> relatedFeed) {
        relatedFeed*.asImmutable().asImmutable()
    }
}

在上面的示例中,第relatedFeed*.asImmutable().asImmutable()次调用下的行asImmutable()带有红色下划线,并带有消息:

类别方法'asImmutable'不能适用于java.util.List&lt; java.util.Map&lt; java.lang.String,java.lang.String&gt;&gt;

奇怪的是需要注意的事情 - 之前我在执行完全相同的内联操作时传递结果作为构造函数参数IDE没有抱怨。类似的东西:

new FeedProcessor(relatedFeed*.asImmutable().asImmutable())

其中constuctor定义如下:

FeedProcessor(List<Map<String, String>> relatedFeed)

...不是IDE抱怨的情况。

Screen shot illustrating issue 1. and 2.

2

@TypeChecked
class ImmutabilityUtils {

    static Map<String, Map<String, String>> asImmutable(Map<String, Map<String, String>> lookupFeed) {
        lookupFeed.collectEntries { [it.key, it.value.asImmutable()] }.asImmutable()
    }
}

为了缩短时间,这里我们有与第一个例子中完全相同的情况。唯一的区别是被加下划线的asImmutable()方法调用是行尾的那个(在闭包的大括号之后)。 IDE的消息是

类别方法'asImmutable'不能适用于java.util.Map&lt;?,?&gt;

与第一个例子类似,当作为构造函数参数内联执行时没有抱怨。

3

@Builder(buildMethodName='build', builderMethodName='builder', prefix='with')
class Whatever { ... }

此处@Builder注释本身带有消息的下划线

错过的属性:forClass,builderClassName

哪个错误,例如 forClass builderMethodName 不能同时使用。

Screen shot illustrating issue 3.

IntelliJ中的任何红色下划线表示代码甚至无法编译。它编译并按预期工作 - 既由IDE本身编译,也由IDE外部的Gradle编译。

为什么IntelliJ抱怨某些事情是正确的?

1 个答案:

答案 0 :(得分:1)

红色下划线一定意味着代码不会编译。这意味着IntelliJ自己的代码分析认为存在错误,但它并不总是正确的 - 特别是对于Java以外的语言。 IntelliJ的Groovy支持很好,但并不完美,它可能不适合新的@TypeChecked模式,它可能没有关于较小/最近AST转换的特定知识,例如@Builder完全(在这种情况下,它不会理解它们)。

在这种情况下,正确的行动是在IntelliJ的bug tracker中提出问题 - 不仅符合您自己的利益,而且符合整个Groovy社区的利益。