[Gradle] Rename stored{Classifier}Property to {classifier}StoredProperty

This change is intended to improve the intuition of developers.
After adding the two functions, many times developers (me) have
tried to use the 'wrong' (which is now the new name) function name.

KT-61634
This commit is contained in:
Sebastian Sellmair
2023-10-13 14:28:51 +02:00
committed by Space Team
parent 08241acb6f
commit ecbd741e40
4 changed files with 49 additions and 15 deletions
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.gradle.plugin package org.jetbrains.kotlin.gradle.plugin
import org.gradle.api.Project import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.utils.storedProjectProperty import org.jetbrains.kotlin.gradle.utils.projectStoredProperty
import org.jetbrains.kotlin.tooling.core.UnsafeApi import org.jetbrains.kotlin.tooling.core.UnsafeApi
/** /**
@@ -25,7 +25,7 @@ internal fun <T> KotlinGradlePluginExtensionPoint(): KotlinGradlePluginExtension
@UnsafeApi("Visible for tests only") @UnsafeApi("Visible for tests only")
internal class KotlinGradlePluginExtensionPointInternal<T> : KotlinGradlePluginExtensionPoint<T> { internal class KotlinGradlePluginExtensionPointInternal<T> : KotlinGradlePluginExtensionPoint<T> {
private val Project.registeredExtensions by storedProjectProperty<MutableList<T>> { mutableListOf() } private val Project.registeredExtensions by projectStoredProperty<MutableList<T>> { mutableListOf() }
override fun get(project: Project): List<T> { override fun get(project: Project): List<T> {
return project.registeredExtensions.toList() return project.registeredExtensions.toList()
@@ -35,7 +35,7 @@ internal val InternalKotlinSourceSet.resolvableMetadataConfigurationName: String
* These dependencies are set up to resolve Kotlin Metadata (without transformation) and will resolve * These dependencies are set up to resolve Kotlin Metadata (without transformation) and will resolve
* consistently across the whole project. * consistently across the whole project.
*/ */
internal val InternalKotlinSourceSet.resolvableMetadataConfiguration: Configuration by storedExtrasProperty { internal val InternalKotlinSourceSet.resolvableMetadataConfiguration: Configuration by extrasStoredProperty {
assert(resolvableMetadataConfigurationName !in project.configurations.names) assert(resolvableMetadataConfigurationName !in project.configurations.names)
val configuration = project.configurations.maybeCreate(resolvableMetadataConfigurationName) val configuration = project.configurations.maybeCreate(resolvableMetadataConfigurationName)
configuration.markResolvable() configuration.markResolvable()
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.tooling.core.extrasKeyOf
import org.jetbrains.kotlin.tooling.core.getOrPut import org.jetbrains.kotlin.tooling.core.getOrPut
import java.util.* import java.util.*
import kotlin.properties.ReadOnlyProperty import kotlin.properties.ReadOnlyProperty
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty import kotlin.reflect.KProperty
/** /**
@@ -21,7 +20,7 @@ import kotlin.reflect.KProperty
* ```kotlin * ```kotlin
* class Foo(val projectName: String) * class Foo(val projectName: String)
* *
* val Project.myFoo by storedProjectProperty { * val Project.myFoo by projectStoredProperty {
* Foo(project.name) * Foo(project.name)
* } * }
* ``` * ```
@@ -52,15 +51,15 @@ import kotlin.reflect.KProperty
* *not* the type, or any String based key * *not* the type, or any String based key
* *
*/ */
internal fun <T : Any> storedProjectProperty(initializer: Project.() -> T): ReadOnlyProperty<Project, T> = StoredLazyProperty( internal fun <T> projectStoredProperty(initializer: Project.() -> T): ReadOnlyProperty<Project, T> = StoredLazyProperty(
storage = { storedPropertyStorage }, storage = { storedPropertyStorage },
initializer = initializer initializer = initializer
) )
/** /**
* Same as [storedProjectProperty], but will allow storing the property on any object implementing [HasMutableExtras] * Same as [projectStoredProperty], but will allow storing the property on any object implementing [HasMutableExtras]
*/ */
internal fun <R : HasMutableExtras, T : Any> storedExtrasProperty(initializer: R.() -> T): ReadOnlyProperty<R, T> = StoredLazyProperty( internal fun <R : HasMutableExtras, T> extrasStoredProperty(initializer: R.() -> T): ReadOnlyProperty<R, T> = StoredLazyProperty(
storage = { storedPropertyStorage }, storage = { storedPropertyStorage },
initializer = initializer initializer = initializer
) )
@@ -105,7 +104,8 @@ private class StoredPropertyStorage {
private val values = WeakHashMap<StoredProperty<*>, Any?>() private val values = WeakHashMap<StoredProperty<*>, Any?>()
fun <T> getOrPut(key: StoredLazyProperty<*, T>, create: () -> T): T { fun <T> getOrPut(key: StoredLazyProperty<*, T>, create: () -> T): T {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
return values.getOrPut(key) { create() } as T return if (key in values) values[key] as T
else values.getOrPut(key, create) as T
} }
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
@@ -9,34 +9,43 @@ package org.jetbrains.kotlin.gradle.unitTests
import org.gradle.api.Project import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.util.buildProject import org.jetbrains.kotlin.gradle.util.buildProject
import org.jetbrains.kotlin.gradle.utils.storedExtrasProperty import org.jetbrains.kotlin.gradle.utils.extrasStoredProperty
import org.jetbrains.kotlin.gradle.utils.storedProjectProperty import org.jetbrains.kotlin.gradle.utils.projectStoredProperty
import org.jetbrains.kotlin.tooling.core.HasMutableExtras import org.jetbrains.kotlin.tooling.core.HasMutableExtras
import org.jetbrains.kotlin.tooling.core.MutableExtras import org.jetbrains.kotlin.tooling.core.MutableExtras
import org.jetbrains.kotlin.tooling.core.mutableExtrasOf import org.jetbrains.kotlin.tooling.core.mutableExtrasOf
import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.atomic.AtomicInteger
import kotlin.test.Test import kotlin.test.Test
import kotlin.test.assertEquals import kotlin.test.assertEquals
import kotlin.test.assertNull
import kotlin.test.assertSame import kotlin.test.assertSame
class StoredPropertyTest { class StoredPropertyTest {
private data class Value(val id: Any) private data class Value(val id: Any)
private val Project.projectNameProperty by storedProjectProperty { Value(project.name) } private val Project.projectNameProperty by projectStoredProperty { Value(project.name) }
private val atomic = AtomicInteger(0) private val atomic = AtomicInteger(0)
private val Project.counterProperty by storedProjectProperty { Value(atomic.getAndIncrement()) } private val Project.counterProperty by projectStoredProperty { Value(atomic.getAndIncrement()) }
private var myState: Any? = null
private val Project.myStateCapturingProperty by projectStoredProperty { myState }
private class Scope(val id: Any) { private class Scope(val id: Any) {
val Project.myProperty by storedProjectProperty { Value(id) } val Project.myProperty by projectStoredProperty { Value(id) }
} }
private class TestEntity(val id: Any) : HasMutableExtras { private class TestEntity(val id: Any) : HasMutableExtras {
override val extras: MutableExtras = mutableExtrasOf() override val extras: MutableExtras = mutableExtrasOf()
} }
private val TestEntity.myProperty by storedExtrasProperty { Value(id) } private val TestEntity.myProperty by extrasStoredProperty { Value(id) }
private val TestEntity.myStateCaptureProperty: Any? by extrasStoredProperty {
myState
}
@Test @Test
fun `test - projectNameProperty`() { fun `test - projectNameProperty`() {
@@ -86,4 +95,29 @@ class StoredPropertyTest {
assertSame(entityA.myProperty, entityA.myProperty) assertSame(entityA.myProperty, entityA.myProperty)
assertSame(entityB.myProperty, entityB.myProperty) assertSame(entityB.myProperty, entityB.myProperty)
} }
@Test
fun `test - nullable extras property`() {
val entity = TestEntity("a")
myState = null
assertNull(entity.myStateCaptureProperty)
myState = "Should not be captured anymore"
assertNull(entity.myStateCaptureProperty)
val anotherEntity = TestEntity("b")
myState = "foo"
assertEquals("foo", anotherEntity.myStateCaptureProperty)
}
@Test
fun `test - nullable project property`() {
val project = buildProject()
assertNull(project.myStateCapturingProperty)
myState = "foo"
assertNull(project.myStateCapturingProperty)
assertEquals("foo", buildProject().myStateCapturingProperty)
}
} }