[Gradle] kgp-idea-proto: Add public API for extras serialisation
KT-55926
This commit is contained in:
committed by
Space Team
parent
54db04e0f4
commit
d0bb804e85
+5
@@ -1,3 +1,8 @@
|
|||||||
|
public final class org/jetbrains/kotlin/gradle/idea/proto/ExtrasKt {
|
||||||
|
public static final fun Extras (Lorg/jetbrains/kotlin/gradle/idea/serialize/IdeaKotlinSerializationContext;[B)Lorg/jetbrains/kotlin/tooling/core/MutableExtras;
|
||||||
|
public static final fun toByteArray (Lorg/jetbrains/kotlin/tooling/core/Extras;Lorg/jetbrains/kotlin/gradle/idea/serialize/IdeaKotlinSerializationContext;)[B
|
||||||
|
}
|
||||||
|
|
||||||
public final class org/jetbrains/kotlin/gradle/idea/proto/kpm/KpmIdeaProto {
|
public final class org/jetbrains/kotlin/gradle/idea/proto/kpm/KpmIdeaProto {
|
||||||
public static final fun IdeaKpmProject (Lorg/jetbrains/kotlin/gradle/idea/serialize/IdeaKotlinSerializationContext;Ljava/io/InputStream;)Lorg/jetbrains/kotlin/gradle/idea/kpm/IdeaKpmProject;
|
public static final fun IdeaKpmProject (Lorg/jetbrains/kotlin/gradle/idea/serialize/IdeaKotlinSerializationContext;Ljava/io/InputStream;)Lorg/jetbrains/kotlin/gradle/idea/kpm/IdeaKpmProject;
|
||||||
public static final fun IdeaKpmProject (Lorg/jetbrains/kotlin/gradle/idea/serialize/IdeaKotlinSerializationContext;Ljava/nio/ByteBuffer;)Lorg/jetbrains/kotlin/gradle/idea/kpm/IdeaKpmProject;
|
public static final fun IdeaKpmProject (Lorg/jetbrains/kotlin/gradle/idea/serialize/IdeaKotlinSerializationContext;Ljava/nio/ByteBuffer;)Lorg/jetbrains/kotlin/gradle/idea/kpm/IdeaKpmProject;
|
||||||
|
|||||||
+16
@@ -8,12 +8,28 @@
|
|||||||
package org.jetbrains.kotlin.gradle.idea.proto
|
package org.jetbrains.kotlin.gradle.idea.proto
|
||||||
|
|
||||||
import com.google.protobuf.ByteString
|
import com.google.protobuf.ByteString
|
||||||
|
import com.google.protobuf.InvalidProtocolBufferException
|
||||||
import org.jetbrains.kotlin.gradle.idea.proto.generated.IdeaExtrasProto
|
import org.jetbrains.kotlin.gradle.idea.proto.generated.IdeaExtrasProto
|
||||||
import org.jetbrains.kotlin.gradle.idea.proto.generated.ideaExtrasProto
|
import org.jetbrains.kotlin.gradle.idea.proto.generated.ideaExtrasProto
|
||||||
import org.jetbrains.kotlin.gradle.idea.serialize.IdeaKotlinExtrasSerializer
|
import org.jetbrains.kotlin.gradle.idea.serialize.IdeaKotlinExtrasSerializer
|
||||||
import org.jetbrains.kotlin.gradle.idea.serialize.IdeaKotlinSerializationContext
|
import org.jetbrains.kotlin.gradle.idea.serialize.IdeaKotlinSerializationContext
|
||||||
import org.jetbrains.kotlin.tooling.core.*
|
import org.jetbrains.kotlin.tooling.core.*
|
||||||
|
|
||||||
|
fun Extras.toByteArray(context: IdeaKotlinSerializationContext): ByteArray {
|
||||||
|
return context.IdeaExtrasProto(this).toByteArray()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun IdeaKotlinSerializationContext.Extras(data: ByteArray): MutableExtras? {
|
||||||
|
return try {
|
||||||
|
val proto = IdeaExtrasProto.parseFrom(data)
|
||||||
|
Extras(proto)
|
||||||
|
|
||||||
|
} catch (e: InvalidProtocolBufferException) {
|
||||||
|
logger.error("Failed to deserialize Extras", e)
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Suppress("unchecked_cast")
|
@Suppress("unchecked_cast")
|
||||||
internal fun IdeaKotlinSerializationContext.IdeaExtrasProto(extras: Extras): IdeaExtrasProto {
|
internal fun IdeaKotlinSerializationContext.IdeaExtrasProto(extras: Extras): IdeaExtrasProto {
|
||||||
val context = this
|
val context = this
|
||||||
|
|||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle.idea.proto
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.gradle.idea.testFixtures.tcs.TestIdeaKotlinInstances
|
||||||
|
import org.jetbrains.kotlin.tooling.core.MutableExtras
|
||||||
|
import org.jetbrains.kotlin.tooling.core.mutableExtrasOf
|
||||||
|
import org.jetbrains.kotlin.tooling.core.toMutableExtras
|
||||||
|
import kotlin.test.Test
|
||||||
|
import kotlin.test.fail
|
||||||
|
|
||||||
|
class ExtrasSerializationTest : AbstractSerializationTest<MutableExtras>() {
|
||||||
|
override fun serialize(value: MutableExtras): ByteArray = value.toByteArray(this)
|
||||||
|
override fun deserialize(data: ByteArray): MutableExtras = Extras(data) ?: fail()
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `sample - extrasWithIntAndStrings`() = testSerialization(TestIdeaKotlinInstances.extrasWithIntAndStrings.toMutableExtras())
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `sample - emptyExtras`() = testSerialization(mutableExtrasOf())
|
||||||
|
}
|
||||||
+7
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.gradle.targets.metadata.isSingleKotlinTargetSourceSe
|
|||||||
import org.jetbrains.kotlin.gradle.targets.metadata.isSinglePlatformTypeSourceSet
|
import org.jetbrains.kotlin.gradle.targets.metadata.isSinglePlatformTypeSourceSet
|
||||||
import org.jetbrains.kotlin.gradle.utils.getOrPut
|
import org.jetbrains.kotlin.gradle.utils.getOrPut
|
||||||
import org.jetbrains.kotlin.tooling.core.Extras
|
import org.jetbrains.kotlin.tooling.core.Extras
|
||||||
|
import org.jetbrains.kotlin.tooling.core.HasMutableExtras
|
||||||
|
|
||||||
interface IdeMultiplatformImport {
|
interface IdeMultiplatformImport {
|
||||||
|
|
||||||
@@ -37,6 +38,12 @@ interface IdeMultiplatformImport {
|
|||||||
|
|
||||||
fun resolveDependenciesSerialized(sourceSetName: String): List<ByteArray>
|
fun resolveDependenciesSerialized(sourceSetName: String): List<ByteArray>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param owner: Should implement [HasMutableExtras]. Passing [Any] is fine to make it easier to cross
|
||||||
|
* ClassLoader boundaries. Passing some non [HasMutableExtras] will just return null
|
||||||
|
*/
|
||||||
|
fun resolveExtrasSerialized(owner: Any): ByteArray?
|
||||||
|
|
||||||
fun serialize(dependencies: Iterable<IdeaKotlinDependency>): List<ByteArray>
|
fun serialize(dependencies: Iterable<IdeaKotlinDependency>): List<ByteArray>
|
||||||
|
|
||||||
fun <T : Any> serialize(key: Extras.Key<T>, value: T): ByteArray?
|
fun <T : Any> serialize(key: Extras.Key<T>, value: T): ByteArray?
|
||||||
|
|||||||
+7
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.gradle.plugin.ide
|
|||||||
import org.jetbrains.kotlin.gradle.ExternalKotlinTargetApi
|
import org.jetbrains.kotlin.gradle.ExternalKotlinTargetApi
|
||||||
import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension
|
import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension
|
||||||
import org.jetbrains.kotlin.gradle.idea.proto.tcs.toByteArray
|
import org.jetbrains.kotlin.gradle.idea.proto.tcs.toByteArray
|
||||||
|
import org.jetbrains.kotlin.gradle.idea.proto.toByteArray
|
||||||
import org.jetbrains.kotlin.gradle.idea.serialize.IdeaKotlinExtrasSerializationExtension
|
import org.jetbrains.kotlin.gradle.idea.serialize.IdeaKotlinExtrasSerializationExtension
|
||||||
import org.jetbrains.kotlin.gradle.idea.serialize.IdeaKotlinSerializationContext
|
import org.jetbrains.kotlin.gradle.idea.serialize.IdeaKotlinSerializationContext
|
||||||
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency
|
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency
|
||||||
@@ -17,6 +18,7 @@ import org.jetbrains.kotlin.gradle.plugin.ide.IdeDependencyResolver.Companion.re
|
|||||||
import org.jetbrains.kotlin.gradle.plugin.ide.IdeMultiplatformImport.*
|
import org.jetbrains.kotlin.gradle.plugin.ide.IdeMultiplatformImport.*
|
||||||
import org.jetbrains.kotlin.gradle.plugin.ide.IdeMultiplatformImport.Companion.logger
|
import org.jetbrains.kotlin.gradle.plugin.ide.IdeMultiplatformImport.Companion.logger
|
||||||
import org.jetbrains.kotlin.tooling.core.Extras
|
import org.jetbrains.kotlin.tooling.core.Extras
|
||||||
|
import org.jetbrains.kotlin.tooling.core.HasMutableExtras
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.measureTimeMillisWithResult
|
import org.jetbrains.kotlin.utils.addToStdlib.measureTimeMillisWithResult
|
||||||
import kotlin.system.measureTimeMillis
|
import kotlin.system.measureTimeMillis
|
||||||
|
|
||||||
@@ -37,6 +39,11 @@ internal class IdeMultiplatformImportImpl(
|
|||||||
return serialize(resolveDependencies(sourceSetName))
|
return serialize(resolveDependencies(sourceSetName))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun resolveExtrasSerialized(owner: Any): ByteArray? {
|
||||||
|
if (owner !is HasMutableExtras) return null
|
||||||
|
return owner.extras.toByteArray(createSerializationContext())
|
||||||
|
}
|
||||||
|
|
||||||
override fun serialize(dependencies: Iterable<IdeaKotlinDependency>): List<ByteArray> {
|
override fun serialize(dependencies: Iterable<IdeaKotlinDependency>): List<ByteArray> {
|
||||||
val context = createSerializationContext()
|
val context = createSerializationContext()
|
||||||
return dependencies.map { dependency -> dependency.toByteArray(context) }
|
return dependencies.map { dependency -> dependency.toByteArray(context) }
|
||||||
|
|||||||
Reference in New Issue
Block a user