Roman Rastiehaiev
04/22/2025, 9:46 PMVampire
04/23/2025, 6:54 AMRoman Rastiehaiev
04/23/2025, 6:59 AMCaused by: org.jetbrains.kotlin.utils.exceptions.KotlinIllegalArgumentExceptionWithAttachments: Expected FirResolvedTypeRef with ConeKotlinType but was FirImplicitTypeRefImplWithoutSource
at org.jetbrains.kotlin.fir.types.FirTypeUtilsKt.getConeType(FirTypeUtils.kt:201)
at io.github.rastiehaiev.fir.SuspendifyFirSupertypeGenerator.computeAdditionalSupertypes(SuspendifyFirSupertypeGenerator.kt:56)
at org.jetbrains.kotlin.fir.resolve.transformers.FirSupertypeResolverVisitor.addSupertypesFromExtensions(FirSupertypesResolution.kt:495)
at org.jetbrains.kotlin.fir.resolve.transformers.FirSupertypeResolverVisitor.resolveSpecificClassLikeSupertypes$lambda$15(FirSupertypesResolution.kt:472)
at org.jetbrains.kotlin.fir.resolve.transformers.FirSupertypeResolverVisitor.resolveSpecificClassLikeSupertypes(FirSupertypesResolution.kt:402)
at org.jetbrains.kotlin.fir.resolve.transformers.FirSupertypeResolverVisitor.resolveSpecificClassLikeSupertypes(FirSupertypesResolution.kt:445)
at org.jetbrains.kotlin.fir.resolve.transformers.FirSupertypeResolverVisitor.visitRegularClass(FirSupertypesResolution.kt:425)
at org.jetbrains.kotlin.fir.resolve.transformers.FirSupertypeResolverVisitor.visitRegularClass(FirSupertypesResolution.kt:226)
at org.jetbrains.kotlin.fir.declarations.FirRegularClass.accept(FirRegularClass.kt:48)
at org.jetbrains.kotlin.fir.declarations.impl.FirFileImpl.acceptChildren(FirFileImpl.kt:57)
at org.jetbrains.kotlin.fir.resolve.transformers.FirSupertypeResolverVisitor.visitDeclarationContent(FirSupertypesResolution.kt:413)
at org.jetbrains.kotlin.fir.resolve.transformers.FirSupertypeResolverVisitor.visitFile(FirSupertypesResolution.kt:593)
at org.jetbrains.kotlin.fir.resolve.transformers.FirSupertypeResolverVisitor.visitFile(FirSupertypesResolution.kt:226)
at org.jetbrains.kotlin.fir.declarations.FirFile.accept(FirFile.kt:42)
at org.jetbrains.kotlin.fir.resolve.transformers.FirSupertypeResolverTransformer.transformFile(FirSupertypesResolution.kt:71)
... 43 more
This happens when I try to do FirSimpleFunction.returnTypeRef.coneType
Roman Rastiehaiev
04/23/2025, 7:04 AMconeType
with coneTypeOrNull
so it doesn't fail compilation, but plugin doesn't generate any methods/classes because of this)Javier
04/23/2025, 9:48 AMRoman Rastiehaiev
04/23/2025, 9:49 AMbnorm
04/23/2025, 2:00 PMFirSupertypeGenerationExtension
causes all nested classifier declaration generation to happen during the SUPER_TYPES
phase, when function return types haven't been resolved yet. The serialization plugin has one of these extensions, which is why adding the plugin causes yours to fail.
From the stacktrace, I also see a SuspendifyFirSupertypeGenerator.computeAdditionalSupertypes
call which is not present in your repository, so it would seem you also now have one of these extensions?Roman Rastiehaiev
04/23/2025, 2:20 PMSuspendifyFirSupertypeGenerator
, but then I removed it (as didn't know how to implement and use it honestly)
if I cannot use function/value parameters' return types in FirSupertypeGenerationExtension
, do you know how can I generate my classes/methods? I implemented IR part, and with current FIR implementation it works, but it fails if I use other plugins, like serializationRoman Rastiehaiev
04/23/2025, 3:27 PM@Suspendify
class Repository {
fun save(id: String): Entity { /*…*/ }
}
fun main() = runBlocking {
val repo = Repository()
// 'suspendify' is generated by plugin:
val suspendifiedRepository = repo.suspendify(with = <http://Dispatchers.IO|Dispatchers.IO>)
// 'save' is also generated by plugin, and it's suspend:
suspendifiedRepository.save("123")
}
To generate the save
function in FIR, I need to know function's return type and value parameter return type
If I don't generate this method in FIR, the IDE will not "see" it.
What is the best practice to achieve my idea?dmitriy.novozhilov
04/24/2025, 9:52 AMFirSupertypeGenerationExtension
?
For generation of new members there is a FirDeclarationGenerationExtension.generateFunctions
method, which is called at STATUS
phase or later. At this phase all explicitly written types on functions are resolved and you can access them.
Note that it won't work for implicit types and there is no way to workaround it:
class Repository {
fun save(id: String) = createEntity(...)
}
In this case the return type of save
function will be computed at IMPLICIT_TYPES_BODY_RESOLVE
, which is too lateRoman Rastiehaiev
04/24/2025, 10:50 AMFirSupertypeGenerationExtension
, I do it in `FirDeclarationGenerationExtension`:
https://github.com/rastiehaiev/suspendify/blob/main/plugin-kotlin/src/main/kotlin/io/github/rastiehaiev/fir/SuspendifyFirExtensionRegistrar.kt#L127
I don't use FirSupertypeGenerationExtension
at all. As far as I understood, kotlin serialization plugin forces my plugin to execute in earlier stage (SUPER_TYPES), where the resolving isn't done yet. That's why my plugin doesn't workdmitriy.novozhilov
04/24/2025, 11:22 AMtoFunction
from line 97 somewhere to generateFunctions
Roman Rastiehaiev
04/24/2025, 11:53 AMRoman Rastiehaiev
04/24/2025, 4:39 PMRoman Rastiehaiev
04/24/2025, 4:39 PM