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 >

奇怪的事情要注意-以前我在传递结果时作为内联函数进行了完全相同的内联,因为构造函数自变量IDE没有抱怨。就像是:
new FeedProcessor(relatedFeed*.asImmutable().asImmutable())
构造器定义如下所示:
FeedProcessor(List<Map<String, String>> relatedFeed)
...不是IDE抱怨的情况。

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 相加

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

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

在这里,@Builder批注本身带有消息下划线

缺少的属性:forClass,builderClassName

这是错误的,例如,不能同时使用forClass和builderMethodName。

IntelliJ中的任何红色下划线都意味着代码甚至无法编译。它可以按预期进行编译和工作-既可以由IDE本身也可以由IDE外部的Gradle进行编译。

为什么IntelliJ抱怨正确的东西?

最佳答案

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

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

09-04 07:03