papsign / Ktor-OpenAPI-Generator

Ktor OpenAPI/Swagger 3 Generator
Apache License 2.0
241 stars 42 forks source link

Fix UnsupportedOperationException for generic routes #108

Closed darkxanter closed 2 years ago

darkxanter commented 2 years ago

Fix UnsupportedOperationException (https://youtrack.jetbrains.com/issue/KT-34051 or may be similar) for generic routes:

inline fun <reified TNodeNew : TreeNodeNew, reified TNode : TreeNodeBase> NormalOpenAPIRoute.treeNodeRoute(
    service: TreeNodeService<TNodeNew, TNode>
) {
    route("{id}").get<PathId, List<TNode>> { params ->
        respond(service.listNodes(params.id))
    }
    route("{id}").delete<PathId, Unit> { params ->
        service.removeNode(params.id)
        pipeline.call.respond(HttpStatusCode.NoContent)
    }
    get<Unit, List<TNode>> {
        respond(service.listNodes(null))
    }
    post<Unit, TNode, TNodeNew> { _, body ->
        respond(service.createNode(body))
    }
    patch<Unit, Unit, TNode> { _, body ->
        service.updateNode(body)
        pipeline.call.respond(HttpStatusCode.NoContent)
    }
}
This function has a reified type parameter and thus can only be inlined at compilation time, not called directly.
java.lang.UnsupportedOperationException: This function has a reified type parameter and thus can only be inlined at compilation time, not called directly.
    at kotlin.jvm.internal.Intrinsics.throwUndefinedForReified(Intrinsics.java:207)
    at kotlin.jvm.internal.Intrinsics.throwUndefinedForReified(Intrinsics.java:201)
    at kotlin.jvm.internal.Intrinsics.reifiedOperationMarker(Intrinsics.java:211)
    at com.papsign.ktor.openapigen.routing.GenericRoutesTest$treeNodeRoutePrivate$$inlined$get$default$1.invoke(Functions.kt:104)
    at com.papsign.ktor.openapigen.routing.GenericRoutesTest$treeNodeRoutePrivate$$inlined$get$default$1.invoke(Functions.kt:103)
    at com.papsign.ktor.openapigen.route.FunctionsKt.preHandle(Functions.kt:162)
    at com.papsign.ktor.openapigen.routing.GenericRoutesTest$genericRoutesTest$1$2.invoke(GenericRoutesTest.kt:372)
    at com.papsign.ktor.openapigen.routing.GenericRoutesTest$genericRoutesTest$1$2.invoke(GenericRoutesTest.kt:51)
    at com.papsign.ktor.openapigen.route.RouteConfigKt$apiRouting$1.invoke(RouteConfig.kt:21)
    at com.papsign.ktor.openapigen.route.RouteConfigKt$apiRouting$1.invoke(RouteConfig.kt:17)
    at io.ktor.routing.Routing$Feature.install(Routing.kt:106)
    at io.ktor.routing.Routing$Feature.install(Routing.kt:88)
    at io.ktor.application.ApplicationFeatureKt.install(ApplicationFeature.kt:68)
    at io.ktor.routing.RoutingKt.routing(Routing.kt:129)
    at com.papsign.ktor.openapigen.route.RouteConfigKt.apiRouting(RouteConfig.kt:17)
    at com.papsign.ktor.openapigen.routing.GenericRoutesTest$genericRoutesTest$1.invoke(GenericRoutesTest.kt:51)
    at com.papsign.ktor.openapigen.routing.GenericRoutesTest$genericRoutesTest$1.invoke(GenericRoutesTest.kt:32)
    at io.ktor.server.testing.TestEngineKt$withTestApplication$1.invoke(TestEngine.kt:67)
    at io.ktor.server.testing.TestEngineKt$withTestApplication$1.invoke(TestEngine.kt:66)
    at io.ktor.server.testing.TestEngineKt.withApplication(TestEngine.kt:49)
    at io.ktor.server.testing.TestEngineKt.withApplication$default(TestEngine.kt:41)
    at io.ktor.server.testing.TestEngineKt.withTestApplication(TestEngine.kt:66)
    at com.papsign.ktor.openapigen.routing.GenericRoutesTest.genericRoutesTest(GenericRoutesTest.kt:32)
Wicpar commented 2 years ago

God damn that one's a juicy compiler bug...