Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .idea/kotlinx-rpc.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 4 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

[![Kotlin Experimental](https://kotl.in/badges/experimental.svg)](https://kotlinlang.org/docs/components-stability.html)
[![Official JetBrains project](http://jb.gg/badges/official.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub)
[![Kotlin](https://img.shields.io/badge/kotlin-2.0.0--2.1.21-blue.svg?logo=kotlin)](http://kotlinlang.org)
[![Kotlin](https://img.shields.io/badge/kotlin-2.0.0--2.2.0-blue.svg?logo=kotlin)](http://kotlinlang.org)
[![GitHub License](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](http://www.apache.org/licenses/LICENSE-2.0)

[//]: # ([![TeamCity build](https://img.shields.io/teamcity/build/s/Build_kRPC_All.svg?server=http%3A%2F%2Fkrpc.teamcity.com)](https://teamcity.jetbrains.com/viewType.html?buildTypeId=Build_kRPC_All&guest=1))
Expand Down Expand Up @@ -102,6 +102,7 @@ To ensure that all IDE features of our compiler plugin work properly on IntelliJ
We support all stable Kotlin versions starting from 2.0.0:
- 2.0.0, 2.0.10, 2.0.20, 2.0.21
- 2.1.0, 2.1.10, 2.1.20, 2.1.21
- 2.2.0

For a full compatibility checklist,
see [Versions](https://kotlin.github.io/kotlinx-rpc/versions.html).
Expand Down Expand Up @@ -133,8 +134,8 @@ that will set up code generation in a project.
Example of a setup in a project's `build.gradle.kts`:
```kotlin
plugins {
kotlin("multiplatform") version "2.1.21"
kotlin("plugin.serialization") version "2.1.21"
kotlin("multiplatform") version "2.2.0"
kotlin("plugin.serialization") version "2.2.0"
id("org.jetbrains.kotlinx.rpc.plugin") version "0.7.0"
}
```
Expand Down
2 changes: 0 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
import util.asDokkaVersion
import util.configureApiValidation
import util.configureNpm
import util.configureProjectReport
import util.registerDumpPlatformTableTask
Expand Down Expand Up @@ -80,7 +79,6 @@ dependencies {

configureProjectReport()
configureNpm()
configureApiValidation()

registerDumpPlatformTableTask()
registerVerifyPlatformTableTask()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ import kotlinx.rpc.codegen.extension.RpcIrContext
import kotlinx.rpc.codegen.extension.RpcIrServiceProcessor
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrTransformer

internal class RpcIrServiceProcessorDelegate(
val processor: RpcIrServiceProcessor,
) : IrElementTransformer<RpcIrContext> {
) : IrTransformer<RpcIrContext>() {
override fun visitClass(declaration: IrClass, data: RpcIrContext): IrStatement {
processor.visitClass(declaration, data)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
/*
* Copyright 2023-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
* Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
*/

package kotlinx.rpc.codegen

import kotlinx.rpc.codegen.extension.IrMemberAccessExpressionData
import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
import org.jetbrains.kotlin.backend.common.ir.addExtensionReceiver
import org.jetbrains.kotlin.backend.common.ir.createExtensionReceiver
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.CompilerConfigurationKey
Expand All @@ -17,6 +16,7 @@ import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl
Expand Down Expand Up @@ -65,7 +65,7 @@ object VersionSpecificApiImpl : VersionSpecificApi {
get() = parameters

override val IrConstructorCall.argumentsVS: List<IrExpression?>
get() = arguments
get() = arguments.toList()

override fun IrType.isNullableVS(): Boolean {
return isNullable()
Expand Down Expand Up @@ -99,7 +99,7 @@ object VersionSpecificApiImpl : VersionSpecificApi {
}

override fun IrSimpleFunction.addExtensionReceiverVS(type: IrType, origin: IrDeclarationOrigin): IrValueParameter {
return addExtensionReceiver(type, origin)
return createExtensionReceiver(type, origin)
}

override val messageCollectorKey: CompilerConfigurationKey<MessageCollector>
Expand Down Expand Up @@ -150,34 +150,41 @@ object VersionSpecificApiImpl : VersionSpecificApi {
}

override fun IrFunction.valueParametersVS(): List<IrValueParameter> {
return valueParameters
return parameters.filter { it.kind == IrParameterKind.Regular }
}

override val IrFunction.extensionReceiverParameterVS: IrValueParameter?
get() = extensionReceiverParameter
get() = parameters.firstOrNull { it.kind == IrParameterKind.ExtensionReceiver }

override var IrFunction.dispatchReceiverParameterVS: IrValueParameter?
get() = dispatchReceiverParameter
set(value) {
dispatchReceiverParameter = value
if (value != null) {
parameters += value
}
}


override fun IrMemberAccessExpressionData.buildFor(access: IrMemberAccessExpression<*>) {
if (dispatchReceiver != null) {
access.dispatchReceiver = dispatchReceiver
var offset = if (dispatchReceiver != null) {
access.arguments[0] = dispatchReceiver
1
} else {
0
}

if (extensionReceiver != null) {
access.extensionReceiver = extensionReceiver
offset += if (extensionReceiver != null) {
access.arguments[offset] = extensionReceiver
1
} else {
0
}

valueArguments.forEachIndexed { index, irExpression ->
access.putValueArgument(index, irExpression)
access.arguments[offset + index] = irExpression
}

typeArguments.forEachIndexed { index, irType ->
access.putTypeArgument(index, irType)
access.typeArguments[index] = irType
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ import kotlinx.rpc.codegen.extension.RpcIrContext
import kotlinx.rpc.codegen.extension.RpcIrServiceProcessor
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.visitors.IrTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer

internal class RpcIrServiceProcessorDelegate(
val processor: RpcIrServiceProcessor,
) : IrTransformer<RpcIrContext>() {
) : IrElementTransformer<RpcIrContext> {
override fun visitClass(declaration: IrClass, data: RpcIrContext): IrStatement {
processor.visitClass(declaration, data)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
/*
* Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
* Copyright 2023-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
*/

package kotlinx.rpc.codegen

import kotlinx.rpc.codegen.extension.IrMemberAccessExpressionData
import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
import org.jetbrains.kotlin.backend.common.ir.createExtensionReceiver
import org.jetbrains.kotlin.backend.common.ir.addExtensionReceiver
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.CompilerConfigurationKey
Expand All @@ -16,7 +17,6 @@ import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl
Expand Down Expand Up @@ -65,7 +65,7 @@ object VersionSpecificApiImpl : VersionSpecificApi {
get() = parameters

override val IrConstructorCall.argumentsVS: List<IrExpression?>
get() = arguments.toList()
get() = arguments

override fun IrType.isNullableVS(): Boolean {
return isNullable()
Expand Down Expand Up @@ -99,7 +99,7 @@ object VersionSpecificApiImpl : VersionSpecificApi {
}

override fun IrSimpleFunction.addExtensionReceiverVS(type: IrType, origin: IrDeclarationOrigin): IrValueParameter {
return createExtensionReceiver(type, origin)
return addExtensionReceiver(type, origin)
}

override val messageCollectorKey: CompilerConfigurationKey<MessageCollector>
Expand Down Expand Up @@ -150,41 +150,34 @@ object VersionSpecificApiImpl : VersionSpecificApi {
}

override fun IrFunction.valueParametersVS(): List<IrValueParameter> {
return parameters.filter { it.kind == IrParameterKind.Regular }
return valueParameters
}

override val IrFunction.extensionReceiverParameterVS: IrValueParameter?
get() = parameters.firstOrNull { it.kind == IrParameterKind.ExtensionReceiver }
get() = extensionReceiverParameter

override var IrFunction.dispatchReceiverParameterVS: IrValueParameter?
get() = dispatchReceiverParameter
set(value) {
if (value != null) {
parameters += value
}
dispatchReceiverParameter = value
}


override fun IrMemberAccessExpressionData.buildFor(access: IrMemberAccessExpression<*>) {
var offset = if (dispatchReceiver != null) {
access.arguments[0] = dispatchReceiver
1
} else {
0
if (dispatchReceiver != null) {
access.dispatchReceiver = dispatchReceiver
}

offset += if (extensionReceiver != null) {
access.arguments[offset] = extensionReceiver
1
} else {
0
if (extensionReceiver != null) {
access.extensionReceiver = extensionReceiver
}

valueArguments.forEachIndexed { index, irExpression ->
access.arguments[offset + index] = irExpression
access.putValueArgument(index, irExpression)
}

typeArguments.forEachIndexed { index, irType ->
access.typeArguments[index] = irType
access.putTypeArgument(index, irType)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,22 @@ package kotlinx.rpc.codegen
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClassSymbol
import org.jetbrains.kotlin.fir.declarations.FirFunction
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.declaredFunctions
import org.jetbrains.kotlin.fir.declarations.constructors
import org.jetbrains.kotlin.fir.resolve.toClassSymbol
import org.jetbrains.kotlin.fir.resolve.toRegularClassSymbol
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.toFirResolvedTypeRef
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.builder.FirResolvedTypeRefBuilder
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.processAllDeclarations
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol

object FirVersionSpecificApiImpl : FirVersionSpecificApi {
override fun ConeKotlinType.toFirResolvedTypeRefVS(
Expand All @@ -41,19 +42,20 @@ object FirVersionSpecificApiImpl : FirVersionSpecificApi {
coneType = value
}

override fun FirClassSymbol<*>.declaredFunctionsVS(session: FirSession): List<FirFunctionSymbol<FirFunction>> {
@OptIn(SymbolInternals::class)
return fir.declarations
.filterIsInstance<FirFunction>()
.map { it.symbol }
override fun FirClassSymbol<*>.declaredFunctionsVS(session: FirSession): List<FirFunctionSymbol<*>> {
return declaredFunctions(session)
}

override fun FirRegularClassSymbol.constructorsVS(session: FirSession): List<FirConstructorSymbol> {
return declarationSymbols.filterIsInstance<FirConstructorSymbol>()
return constructors(session)
}

override fun FirRegularClass.declarationsVS(session: FirSession): List<FirBasedSymbol<*>> {
return declarations.map { it.symbol }
val declarations = mutableListOf<FirBasedSymbol<*>>()
processAllDeclarations(session) { symbol ->
declarations.add(symbol)
}
return declarations
}

override val FirResolvedTypeRef.coneTypeVS: ConeKotlinType get() = coneType
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,51 +22,58 @@ import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
class FirCheckedAnnotationFunctionCallCheckerVS(
private val ctx: FirCheckersContext,
) : FirFunctionCallChecker(MppCheckerKind.Common) {
override fun check(expression: FirFunctionCall, context: CheckerContext, reporter: DiagnosticReporter) {
context(context: CheckerContext, reporter: DiagnosticReporter)
override fun check(expression: FirFunctionCall) {
FirCheckedAnnotationFunctionCallChecker.check(ctx, expression, context, reporter)
}
}

class FirCheckedAnnotationTypeParameterCheckerVS(
private val ctx: FirCheckersContext,
) : FirTypeParameterChecker(MppCheckerKind.Common) {
override fun check(declaration: FirTypeParameter, context: CheckerContext, reporter: DiagnosticReporter) {
context(context: CheckerContext, reporter: DiagnosticReporter)
override fun check(declaration: FirTypeParameter) {
FirCheckedAnnotationTypeParameterChecker.check(ctx, declaration, context, reporter)
}
}

class FirCheckedAnnotationFirClassCheckerVS(
private val ctx: FirCheckersContext,
) : FirClassChecker(MppCheckerKind.Common) {
override fun check(declaration: FirClass, context: CheckerContext, reporter: DiagnosticReporter) {
context(context: CheckerContext, reporter: DiagnosticReporter)
override fun check(declaration: FirClass) {
FirCheckedAnnotationFirClassChecker.check(ctx, declaration, context, reporter)
}
}

class FirCheckedAnnotationFirFunctionCheckerVS(
private val ctx: FirCheckersContext,
) : FirFunctionChecker(MppCheckerKind.Common) {
override fun check(declaration: FirFunction, context: CheckerContext, reporter: DiagnosticReporter) {
context(context: CheckerContext, reporter: DiagnosticReporter)
override fun check(declaration: FirFunction) {
FirCheckedAnnotationFirFunctionChecker.check(ctx, declaration, context, reporter)
}
}

class FirRpcAnnotationCheckerVS : FirRegularClassChecker(MppCheckerKind.Common) {
override fun check(declaration: FirRegularClass, context: CheckerContext, reporter: DiagnosticReporter) {
context(context: CheckerContext, reporter: DiagnosticReporter)
override fun check(declaration: FirRegularClass) {
FirRpcAnnotationChecker.check(declaration, context, reporter)
}
}

class FirRpcServiceDeclarationCheckerVS(
private val ctx: FirCheckersContext,
) : FirRegularClassChecker(MppCheckerKind.Common) {
override fun check(declaration: FirRegularClass, context: CheckerContext, reporter: DiagnosticReporter) {
context(context: CheckerContext, reporter: DiagnosticReporter)
override fun check(declaration: FirRegularClass) {
FirRpcServiceDeclarationChecker.check(ctx, declaration, context, reporter)
}
}

class FirRpcStrictModeClassCheckerVS : FirRegularClassChecker(MppCheckerKind.Common) {
override fun check(declaration: FirRegularClass, context: CheckerContext, reporter: DiagnosticReporter) {
context(context: CheckerContext, reporter: DiagnosticReporter)
override fun check(declaration: FirRegularClass) {
FirRpcStrictModeClassChecker.check(declaration, context, reporter)
}
}
Loading
Loading