[ 
https://issues.apache.org/jira/browse/GROOVY-9114?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16839599#comment-16839599
 ] 

Alexander Udalov edited comment on GROOVY-9114 at 5/14/19 4:29 PM:
-------------------------------------------------------------------

In fact, we do have plans to avoid generating inline reified functions into 
private JVM methods in Kotlin, see 
[https://youtrack.jetbrains.com/issue/KT-18563]. So, in the next (hopefully) 
Kotlin version this method will be generated as public but synthetic (with the 
ACC_SYNTHETIC flag). Maybe the issue will be fixed automatically after that, 
since I hope the resolution in Groovy never chooses synthetic methods? However 
maybe it's still better to fix this one, to improve Groovy behavior against 
classes compiled by older versions of Kotlin.



was (Author: udalov):
In fact, we do have plans to avoid generating inline reified functions into 
private JVM methods in Kotlin, see 
[https://youtrack.jetbrains.com/issue/KT-18563]. So, in the next (hopefully) 
Kotlin version this method will be generated as public but synthetic (with the 
ACC_SYNTHETIC flag). Maybe the issue will be fixed automatically after that, 
since I hope the resolution in Groovy never chooses synthetic methods? However 
maybe it's still better to fix this one, to improve Groovy behavior against 
classes compiled by older versions of Kotlin.

> Afaik, by design, inline reified methods should not be available as a 
> separate method and should be inlined.

[~ernestas] this is not entirely correct; public inline reified methods can be 
used from other modules, this is why we still need to retain a public method in 
the classfile.

> Groovy chooses inline reified method over standard from Kotlin class 
> ---------------------------------------------------------------------
>
>                 Key: GROOVY-9114
>                 URL: https://issues.apache.org/jira/browse/GROOVY-9114
>             Project: Groovy
>          Issue Type: Bug
>          Components: groovy-runtime
>    Affects Versions: 2.5.x
>            Reporter: Ernestas
>            Priority: Major
>
> Given kotlin class with two methods:
> {code:java}
> fun pathParam(key: String): String = 
> ContextUtil.pathParamOrThrow(pathParamMap, key, matchedPath)
>       
> /** Reified version of [pathParam] (Kotlin only) */
> inline fun <reified T : Any> pathParam(key: String) = pathParam(key, 
> T::class.java)
> {code}
> and used from groovy as:
> {code:java}
> def id = pathParam("id){code}
> Groovy for some reason chooses inline reified version, which of course fails 
> with: 
> {noformat}
> java.lang.UnsupportedOperationException: This function has a reified type 
> parameter and thus can only be inlined at compilation time, not called 
> directly.{noformat}
> Is there anything that can be done so groovy uses the first (non reified, 
> understandable by java and groovy) version of the method?
>  
> This bug comes from [https://github.com/tipsy/javalin/issues/574]



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to