diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 46e591d2714..c7ab4ca3b1d 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -240,3 +240,30 @@ jobs: with: commit_message: Update API files file_pattern: arrow-libs/**/api/*.api + + spotless: + runs-on: ubuntu-latest + timeout-minutes: 60 + + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Set up Java + uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: 11 + + - name: spotlessApply + uses: gradle/gradle-build-action@v2 + with: + arguments: spotlessApply + + - name: "Commit newly formatted files" + uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: Apply + file_pattern: arrow-libs/**/*.kt + diff --git a/arrow-libs/core/arrow-annotations/build.gradle.kts b/arrow-libs/core/arrow-annotations/build.gradle.kts index 1cd017ec3ea..4ae6d56952e 100644 --- a/arrow-libs/core/arrow-annotations/build.gradle.kts +++ b/arrow-libs/core/arrow-annotations/build.gradle.kts @@ -5,6 +5,13 @@ plugins { alias(libs.plugins.arrowGradleConfig.kotlin) alias(libs.plugins.arrowGradleConfig.publish) alias(libs.plugins.arrowGradleConfig.versioning) + alias(libs.plugins.spotless) +} + +spotless { + kotlin { + ktlint().editorConfigOverride(mapOf("ktlint_standard_filename" to "disabled")) + } } kotlin { diff --git a/arrow-libs/core/arrow-atomic/build.gradle.kts b/arrow-libs/core/arrow-atomic/build.gradle.kts index 332a295df0a..d456512a757 100644 --- a/arrow-libs/core/arrow-atomic/build.gradle.kts +++ b/arrow-libs/core/arrow-atomic/build.gradle.kts @@ -7,6 +7,13 @@ plugins { alias(libs.plugins.arrowGradleConfig.versioning) alias(libs.plugins.kotest.multiplatform) alias(libs.plugins.kotlinx.kover) + alias(libs.plugins.spotless) +} + +spotless { + kotlin { + ktlint().editorConfigOverride(mapOf("ktlint_standard_filename" to "disabled")) + } } apply(from = property("ANIMALSNIFFER_MPP")) diff --git a/arrow-libs/core/arrow-continuations/build.gradle.kts b/arrow-libs/core/arrow-continuations/build.gradle.kts index d3565d208d0..8ebd533bc07 100644 --- a/arrow-libs/core/arrow-continuations/build.gradle.kts +++ b/arrow-libs/core/arrow-continuations/build.gradle.kts @@ -7,6 +7,13 @@ plugins { alias(libs.plugins.arrowGradleConfig.versioning) alias(libs.plugins.kotlinx.kover) alias(libs.plugins.kotest.multiplatform) + alias(libs.plugins.spotless) +} + +spotless { + kotlin { + ktlint().editorConfigOverride(mapOf("ktlint_standard_filename" to "disabled")) + } } apply(from = property("ANIMALSNIFFER_MPP")) diff --git a/arrow-libs/core/arrow-core-retrofit/build.gradle.kts b/arrow-libs/core/arrow-core-retrofit/build.gradle.kts index 248e13b0bc1..28207014442 100644 --- a/arrow-libs/core/arrow-core-retrofit/build.gradle.kts +++ b/arrow-libs/core/arrow-core-retrofit/build.gradle.kts @@ -6,6 +6,13 @@ plugins { alias(libs.plugins.arrowGradleConfig.publish) alias(libs.plugins.kotlinx.serialization) // Needed for testing only alias(libs.plugins.kotlinx.kover) + alias(libs.plugins.spotless) +} + +spotless { + kotlin { + ktlint().editorConfigOverride(mapOf("ktlint_standard_filename" to "disabled")) + } } apply(from = property("ANIMALSNIFFER")) diff --git a/arrow-libs/core/arrow-core-retrofit/src/main/kotlin/arrow/retrofit/adapter/either/ArrowEitherCallAdapter.kt b/arrow-libs/core/arrow-core-retrofit/src/main/kotlin/arrow/retrofit/adapter/either/ArrowEitherCallAdapter.kt index d60464a6946..3c35273716b 100644 --- a/arrow-libs/core/arrow-core-retrofit/src/main/kotlin/arrow/retrofit/adapter/either/ArrowEitherCallAdapter.kt +++ b/arrow-libs/core/arrow-core-retrofit/src/main/kotlin/arrow/retrofit/adapter/either/ArrowEitherCallAdapter.kt @@ -17,7 +17,7 @@ import java.lang.reflect.Type internal class ArrowEitherCallAdapter( retrofit: Retrofit, errorType: Type, - private val bodyType: Type + private val bodyType: Type, ) : CallAdapter>> { private val errorConverter: Converter = @@ -30,7 +30,7 @@ internal class ArrowEitherCallAdapter( class EitherCall( private val original: Call, private val errorConverter: Converter, - private val bodyType: Type + private val bodyType: Type, ) : Call> { override fun enqueue(callback: Callback>) { @@ -52,7 +52,7 @@ internal class ArrowEitherCallAdapter( }, { errorBody, _ -> Response.success(errorBody.left()) - } + }, ) } }) diff --git a/arrow-libs/core/arrow-core-retrofit/src/main/kotlin/arrow/retrofit/adapter/either/ArrowResponseECallAdapter.kt b/arrow-libs/core/arrow-core-retrofit/src/main/kotlin/arrow/retrofit/adapter/either/ArrowResponseECallAdapter.kt index c1157393401..72faaf5d491 100644 --- a/arrow-libs/core/arrow-core-retrofit/src/main/kotlin/arrow/retrofit/adapter/either/ArrowResponseECallAdapter.kt +++ b/arrow-libs/core/arrow-core-retrofit/src/main/kotlin/arrow/retrofit/adapter/either/ArrowResponseECallAdapter.kt @@ -16,7 +16,7 @@ import java.lang.reflect.Type internal class ArrowResponseECallAdapter( retrofit: Retrofit, errorType: Type, - private val bodyType: Type + private val bodyType: Type, ) : CallAdapter>> { private val errorConverter: Converter = @@ -29,7 +29,7 @@ internal class ArrowResponseECallAdapter( class ResponseECall( private val original: Call, private val errorConverter: Converter, - private val bodyType: Type + private val bodyType: Type, ) : Call> { override fun enqueue(callback: Callback>) { @@ -51,7 +51,7 @@ internal class ArrowResponseECallAdapter( }, { errorBody, responseV -> Response.success(ResponseE(responseV.raw(), errorBody.left())) - } + }, ) } }) diff --git a/arrow-libs/core/arrow-core-retrofit/src/main/kotlin/arrow/retrofit/adapter/either/EitherCallAdapterFactory.kt b/arrow-libs/core/arrow-core-retrofit/src/main/kotlin/arrow/retrofit/adapter/either/EitherCallAdapterFactory.kt index 8f44a6834a3..e6e7a910e13 100644 --- a/arrow-libs/core/arrow-core-retrofit/src/main/kotlin/arrow/retrofit/adapter/either/EitherCallAdapterFactory.kt +++ b/arrow-libs/core/arrow-core-retrofit/src/main/kotlin/arrow/retrofit/adapter/either/EitherCallAdapterFactory.kt @@ -78,7 +78,7 @@ public class EitherCallAdapterFactory : CallAdapter.Factory() { val name = parseTypeName(returnType) throw IllegalArgumentException( "Return type must be parameterized as " + - "$name or $name" + "$name or $name", ) } @@ -90,16 +90,17 @@ public class EitherCallAdapterFactory : CallAdapter.Factory() { private fun eitherAdapter( returnType: ParameterizedType, - retrofit: Retrofit + retrofit: Retrofit, ): CallAdapter>? { val wrapperType = getParameterUpperBound(0, returnType) return when (getRawType(wrapperType)) { Either::class.java -> { val (errorType, bodyType) = extractErrorAndReturnType(wrapperType, returnType) - if (errorType == CallError::class.java) + if (errorType == CallError::class.java) { NetworkEitherCallAdapter(bodyType) - else + } else { ArrowEitherCallAdapter(retrofit, errorType, bodyType) + } } ResponseE::class.java -> { val (errorType, bodyType) = extractErrorAndReturnType(wrapperType, returnType) @@ -114,7 +115,7 @@ public class EitherCallAdapterFactory : CallAdapter.Factory() { val name = parseTypeName(returnType) throw IllegalArgumentException( "Return type must be parameterized as " + - "$name or $name" + "$name or $name", ) } val errorType = getParameterUpperBound(0, wrapperType) diff --git a/arrow-libs/core/arrow-core-retrofit/src/main/kotlin/arrow/retrofit/adapter/either/ResponseE.kt b/arrow-libs/core/arrow-core-retrofit/src/main/kotlin/arrow/retrofit/adapter/either/ResponseE.kt index ad255d9f9c7..41db66529d7 100644 --- a/arrow-libs/core/arrow-core-retrofit/src/main/kotlin/arrow/retrofit/adapter/either/ResponseE.kt +++ b/arrow-libs/core/arrow-core-retrofit/src/main/kotlin/arrow/retrofit/adapter/either/ResponseE.kt @@ -6,7 +6,7 @@ import okhttp3.Response public data class ResponseE( val raw: Response, - val body: Either + val body: Either, ) { val code: Int = raw.code() diff --git a/arrow-libs/core/arrow-core-retrofit/src/main/kotlin/arrow/retrofit/adapter/either/eitherAdapter.kt b/arrow-libs/core/arrow-core-retrofit/src/main/kotlin/arrow/retrofit/adapter/either/eitherAdapter.kt index 79c20e4dd1b..c22c70d9cb6 100644 --- a/arrow-libs/core/arrow-core-retrofit/src/main/kotlin/arrow/retrofit/adapter/either/eitherAdapter.kt +++ b/arrow-libs/core/arrow-core-retrofit/src/main/kotlin/arrow/retrofit/adapter/either/eitherAdapter.kt @@ -14,7 +14,7 @@ internal inline fun onResponseFn( bodyType: Type, response: Response, newResponseFn: (R, Response) -> Response, - errorResponseFn: (E, Response) -> Response + errorResponseFn: (E, Response) -> Response, ) { if (response.isSuccessful) { val body = response.body() diff --git a/arrow-libs/core/arrow-core-retrofit/src/main/kotlin/arrow/retrofit/adapter/either/networkhandling/CallError.kt b/arrow-libs/core/arrow-core-retrofit/src/main/kotlin/arrow/retrofit/adapter/either/networkhandling/CallError.kt index f91e08e010a..68961219e97 100644 --- a/arrow-libs/core/arrow-core-retrofit/src/main/kotlin/arrow/retrofit/adapter/either/networkhandling/CallError.kt +++ b/arrow-libs/core/arrow-core-retrofit/src/main/kotlin/arrow/retrofit/adapter/either/networkhandling/CallError.kt @@ -13,7 +13,7 @@ public sealed class CallError public data class HttpError( val code: Int, val message: String, - val body: String + val body: String, ) : CallError() /** diff --git a/arrow-libs/core/arrow-core-retrofit/src/main/kotlin/arrow/retrofit/adapter/either/networkhandling/NetworkEitherCallAdapter.kt b/arrow-libs/core/arrow-core-retrofit/src/main/kotlin/arrow/retrofit/adapter/either/networkhandling/NetworkEitherCallAdapter.kt index f1272a8ba91..d29b194496a 100644 --- a/arrow-libs/core/arrow-core-retrofit/src/main/kotlin/arrow/retrofit/adapter/either/networkhandling/NetworkEitherCallAdapter.kt +++ b/arrow-libs/core/arrow-core-retrofit/src/main/kotlin/arrow/retrofit/adapter/either/networkhandling/NetworkEitherCallAdapter.kt @@ -13,7 +13,7 @@ import java.io.IOException import java.lang.reflect.Type internal class NetworkEitherCallAdapter( - private val successType: Type + private val successType: Type, ) : CallAdapter>> { override fun adapt(call: Call): Call> = EitherCall(call, successType) @@ -23,7 +23,7 @@ internal class NetworkEitherCallAdapter( private class EitherCall( private val delegate: Call, - private val successType: Type + private val successType: Type, ) : Call> { override fun enqueue(callback: Callback>) = delegate.enqueue( @@ -40,7 +40,7 @@ private class EitherCall( return HttpError( code = code(), message = message(), - body = errorBody + body = errorBody, ).left() } @@ -57,8 +57,8 @@ private class EitherCall( IllegalStateException( "Response code is ${code()} but body is null.\n" + "If you expect response body to be null then define your API method as returning Unit:\n" + - "@POST fun postSomething(): Either" - ) + "@POST fun postSomething(): Either", + ), ).left() } } @@ -71,7 +71,7 @@ private class EitherCall( } callback.onResponse(this@EitherCall, Response.success(error.left())) } - } + }, ) override fun timeout(): Timeout = delegate.timeout() diff --git a/arrow-libs/core/arrow-core-retrofit/src/test/kotlin/arrow/retrofit/adapter/either/ArrowEitherCallAdapterTest.kt b/arrow-libs/core/arrow-core-retrofit/src/test/kotlin/arrow/retrofit/adapter/either/ArrowEitherCallAdapterTest.kt index 5a4a4a06413..b6f8f902f18 100644 --- a/arrow-libs/core/arrow-core-retrofit/src/test/kotlin/arrow/retrofit/adapter/either/ArrowEitherCallAdapterTest.kt +++ b/arrow-libs/core/arrow-core-retrofit/src/test/kotlin/arrow/retrofit/adapter/either/ArrowEitherCallAdapterTest.kt @@ -18,73 +18,72 @@ class ArrowEitherCallAdapterTest : StringSpec({ lateinit var server: MockWebServer lateinit var service: SuspendApiTestClient - beforeAny { - server = MockWebServer() - server.start() - service = Retrofit.Builder() - .baseUrl(server.url("/")) - .addConverterFactory(GsonConverterFactory.create()) - .addCallAdapterFactory(EitherCallAdapterFactory.create()) - .build() - .create(SuspendApiTestClient::class.java) - } + beforeAny { + server = MockWebServer() + server.start() + service = Retrofit.Builder() + .baseUrl(server.url("/")) + .addConverterFactory(GsonConverterFactory.create()) + .addCallAdapterFactory(EitherCallAdapterFactory.create()) + .build() + .create(SuspendApiTestClient::class.java) + } - afterAny { server.shutdown() } + afterAny { server.shutdown() } - "should return ResponseMock for 200 with valid JSON" { - server.enqueue(MockResponse().setBody("""{"response":"Arrow rocks"}""")) + "should return ResponseMock for 200 with valid JSON" { + server.enqueue(MockResponse().setBody("""{"response":"Arrow rocks"}""")) - val body = service.getEither() + val body = service.getEither() - body shouldBe ResponseMock("Arrow rocks").right() - } + body shouldBe ResponseMock("Arrow rocks").right() + } - "should return Unit when service method returns Unit and null body received" { - server.enqueue(MockResponse().setResponseCode(204)) + "should return Unit when service method returns Unit and null body received" { + server.enqueue(MockResponse().setResponseCode(204)) - val body = service.postSomething("Sample string") + val body = service.postSomething("Sample string") - body shouldBe Unit.right() - } + body shouldBe Unit.right() + } - "should return Unit when service method returns Unit and JSON body received" { - server.enqueue(MockResponse().setBody("""{"response":"Arrow rocks"}""")) + "should return Unit when service method returns Unit and JSON body received" { + server.enqueue(MockResponse().setBody("""{"response":"Arrow rocks"}""")) - val body = service.postSomething("Sample string") + val body = service.postSomething("Sample string") - body shouldBe Unit.right() - } + body shouldBe Unit.right() + } - "should return ErrorMock for 400 with valid JSON" { - server.enqueue(MockResponse().setBody("""{"errorCode":666}""").setResponseCode(400)) + "should return ErrorMock for 400 with valid JSON" { + server.enqueue(MockResponse().setBody("""{"errorCode":666}""").setResponseCode(400)) - val body = service.getEither() + val body = service.getEither() - body shouldBe ErrorMock(666).left() - } + body shouldBe ErrorMock(666).left() + } - "should throw for 200 with invalid JSON" { - server.enqueue(MockResponse().setBody("""not a valid JSON""")) + "should throw for 200 with invalid JSON" { + server.enqueue(MockResponse().setBody("""not a valid JSON""")) - val body = runCatching { service.getEither() } + val body = runCatching { service.getEither() } - body.isFailure shouldBe true - } + body.isFailure shouldBe true + } - "should throw for 400 and invalid JSON" { - server.enqueue(MockResponse().setBody("""not a valid JSON""").setResponseCode(400)) + "should throw for 400 and invalid JSON" { + server.enqueue(MockResponse().setBody("""not a valid JSON""").setResponseCode(400)) - val body = runCatching { service.getEither() } + val body = runCatching { service.getEither() } - body.isFailure shouldBe true - } + body.isFailure shouldBe true + } - "should throw when server disconnects" { - server.enqueue(MockResponse().apply { socketPolicy = SocketPolicy.DISCONNECT_AFTER_REQUEST }) + "should throw when server disconnects" { + server.enqueue(MockResponse().apply { socketPolicy = SocketPolicy.DISCONNECT_AFTER_REQUEST }) - val body = runCatching { service.getEither() } - - body.isFailure shouldBe true - } + val body = runCatching { service.getEither() } + body.isFailure shouldBe true + } }) diff --git a/arrow-libs/core/arrow-core-retrofit/src/test/kotlin/arrow/retrofit/adapter/either/ArrowResponseEAdapterTest.kt b/arrow-libs/core/arrow-core-retrofit/src/test/kotlin/arrow/retrofit/adapter/either/ArrowResponseEAdapterTest.kt index ad3677d772a..cc43ff7d359 100644 --- a/arrow-libs/core/arrow-core-retrofit/src/test/kotlin/arrow/retrofit/adapter/either/ArrowResponseEAdapterTest.kt +++ b/arrow-libs/core/arrow-core-retrofit/src/test/kotlin/arrow/retrofit/adapter/either/ArrowResponseEAdapterTest.kt @@ -18,85 +18,84 @@ class ArrowResponseEAdapterTest : StringSpec({ lateinit var server: MockWebServer lateinit var service: SuspendApiTestClient - beforeAny { - server = MockWebServer() - server.start() - service = Retrofit.Builder() - .baseUrl(server.url("/")) - .addConverterFactory(GsonConverterFactory.create()) - .addCallAdapterFactory(EitherCallAdapterFactory.create()) - .build() - .create(SuspendApiTestClient::class.java) + beforeAny { + server = MockWebServer() + server.start() + service = Retrofit.Builder() + .baseUrl(server.url("/")) + .addConverterFactory(GsonConverterFactory.create()) + .addCallAdapterFactory(EitherCallAdapterFactory.create()) + .build() + .create(SuspendApiTestClient::class.java) + } + + afterAny { server.shutdown() } + + "should return ResponseMock for 200 with valid JSON" { + server.enqueue(MockResponse().setBody("""{"response":"Arrow rocks"}""")) + + val responseE = service.getResponseE() + + with(responseE) { + code shouldBe 200 + body shouldBe ResponseMock("Arrow rocks").right() } + } - afterAny { server.shutdown() } + "should return Unit when service method returns Unit and null body received" { + server.enqueue(MockResponse().setResponseCode(204)) - "should return ResponseMock for 200 with valid JSON" { - server.enqueue(MockResponse().setBody("""{"response":"Arrow rocks"}""")) + val responseE = service.postSomethingResponseE("Sample string") - val responseE = service.getResponseE() - - with(responseE) { - code shouldBe 200 - body shouldBe ResponseMock("Arrow rocks").right() - } + with(responseE) { + code shouldBe 204 + body shouldBe Unit.right() } + } - "should return Unit when service method returns Unit and null body received" { - server.enqueue(MockResponse().setResponseCode(204)) + "should return Unit when service method returns Unit and JSON body received" { + server.enqueue(MockResponse().setBody("""{"response":"Arrow rocks"}""")) - val responseE = service.postSomethingResponseE("Sample string") + val responseE = service.postSomethingResponseE("Sample string") - with(responseE) { - code shouldBe 204 - body shouldBe Unit.right() - } + with(responseE) { + code shouldBe 200 + body shouldBe Unit.right() } + } - "should return Unit when service method returns Unit and JSON body received" { - server.enqueue(MockResponse().setBody("""{"response":"Arrow rocks"}""")) + "should return ErrorMock for 400 with valid JSON" { + server.enqueue(MockResponse().setBody("""{"errorCode":42}""").setResponseCode(400)) - val responseE = service.postSomethingResponseE("Sample string") + val responseE = service.getResponseE() - with(responseE) { - code shouldBe 200 - body shouldBe Unit.right() - } + with(responseE) { + code shouldBe 400 + body shouldBe ErrorMock(42).left() } + } - "should return ErrorMock for 400 with valid JSON" { - server.enqueue(MockResponse().setBody("""{"errorCode":42}""").setResponseCode(400)) + "should throw for 200 with invalid JSON" { + server.enqueue(MockResponse().setBody("""not a valid JSON""")) - val responseE = service.getResponseE() + val responseE = runCatching { service.getResponseE() } - with(responseE) { - code shouldBe 400 - body shouldBe ErrorMock(42).left() - } - } + responseE.isFailure shouldBe true + } - "should throw for 200 with invalid JSON" { - server.enqueue(MockResponse().setBody("""not a valid JSON""")) + "should throw for 400 and invalid JSON" { + server.enqueue(MockResponse().setBody("""not a valid JSON""").setResponseCode(400)) - val responseE = runCatching { service.getResponseE() } + val responseE = runCatching { service.getResponseE() } - responseE.isFailure shouldBe true - } + responseE.isFailure shouldBe true + } - "should throw for 400 and invalid JSON" { - server.enqueue(MockResponse().setBody("""not a valid JSON""").setResponseCode(400)) + "should throw when server disconnects" { + server.enqueue(MockResponse().apply { socketPolicy = SocketPolicy.DISCONNECT_AFTER_REQUEST }) - val responseE = runCatching { service.getResponseE() } - - responseE.isFailure shouldBe true - } - - "should throw when server disconnects" { - server.enqueue(MockResponse().apply { socketPolicy = SocketPolicy.DISCONNECT_AFTER_REQUEST }) - - val responseE = runCatching { service.getResponseE() } - - responseE.isFailure shouldBe true - } + val responseE = runCatching { service.getResponseE() } + responseE.isFailure shouldBe true + } }) diff --git a/arrow-libs/core/arrow-core-retrofit/src/test/kotlin/arrow/retrofit/adapter/either/networkhandling/NetworkEitherCallAdapterTest.kt b/arrow-libs/core/arrow-core-retrofit/src/test/kotlin/arrow/retrofit/adapter/either/networkhandling/NetworkEitherCallAdapterTest.kt index c4a64b38dd9..5f211a1c195 100644 --- a/arrow-libs/core/arrow-core-retrofit/src/test/kotlin/arrow/retrofit/adapter/either/networkhandling/NetworkEitherCallAdapterTest.kt +++ b/arrow-libs/core/arrow-core-retrofit/src/test/kotlin/arrow/retrofit/adapter/either/networkhandling/NetworkEitherCallAdapterTest.kt @@ -10,9 +10,6 @@ import io.kotest.core.spec.style.StringSpec import io.kotest.core.spec.style.stringSpec import io.kotest.matchers.shouldBe import io.kotest.matchers.types.shouldBeInstanceOf -import java.net.SocketException -import java.net.SocketTimeoutException -import java.util.concurrent.TimeUnit import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.json.Json import okhttp3.MediaType.Companion.toMediaType @@ -24,6 +21,9 @@ import retrofit2.Converter import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory import retrofit2.converter.moshi.MoshiConverterFactory +import java.net.SocketException +import java.net.SocketTimeoutException +import java.util.concurrent.TimeUnit @ExperimentalSerializationApi class NetworkEitherCallAdapterTestSuite : StringSpec({ @@ -33,7 +33,7 @@ class NetworkEitherCallAdapterTestSuite : StringSpec({ }) private fun networkEitherCallAdapterTests( - jsonConverterFactory: Converter.Factory + jsonConverterFactory: Converter.Factory, ) = stringSpec { var server: MockWebServer? = null var service: CallErrorTestClient? = null @@ -70,7 +70,7 @@ private fun networkEitherCallAdapterTests( body shouldBe HttpError( code = 400, message = "Client Error", - body = """{"errorCode":666}""" + body = """{"errorCode":666}""", ).left() } @@ -91,7 +91,7 @@ private fun networkEitherCallAdapterTests( body shouldBe HttpError( code = 400, message = "Client Error", - body = """not a valid JSON""" + body = """not a valid JSON""", ).left() } diff --git a/arrow-libs/core/arrow-core/build.gradle.kts b/arrow-libs/core/arrow-core/build.gradle.kts index d18e202bebb..31e7521e79c 100644 --- a/arrow-libs/core/arrow-core/build.gradle.kts +++ b/arrow-libs/core/arrow-core/build.gradle.kts @@ -9,6 +9,13 @@ plugins { alias(libs.plugins.arrowGradleConfig.versioning) alias(libs.plugins.kotlinx.kover) alias(libs.plugins.kotest.multiplatform) + alias(libs.plugins.spotless) +} + +spotless { + kotlin { + ktlint().editorConfigOverride(mapOf("ktlint_standard_filename" to "disabled")) + } } apply(from = property("ANIMALSNIFFER_MPP")) diff --git a/arrow-libs/core/arrow-core/src/jvmTest/java/arrow/core/DeadlockTest.kt b/arrow-libs/core/arrow-core/src/jvmTest/java/arrow/core/DeadlockTest.kt index 18fa1d62443..8c27c1173e3 100644 --- a/arrow-libs/core/arrow-core/src/jvmTest/java/arrow/core/DeadlockTest.kt +++ b/arrow-libs/core/arrow-core/src/jvmTest/java/arrow/core/DeadlockTest.kt @@ -8,74 +8,73 @@ import kotlinx.coroutines.runBlocking class DeadlockTest : StringSpec({ - "classloader should not deadlock Validated initialization" { - runBlocking { - (0..10).map { i -> - GlobalScope.launch { - if (i % 2 == 0) { - Validated.Invalid(Unit) - } else { - Validated.Valid(null) - } + "classloader should not deadlock Validated initialization" { + runBlocking { + (0..10).map { i -> + GlobalScope.launch { + if (i % 2 == 0) { + Validated.Invalid(Unit) + } else { + Validated.Valid(null) } - }.joinAll() - } + } + }.joinAll() } + } - "classloader should not deadlock Either initialization" { - runBlocking { - (0..10).map { i -> - GlobalScope.launch { - if (i % 2 == 0) { - Either.Left(Unit) - } else { - Either.Right(null) - } + "classloader should not deadlock Either initialization" { + runBlocking { + (0..10).map { i -> + GlobalScope.launch { + if (i % 2 == 0) { + Either.Left(Unit) + } else { + Either.Right(null) } - }.joinAll() - } + } + }.joinAll() } + } - "classloader should not deadlock Option initialization" { - runBlocking { - (0..10).map { i -> - GlobalScope.launch { - if (i % 2 == 0) { - None - } else { - Some(null) - } + "classloader should not deadlock Option initialization" { + runBlocking { + (0..10).map { i -> + GlobalScope.launch { + if (i % 2 == 0) { + None + } else { + Some(null) } - }.joinAll() - } + } + }.joinAll() } + } - "classloader should not deadlock Ior initialization" { - runBlocking { - (0..10).map { i -> - GlobalScope.launch { - if (i % 2 == 0) { - Ior.Left(Unit) - } else { - Ior.Right(null) - } + "classloader should not deadlock Ior initialization" { + runBlocking { + (0..10).map { i -> + GlobalScope.launch { + if (i % 2 == 0) { + Ior.Left(Unit) + } else { + Ior.Right(null) } - }.joinAll() - } + } + }.joinAll() } + } - "classloader should not deadlock Eval initialization" { - runBlocking { - (0..10).map { i -> - GlobalScope.launch { - if (i % 2 == 0) { - Eval.Now(Unit) - } else { - Eval.Later { null } - } + "classloader should not deadlock Eval initialization" { + runBlocking { + (0..10).map { i -> + GlobalScope.launch { + if (i % 2 == 0) { + Eval.Now(Unit) + } else { + Eval.Later { null } } - }.joinAll() - } + } + }.joinAll() } - + } }) diff --git a/arrow-libs/core/arrow-core/src/jvmTest/java/arrow/core/EitherJvmTest.kt b/arrow-libs/core/arrow-core/src/jvmTest/java/arrow/core/EitherJvmTest.kt index a0c5c659be9..0c71878577a 100644 --- a/arrow-libs/core/arrow-core/src/jvmTest/java/arrow/core/EitherJvmTest.kt +++ b/arrow-libs/core/arrow-core/src/jvmTest/java/arrow/core/EitherJvmTest.kt @@ -11,7 +11,7 @@ class EitherJvmTest : StringSpec({ "resolve should throw a Throwable when a fatal Throwable is thrown" { checkAll( Arb.suspendFunThatThrowsFatalThrowable(), - Arb.any() + Arb.any(), ) { f: suspend () -> Either, returnObject: Any -> val comparator: Comparator = @@ -24,7 +24,7 @@ class EitherJvmTest : StringSpec({ success = { a -> handleWithPureFunction(a, returnObject) }, error = { e -> handleWithPureFunction(e, returnObject) }, throwable = { t -> handleWithPureFunction(t, returnObject) }, - unrecoverableState = { handleWithPureFunction(it) } + unrecoverableState = { handleWithPureFunction(it) }, ) } } diff --git a/arrow-libs/core/arrow-core/src/jvmTest/java/arrow/core/EvalJvmTest.kt b/arrow-libs/core/arrow-core/src/jvmTest/java/arrow/core/EvalJvmTest.kt index cf466decb01..382cf99e237 100644 --- a/arrow-libs/core/arrow-core/src/jvmTest/java/arrow/core/EvalJvmTest.kt +++ b/arrow-libs/core/arrow-core/src/jvmTest/java/arrow/core/EvalJvmTest.kt @@ -32,7 +32,7 @@ private data class DeepEval(val eval: Eval) { arbitrary { O.Map { it + 1 } }, arbitrary { O.FlatMap { Eval.Now(it) } }, arbitrary { O.Memoize() }, - arbitrary { O.Defer() } + arbitrary { O.Defer() }, ) } } diff --git a/arrow-libs/core/arrow-core/src/jvmTest/java/arrow/core/NonFatalJvmTest.kt b/arrow-libs/core/arrow-core/src/jvmTest/java/arrow/core/NonFatalJvmTest.kt index f20ae5290c2..a819be52fc9 100644 --- a/arrow-libs/core/arrow-core/src/jvmTest/java/arrow/core/NonFatalJvmTest.kt +++ b/arrow-libs/core/arrow-core/src/jvmTest/java/arrow/core/NonFatalJvmTest.kt @@ -12,7 +12,7 @@ class NonFatalJvmTest : StringSpec({ OutOfMemoryError(), LinkageError(), object : VirtualMachineError() { - } + }, ) "Test fatals using #invoke()" { diff --git a/arrow-libs/fx/arrow-fx-coroutines/build.gradle.kts b/arrow-libs/fx/arrow-fx-coroutines/build.gradle.kts index 994c3a07b5f..3fd60251eed 100644 --- a/arrow-libs/fx/arrow-fx-coroutines/build.gradle.kts +++ b/arrow-libs/fx/arrow-fx-coroutines/build.gradle.kts @@ -6,6 +6,13 @@ plugins { alias(libs.plugins.arrowGradleConfig.publish) alias(libs.plugins.arrowGradleConfig.versioning) alias(libs.plugins.kotlinx.kover) + alias(libs.plugins.spotless) +} + +spotless { + kotlin { + ktlint().editorConfigOverride(mapOf("ktlint_standard_filename" to "disabled")) + } } apply(plugin = "io.kotest.multiplatform") diff --git a/arrow-libs/fx/arrow-fx-stm/build.gradle.kts b/arrow-libs/fx/arrow-fx-stm/build.gradle.kts index 6abc0499027..94d285b5bed 100644 --- a/arrow-libs/fx/arrow-fx-stm/build.gradle.kts +++ b/arrow-libs/fx/arrow-fx-stm/build.gradle.kts @@ -7,6 +7,13 @@ plugins { alias(libs.plugins.arrowGradleConfig.versioning) alias(libs.plugins.kotlinx.kover) alias(libs.plugins.kotest.multiplatform) + alias(libs.plugins.spotless) +} + +spotless { + kotlin { + ktlint().editorConfigOverride(mapOf("ktlint_standard_filename" to "disabled")) + } } apply(from = property("ANIMALSNIFFER_MPP")) diff --git a/arrow-libs/optics/arrow-optics-ksp-plugin/build.gradle.kts b/arrow-libs/optics/arrow-optics-ksp-plugin/build.gradle.kts index 886aae22594..38009ad327a 100644 --- a/arrow-libs/optics/arrow-optics-ksp-plugin/build.gradle.kts +++ b/arrow-libs/optics/arrow-optics-ksp-plugin/build.gradle.kts @@ -6,6 +6,13 @@ plugins { alias(libs.plugins.arrowGradleConfig.publish) alias(libs.plugins.arrowGradleConfig.versioning) alias(libs.plugins.kotlinx.kover) + alias(libs.plugins.spotless) +} + +spotless { + kotlin { + ktlint().editorConfigOverride(mapOf("ktlint_standard_filename" to "disabled")) + } } kotlin { diff --git a/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/OpticsProcessor.kt b/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/OpticsProcessor.kt index bc27f6830c5..8a0d2fd5bcc 100644 --- a/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/OpticsProcessor.kt +++ b/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/OpticsProcessor.kt @@ -51,7 +51,7 @@ class OpticsProcessor(private val codegen: CodeGenerator, private val logger: KS .createNewFile( Dependencies(aggregating = true, *listOfNotNull(klass.containingFile).toTypedArray()), it.`package`, - it.name + "__Optics" + it.name + "__Optics", ) .writer() writer.write(it.asFileText()) diff --git a/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/domain.kt b/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/domain.kt index 2ce1a1cc692..429ab8eb40b 100644 --- a/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/domain.kt +++ b/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/domain.kt @@ -2,7 +2,11 @@ package arrow.optics.plugin.internals import arrow.optics.plugin.companionObject import com.google.devtools.ksp.getVisibility -import com.google.devtools.ksp.symbol.* +import com.google.devtools.ksp.symbol.KSClassDeclaration +import com.google.devtools.ksp.symbol.KSName +import com.google.devtools.ksp.symbol.KSType +import com.google.devtools.ksp.symbol.KSTypeParameter +import com.google.devtools.ksp.symbol.Visibility import java.util.Locale data class ADT(val pckg: KSName, val declaration: KSClassDeclaration, val targets: List) { @@ -35,7 +39,7 @@ enum class OpticsTarget { LENS, PRISM, OPTIONAL, - DSL + DSL, } typealias IsoTarget = Target.Iso @@ -105,6 +109,7 @@ sealed class Focus { abstract val className: String abstract val paramName: String + // only used for type-refining prisms abstract val refinedType: KSType? abstract val onlyOneSealedSubclass: Boolean @@ -158,7 +163,7 @@ data class Snippet( val `package`: String, val name: String, val imports: Set = emptySet(), - val content: String + val content: String, ) { val fqName = "$`package`.$name" } @@ -168,4 +173,4 @@ fun Snippet.asFileText(): String = |${if (`package`.isNotBlank() && `package` != "`unnamed package`") "package $`package`" else ""} |${imports.joinToString(prefix = "\n", separator = "\n", postfix = "\n")} |$content - """.trimMargin() + """.trimMargin() diff --git a/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/dsl.kt b/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/dsl.kt index 4ff9a1dd189..cccef663f05 100644 --- a/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/dsl.kt +++ b/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/dsl.kt @@ -8,7 +8,7 @@ fun generateLensDsl(ele: ADT, optic: DataClassDsl): Snippet { `package` = ele.packageName, name = ele.simpleName, content = processLensSyntax(ele, optic.foci, className), - imports = setOf(import) + imports = setOf(import), ) } @@ -18,7 +18,7 @@ fun generateOptionalDsl(ele: ADT, optic: DataClassDsl): Snippet { `package` = ele.packageName, name = ele.simpleName, content = processOptionalSyntax(ele, optic, className), - imports = setOf(import) + imports = setOf(import), ) } @@ -28,7 +28,7 @@ fun generatePrismDsl(ele: ADT, isoOptic: SealedClassDsl): Snippet { `package` = ele.packageName, name = ele.simpleName, content = processPrismSyntax(ele, isoOptic, className), - imports = setOf(import) + imports = setOf(import), ) } @@ -38,7 +38,7 @@ fun generateIsoDsl(ele: ADT, isoOptic: ValueClassDsl): Snippet { `package` = ele.packageName, name = ele.simpleName, content = processIsoSyntax(ele, isoOptic, className), - imports = setOf(import) + imports = setOf(import), ) } @@ -46,39 +46,41 @@ private fun processLensSyntax(ele: ADT, foci: List, className: String): S return if (ele.typeParameters.isEmpty()) { foci.joinToString(separator = "\n") { focus -> """ - |${ele.visibilityModifierName} inline val $Iso.${focus.lensParamName()}: $Lens inline get() = this + ${className}.${focus.lensParamName()} - |${ele.visibilityModifierName} inline val $Lens.${focus.lensParamName()}: $Lens inline get() = this + ${className}.${focus.lensParamName()} - |${ele.visibilityModifierName} inline val $Optional.${focus.lensParamName()}: $Optional inline get() = this + ${className}.${focus.lensParamName()} - |${ele.visibilityModifierName} inline val $Prism.${focus.lensParamName()}: $Optional inline get() = this + ${className}.${focus.lensParamName()} - |${ele.visibilityModifierName} inline val $Getter.${focus.lensParamName()}: $Getter inline get() = this + ${className}.${focus.lensParamName()} - |${ele.visibilityModifierName} inline val $Setter.${focus.lensParamName()}: $Setter inline get() = this + ${className}.${focus.lensParamName()} - |${ele.visibilityModifierName} inline val $Traversal.${focus.lensParamName()}: $Traversal inline get() = this + ${className}.${focus.lensParamName()} - |${ele.visibilityModifierName} inline val $Fold.${focus.lensParamName()}: $Fold inline get() = this + ${className}.${focus.lensParamName()} - |${ele.visibilityModifierName} inline val $Every.${focus.lensParamName()}: $Every inline get() = this + ${className}.${focus.lensParamName()} - |""".trimMargin() + |${ele.visibilityModifierName} inline val $Iso.${focus.lensParamName()}: $Lens inline get() = this + $className.${focus.lensParamName()} + |${ele.visibilityModifierName} inline val $Lens.${focus.lensParamName()}: $Lens inline get() = this + $className.${focus.lensParamName()} + |${ele.visibilityModifierName} inline val $Optional.${focus.lensParamName()}: $Optional inline get() = this + $className.${focus.lensParamName()} + |${ele.visibilityModifierName} inline val $Prism.${focus.lensParamName()}: $Optional inline get() = this + $className.${focus.lensParamName()} + |${ele.visibilityModifierName} inline val $Getter.${focus.lensParamName()}: $Getter inline get() = this + $className.${focus.lensParamName()} + |${ele.visibilityModifierName} inline val $Setter.${focus.lensParamName()}: $Setter inline get() = this + $className.${focus.lensParamName()} + |${ele.visibilityModifierName} inline val $Traversal.${focus.lensParamName()}: $Traversal inline get() = this + $className.${focus.lensParamName()} + |${ele.visibilityModifierName} inline val $Fold.${focus.lensParamName()}: $Fold inline get() = this + $className.${focus.lensParamName()} + |${ele.visibilityModifierName} inline val $Every.${focus.lensParamName()}: $Every inline get() = this + $className.${focus.lensParamName()} + | + """.trimMargin() } } else { val sourceClassNameWithParams = "${ele.sourceClassName}${ele.angledTypeParameters}" - val joinedTypeParams = ele.typeParameters.joinToString(separator=",") + val joinedTypeParams = ele.typeParameters.joinToString(separator = ",") foci.joinToString(separator = "\n") { focus -> """ - |${ele.visibilityModifierName} inline fun $Iso.${focus.lensParamName()}(): $Lens = this + ${className}.${focus.lensParamName()}() - |${ele.visibilityModifierName} inline fun $Lens.${focus.lensParamName()}(): $Lens = this + ${className}.${focus.lensParamName()}() - |${ele.visibilityModifierName} inline fun $Optional.${focus.lensParamName()}(): $Optional = this + ${className}.${focus.lensParamName()}() - |${ele.visibilityModifierName} inline fun $Prism.${focus.lensParamName()}(): $Optional = this + ${className}.${focus.lensParamName()}() - |${ele.visibilityModifierName} inline fun $Getter.${focus.lensParamName()}(): $Getter = this + ${className}.${focus.lensParamName()}() - |${ele.visibilityModifierName} inline fun $Setter.${focus.lensParamName()}(): $Setter = this + ${className}.${focus.lensParamName()}() - |${ele.visibilityModifierName} inline fun $Traversal.${focus.lensParamName()}(): $Traversal = this + ${className}.${focus.lensParamName()}() - |${ele.visibilityModifierName} inline fun $Fold.${focus.lensParamName()}(): $Fold = this + ${className}.${focus.lensParamName()}() - |${ele.visibilityModifierName} inline fun $Every.${focus.lensParamName()}(): $Every = this + ${className}.${focus.lensParamName()}() - |""".trimMargin() + |${ele.visibilityModifierName} inline fun $Iso.${focus.lensParamName()}(): $Lens = this + $className.${focus.lensParamName()}() + |${ele.visibilityModifierName} inline fun $Lens.${focus.lensParamName()}(): $Lens = this + $className.${focus.lensParamName()}() + |${ele.visibilityModifierName} inline fun $Optional.${focus.lensParamName()}(): $Optional = this + $className.${focus.lensParamName()}() + |${ele.visibilityModifierName} inline fun $Prism.${focus.lensParamName()}(): $Optional = this + $className.${focus.lensParamName()}() + |${ele.visibilityModifierName} inline fun $Getter.${focus.lensParamName()}(): $Getter = this + $className.${focus.lensParamName()}() + |${ele.visibilityModifierName} inline fun $Setter.${focus.lensParamName()}(): $Setter = this + $className.${focus.lensParamName()}() + |${ele.visibilityModifierName} inline fun $Traversal.${focus.lensParamName()}(): $Traversal = this + $className.${focus.lensParamName()}() + |${ele.visibilityModifierName} inline fun $Fold.${focus.lensParamName()}(): $Fold = this + $className.${focus.lensParamName()}() + |${ele.visibilityModifierName} inline fun $Every.${focus.lensParamName()}(): $Every = this + $className.${focus.lensParamName()}() + | + """.trimMargin() } } } private fun processOptionalSyntax(ele: ADT, optic: DataClassDsl, className: String): String { val sourceClassNameWithParams = "${ele.sourceClassName}${ele.angledTypeParameters}" - val joinedTypeParams = ele.typeParameters.joinToString(separator=",") + val joinedTypeParams = ele.typeParameters.joinToString(separator = ",") return optic.foci.filterNot { it is NonNullFocus }.joinToString(separator = "\n") { focus -> val targetClassName = when (focus) { @@ -87,27 +89,29 @@ private fun processOptionalSyntax(ele: ADT, optic: DataClassDsl, className: Stri is Focus.NonNull -> "" } if (ele.typeParameters.isEmpty()) { - """ - |${ele.visibilityModifierName} inline val $Iso.${focus.paramName}: $Optional inline get() = this + ${className}.${focus.paramName} - |${ele.visibilityModifierName} inline val $Lens.${focus.paramName}: $Optional inline get() = this + ${className}.${focus.paramName} - |${ele.visibilityModifierName} inline val $Optional.${focus.paramName}: $Optional inline get() = this + ${className}.${focus.paramName} - |${ele.visibilityModifierName} inline val $Prism.${focus.paramName}: $Optional inline get() = this + ${className}.${focus.paramName} - |${ele.visibilityModifierName} inline val $Setter.${focus.paramName}: $Setter inline get() = this + ${className}.${focus.paramName} - |${ele.visibilityModifierName} inline val $Traversal.${focus.paramName}: $Traversal inline get() = this + ${className}.${focus.paramName} - |${ele.visibilityModifierName} inline val $Fold.${focus.paramName}: $Fold inline get() = this + ${className}.${focus.paramName} - |${ele.visibilityModifierName} inline val $Every.${focus.paramName}: $Every inline get() = this + ${className}.${focus.paramName} - |""".trimMargin() + """ + |${ele.visibilityModifierName} inline val $Iso.${focus.paramName}: $Optional inline get() = this + $className.${focus.paramName} + |${ele.visibilityModifierName} inline val $Lens.${focus.paramName}: $Optional inline get() = this + $className.${focus.paramName} + |${ele.visibilityModifierName} inline val $Optional.${focus.paramName}: $Optional inline get() = this + $className.${focus.paramName} + |${ele.visibilityModifierName} inline val $Prism.${focus.paramName}: $Optional inline get() = this + $className.${focus.paramName} + |${ele.visibilityModifierName} inline val $Setter.${focus.paramName}: $Setter inline get() = this + $className.${focus.paramName} + |${ele.visibilityModifierName} inline val $Traversal.${focus.paramName}: $Traversal inline get() = this + $className.${focus.paramName} + |${ele.visibilityModifierName} inline val $Fold.${focus.paramName}: $Fold inline get() = this + $className.${focus.paramName} + |${ele.visibilityModifierName} inline val $Every.${focus.paramName}: $Every inline get() = this + $className.${focus.paramName} + | + """.trimMargin() } else { """ - |${ele.visibilityModifierName} inline fun $Iso.${focus.paramName}(): $Optional = this + ${className}.${focus.paramName}() - |${ele.visibilityModifierName} inline fun $Lens.${focus.paramName}(): $Optional = this + ${className}.${focus.paramName}() - |${ele.visibilityModifierName} inline fun $Optional.${focus.paramName}(): $Optional = this + ${className}.${focus.paramName}() - |${ele.visibilityModifierName} inline fun $Prism.${focus.paramName}(): $Optional = this + ${className}.${focus.paramName}() - |${ele.visibilityModifierName} inline fun $Setter.${focus.paramName}(): $Setter = this + ${className}.${focus.paramName}() - |${ele.visibilityModifierName} inline fun $Traversal.${focus.paramName}(): $Traversal = this + ${className}.${focus.paramName}() - |${ele.visibilityModifierName} inline fun $Fold.${focus.paramName}(): $Fold = this + ${className}.${focus.paramName}() - |${ele.visibilityModifierName} inline fun $Every.${focus.paramName}(): $Every = this + ${className}.${focus.paramName}() - |""".trimMargin() + |${ele.visibilityModifierName} inline fun $Iso.${focus.paramName}(): $Optional = this + $className.${focus.paramName}() + |${ele.visibilityModifierName} inline fun $Lens.${focus.paramName}(): $Optional = this + $className.${focus.paramName}() + |${ele.visibilityModifierName} inline fun $Optional.${focus.paramName}(): $Optional = this + $className.${focus.paramName}() + |${ele.visibilityModifierName} inline fun $Prism.${focus.paramName}(): $Optional = this + $className.${focus.paramName}() + |${ele.visibilityModifierName} inline fun $Setter.${focus.paramName}(): $Setter = this + $className.${focus.paramName}() + |${ele.visibilityModifierName} inline fun $Traversal.${focus.paramName}(): $Traversal = this + $className.${focus.paramName}() + |${ele.visibilityModifierName} inline fun $Fold.${focus.paramName}(): $Fold = this + $className.${focus.paramName}() + |${ele.visibilityModifierName} inline fun $Every.${focus.paramName}(): $Every = this + $className.${focus.paramName}() + | + """.trimMargin() } } } @@ -116,33 +120,35 @@ private fun processPrismSyntax(ele: ADT, dsl: SealedClassDsl, className: String) return if (ele.typeParameters.isEmpty()) { dsl.foci.joinToString(separator = "\n\n") { focus -> """ - |${ele.visibilityModifierName} inline val $Iso.${focus.paramName}: $Prism inline get() = this + ${className}.${focus.paramName} - |${ele.visibilityModifierName} inline val $Lens.${focus.paramName}: $Optional inline get() = this + ${className}.${focus.paramName} - |${ele.visibilityModifierName} inline val $Optional.${focus.paramName}: $Optional inline get() = this + ${className}.${focus.paramName} - |${ele.visibilityModifierName} inline val $Prism.${focus.paramName}: $Prism inline get() = this + ${className}.${focus.paramName} - |${ele.visibilityModifierName} inline val $Setter.${focus.paramName}: $Setter inline get() = this + ${className}.${focus.paramName} - |${ele.visibilityModifierName} inline val $Traversal.${focus.paramName}: $Traversal inline get() = this + ${className}.${focus.paramName} - |${ele.visibilityModifierName} inline val $Fold.${focus.paramName}: $Fold inline get() = this + ${className}.${focus.paramName} - |${ele.visibilityModifierName} inline val $Every.${focus.paramName}: $Every inline get() = this + ${className}.${focus.paramName} - |""".trimMargin() + |${ele.visibilityModifierName} inline val $Iso.${focus.paramName}: $Prism inline get() = this + $className.${focus.paramName} + |${ele.visibilityModifierName} inline val $Lens.${focus.paramName}: $Optional inline get() = this + $className.${focus.paramName} + |${ele.visibilityModifierName} inline val $Optional.${focus.paramName}: $Optional inline get() = this + $className.${focus.paramName} + |${ele.visibilityModifierName} inline val $Prism.${focus.paramName}: $Prism inline get() = this + $className.${focus.paramName} + |${ele.visibilityModifierName} inline val $Setter.${focus.paramName}: $Setter inline get() = this + $className.${focus.paramName} + |${ele.visibilityModifierName} inline val $Traversal.${focus.paramName}: $Traversal inline get() = this + $className.${focus.paramName} + |${ele.visibilityModifierName} inline val $Fold.${focus.paramName}: $Fold inline get() = this + $className.${focus.paramName} + |${ele.visibilityModifierName} inline val $Every.${focus.paramName}: $Every inline get() = this + $className.${focus.paramName} + | + """.trimMargin() } } else { dsl.foci.joinToString(separator = "\n\n") { focus -> val sourceClassNameWithParams = focus.refinedType?.qualifiedString() ?: "${ele.sourceClassName}${ele.angledTypeParameters}" val joinedTypeParams = when { focus.refinedArguments.isEmpty() -> "" - else -> focus.refinedArguments.joinToString(separator=",") + else -> focus.refinedArguments.joinToString(separator = ",") } """ - |${ele.visibilityModifierName} inline fun $Iso.${focus.paramName}(): $Prism = this + ${className}.${focus.paramName}() + |${ele.visibilityModifierName} inline fun $Iso.${focus.paramName}(): $Prism = this + $className.${focus.paramName}() |${ele.visibilityModifierName} inline fun $Lens.${focus.paramName}(): $Optional = this + ${ele.sourceClassName}.${focus.paramName}() - |${ele.visibilityModifierName} inline fun $Optional.${focus.paramName}(): $Optional = this + ${className}.${focus.paramName}() - |${ele.visibilityModifierName} inline fun $Prism.${focus.paramName}(): $Prism = this + ${className}.${focus.paramName}() - |${ele.visibilityModifierName} inline fun $Setter.${focus.paramName}(): $Setter = this + ${className}.${focus.paramName}() - |${ele.visibilityModifierName} inline fun $Traversal.${focus.paramName}(): $Traversal = this + ${className}.${focus.paramName}() - |${ele.visibilityModifierName} inline fun $Fold.${focus.paramName}(): $Fold = this + ${className}.${focus.paramName}() - |${ele.visibilityModifierName} inline fun $Every.${focus.paramName}(): $Every = this + ${className}.${focus.paramName}() - |""".trimMargin() + |${ele.visibilityModifierName} inline fun $Optional.${focus.paramName}(): $Optional = this + $className.${focus.paramName}() + |${ele.visibilityModifierName} inline fun $Prism.${focus.paramName}(): $Prism = this + $className.${focus.paramName}() + |${ele.visibilityModifierName} inline fun $Setter.${focus.paramName}(): $Setter = this + $className.${focus.paramName}() + |${ele.visibilityModifierName} inline fun $Traversal.${focus.paramName}(): $Traversal = this + $className.${focus.paramName}() + |${ele.visibilityModifierName} inline fun $Fold.${focus.paramName}(): $Fold = this + $className.${focus.paramName}() + |${ele.visibilityModifierName} inline fun $Every.${focus.paramName}(): $Every = this + $className.${focus.paramName}() + | + """.trimMargin() } } } @@ -151,33 +157,35 @@ private fun processIsoSyntax(ele: ADT, dsl: ValueClassDsl, className: String): S if (ele.typeParameters.isEmpty()) { dsl.foci.joinToString(separator = "\n\n") { focus -> """ - |${ele.visibilityModifierName} inline val $Iso.${focus.paramName}: $Iso inline get() = this + ${className}.${focus.paramName} - |${ele.visibilityModifierName} inline val $Lens.${focus.paramName}: $Lens inline get() = this + ${className}.${focus.paramName} - |${ele.visibilityModifierName} inline val $Optional.${focus.paramName}: $Optional inline get() = this + ${className}.${focus.paramName} - |${ele.visibilityModifierName} inline val $Prism.${focus.paramName}: $Prism inline get() = this + ${className}.${focus.paramName} - |${ele.visibilityModifierName} inline val $Setter.${focus.paramName}: $Setter inline get() = this + ${className}.${focus.paramName} - |${ele.visibilityModifierName} inline val $Traversal.${focus.paramName}: $Traversal inline get() = this + ${className}.${focus.paramName} - |${ele.visibilityModifierName} inline val $Fold.${focus.paramName}: $Fold inline get() = this + ${className}.${focus.paramName} - |${ele.visibilityModifierName} inline val $Every.${focus.paramName}: $Every inline get() = this + ${className}.${focus.paramName} - |""".trimMargin() + |${ele.visibilityModifierName} inline val $Iso.${focus.paramName}: $Iso inline get() = this + $className.${focus.paramName} + |${ele.visibilityModifierName} inline val $Lens.${focus.paramName}: $Lens inline get() = this + $className.${focus.paramName} + |${ele.visibilityModifierName} inline val $Optional.${focus.paramName}: $Optional inline get() = this + $className.${focus.paramName} + |${ele.visibilityModifierName} inline val $Prism.${focus.paramName}: $Prism inline get() = this + $className.${focus.paramName} + |${ele.visibilityModifierName} inline val $Setter.${focus.paramName}: $Setter inline get() = this + $className.${focus.paramName} + |${ele.visibilityModifierName} inline val $Traversal.${focus.paramName}: $Traversal inline get() = this + $className.${focus.paramName} + |${ele.visibilityModifierName} inline val $Fold.${focus.paramName}: $Fold inline get() = this + $className.${focus.paramName} + |${ele.visibilityModifierName} inline val $Every.${focus.paramName}: $Every inline get() = this + $className.${focus.paramName} + | + """.trimMargin() } } else { dsl.foci.joinToString(separator = "\n\n") { focus -> val sourceClassNameWithParams = focus.refinedType?.qualifiedString() ?: "${ele.sourceClassName}${ele.angledTypeParameters}" val joinedTypeParams = when { focus.refinedArguments.isEmpty() -> "" - else -> focus.refinedArguments.joinToString(separator=",") + else -> focus.refinedArguments.joinToString(separator = ",") } """ - |${ele.visibilityModifierName} inline fun $Iso.${focus.paramName}(): $Iso = this + ${className}.${focus.paramName}() - |${ele.visibilityModifierName} inline fun $Lens.${focus.paramName}(): $Lens = this + ${className}.${focus.paramName}() - |${ele.visibilityModifierName} inline fun $Optional.${focus.paramName}(): $Optional = this + ${className}.${focus.paramName}() - |${ele.visibilityModifierName} inline fun $Prism.${focus.paramName}(): $Prism = this + ${className}.${focus.paramName}() - |${ele.visibilityModifierName} inline fun $Setter.${focus.paramName}(): $Setter = this + ${className}.${focus.paramName}() - |${ele.visibilityModifierName} inline fun $Traversal.${focus.paramName}(): $Traversal = this + ${className}.${focus.paramName}() - |${ele.visibilityModifierName} inline fun $Fold.${focus.paramName}(): $Fold = this + ${className}.${focus.paramName}() - |${ele.visibilityModifierName} inline fun $Every.${focus.paramName}(): $Every = this + ${className}.${focus.paramName}() - |""".trimMargin() + |${ele.visibilityModifierName} inline fun $Iso.${focus.paramName}(): $Iso = this + $className.${focus.paramName}() + |${ele.visibilityModifierName} inline fun $Lens.${focus.paramName}(): $Lens = this + $className.${focus.paramName}() + |${ele.visibilityModifierName} inline fun $Optional.${focus.paramName}(): $Optional = this + $className.${focus.paramName}() + |${ele.visibilityModifierName} inline fun $Prism.${focus.paramName}(): $Prism = this + $className.${focus.paramName}() + |${ele.visibilityModifierName} inline fun $Setter.${focus.paramName}(): $Setter = this + $className.${focus.paramName}() + |${ele.visibilityModifierName} inline fun $Traversal.${focus.paramName}(): $Traversal = this + $className.${focus.paramName}() + |${ele.visibilityModifierName} inline fun $Fold.${focus.paramName}(): $Fold = this + $className.${focus.paramName}() + |${ele.visibilityModifierName} inline fun $Every.${focus.paramName}(): $Every = this + $className.${focus.paramName}() + | + """.trimMargin() } } diff --git a/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/errors.kt b/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/errors.kt index 7d634ac6e21..7dc4a0bd138 100644 --- a/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/errors.kt +++ b/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/errors.kt @@ -5,14 +5,16 @@ val String.otherClassTypeErrorMessage """ |$this cannot be annotated with @optics | ^ - |Only data, sealed, and value classes can be annotated with @optics""".trimMargin() + |Only data, sealed, and value classes can be annotated with @optics + """.trimMargin() val String.typeParametersErrorMessage get() = """ |$this cannot be annotated with @optics | ^ - |Only classes with no type parameters can be annotated with @optics""".trimMargin() + |Only classes with no type parameters can be annotated with @optics + """.trimMargin() val String.lensErrorMessage get() = @@ -21,7 +23,7 @@ val String.lensErrorMessage | ^ |arrow.optics.OpticsTarget.LENS is an invalid @optics argument for $this. |It is only valid for data classes. - """.trimMargin() + """.trimMargin() val String.optionalErrorMessage get() = @@ -30,7 +32,7 @@ val String.optionalErrorMessage | ^ |arrow.optics.OpticsTarget.OPTIONAL is an invalid @optics argument for $this. |It is only valid for data classes. - """.trimMargin() + """.trimMargin() val String.prismErrorMessage get() = @@ -39,7 +41,7 @@ val String.prismErrorMessage | ^ |arrow.optics.OpticsTarget.PRISM is an invalid @optics argument for $this. |It is only valid for sealed classes. - """.trimMargin() + """.trimMargin() val String.isoErrorMessage get() = @@ -48,7 +50,7 @@ val String.isoErrorMessage | ^ |arrow.optics.OpticsTarget.ISO is an invalid @optics argument for $this. |It is only valid for data and value classes. - """.trimMargin() + """.trimMargin() val String.isoTooBigErrorMessage get() = @@ -56,7 +58,7 @@ val String.isoTooBigErrorMessage |Cannot generate arrow.optics.Iso for $this | ^ |Iso generation is supported for data classes with up to 22 constructor parameters. - """.trimMargin() + """.trimMargin() val String.dslErrorMessage get() = @@ -65,11 +67,12 @@ val String.dslErrorMessage | ^ |arrow.optics.OpticsTarget.DSL is an invalid @optics argument for $this. |It is only valid for data classes and sealed classes. - """.trimMargin() + """.trimMargin() val String.noCompanion get() = """ |$this must declare a companion object | ^ - |A companion object is required for the generated optics""".trimMargin() + |A companion object is required for the generated optics + """.trimMargin() diff --git a/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/isos.kt b/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/isos.kt index 64a89d6a746..0dc908bbd5e 100644 --- a/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/isos.kt +++ b/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/isos.kt @@ -32,7 +32,7 @@ private fun processElement(iso: ADT, target: Target): String { "nineteenth", "twentieth", "twentyFirst", - "twentySecond" + "twentySecond", ) fun Focus.format(): String = @@ -79,5 +79,6 @@ private fun processElement(iso: ADT, target: Target): String { | get = { ${iso.sourceName}: $sourceClassNameWithParams -> ${tupleConstructor()} }, | reverseGet = { ${classConstructorFromTuple()} } |) - |""".trimMargin() + | + """.trimMargin() } diff --git a/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/lenses.kt b/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/lenses.kt index 6b75addd841..5f0d243e368 100644 --- a/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/lenses.kt +++ b/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/lenses.kt @@ -6,7 +6,7 @@ internal fun generateLenses(ele: ADT, target: LensTarget) = Snippet( `package` = ele.packageName, name = ele.simpleName, - content = processElement(ele, target.foci) + content = processElement(ele, target.foci), ) private fun String.toUpperCamelCase(): String = @@ -17,7 +17,7 @@ private fun String.toUpperCamelCase(): String = it.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() } - } + }, ) private fun processElement(adt: ADT, foci: List): String { @@ -34,17 +34,18 @@ private fun processElement(adt: ADT, foci: List): String { | get = { ${adt.sourceName}: $sourceClassNameWithParams -> ${adt.sourceName}.${ focus.paramName.plusIfNotBlank( prefix = "`", - postfix = "`" + postfix = "`", ) } }, | set = { ${adt.sourceName}: $sourceClassNameWithParams, value: ${focus.className} -> ${adt.sourceName}.copy(${ focus.paramName.plusIfNotBlank( prefix = "`", - postfix = "`" + postfix = "`", ) } = value) } |) - |""".trimMargin() + | + """.trimMargin() } } diff --git a/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/optional.kt b/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/optional.kt index 6a23c765d67..1c2260e24d1 100644 --- a/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/optional.kt +++ b/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/optional.kt @@ -5,8 +5,8 @@ internal fun generateOptionals(ele: ADT, target: OptionalTarget) = `package` = ele.packageName, name = ele.simpleName, imports = - setOf("import arrow.core.left", "import arrow.core.right", "import arrow.core.toOption"), - content = processElement(ele, target.foci) + setOf("import arrow.core.left", "import arrow.core.right", "import arrow.core.toOption"), + content = processElement(ele, target.foci), ) private fun processElement(ele: ADT, foci: List): String = @@ -30,7 +30,7 @@ private fun processElement(ele: ADT, foci: List): String = "{ ${ele.sourceName}: $sourceClassNameWithParams -> ${ele.sourceName}.${ focus.paramName.plusIfNotBlank( prefix = "`", - postfix = "`" + postfix = "`", ) }$toNullable?.right() ?: ${ele.sourceName}.left() }" fun setF(fromNullable: String = "") = @@ -48,5 +48,6 @@ private fun processElement(ele: ADT, foci: List): String = | getOrModify = $getOrModify, | set = { ${ele.sourceName}: $sourceClassNameWithParams, value: $targetClassName -> $set } |) - |""".trimMargin() + | + """.trimMargin() } diff --git a/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/prism.kt b/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/prism.kt index 5210ca29c2c..db28ede07a9 100644 --- a/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/prism.kt +++ b/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/prism.kt @@ -5,8 +5,8 @@ internal fun generatePrisms(ele: ADT, target: PrismTarget) = `package` = ele.packageName, name = ele.simpleName, imports = - setOf("import arrow.core.left", "import arrow.core.right", "import arrow.core.identity"), - content = processElement(ele, target.foci) + setOf("import arrow.core.left", "import arrow.core.right", "import arrow.core.identity"), + content = processElement(ele, target.foci), ) private fun processElement(ele: ADT, foci: List): String { @@ -24,7 +24,9 @@ private fun processElement(ele: ADT, foci: List): String { "${ele.visibilityModifierName} inline fun $angledTypeParameters ${ele.sourceClassName}.Companion.${focus.paramName}(): $Prism<$sourceClassNameWithParams, ${focus.className}>" } - val elseBranch = if (focus.onlyOneSealedSubclass) "" else """ + val elseBranch = if (focus.onlyOneSealedSubclass) { + "" + } else """ | else -> ${ele.sourceName}.left() """.trimMargin() @@ -38,6 +40,7 @@ private fun processElement(ele: ADT, foci: List): String { | }, | reverseGet = ::identity |) - |""".trimMargin() + | + """.trimMargin() } } diff --git a/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/processor.kt b/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/processor.kt index d2c9a20451a..6725c87842c 100644 --- a/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/processor.kt +++ b/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/processor.kt @@ -4,7 +4,11 @@ import arrow.optics.plugin.isDataClass import arrow.optics.plugin.isSealed import arrow.optics.plugin.isValue import com.google.devtools.ksp.processing.KSPLogger -import com.google.devtools.ksp.symbol.* +import com.google.devtools.ksp.symbol.KSClassDeclaration +import com.google.devtools.ksp.symbol.KSDeclaration +import com.google.devtools.ksp.symbol.KSType +import com.google.devtools.ksp.symbol.KSTypeArgument +import com.google.devtools.ksp.symbol.KSTypeParameter import com.google.devtools.ksp.symbol.Variance.INVARIANT import java.util.Locale @@ -28,23 +32,23 @@ internal fun adt(c: KSClassDeclaration, logger: KSPLogger): ADT = .let(::PrismTarget) OpticsTarget.DSL -> evalAnnotatedDslElement(c, logger) } - } + }, ) internal fun KSClassDeclaration.targets(): List = targetsFromOpticsAnnotation().let { targets -> when { isSealed -> - if (targets.isEmpty()) + if (targets.isEmpty()) { listOf(OpticsTarget.PRISM, OpticsTarget.DSL) - else targets.filter { it == OpticsTarget.PRISM || it == OpticsTarget.DSL } + } else targets.filter { it == OpticsTarget.PRISM || it == OpticsTarget.DSL } isValue -> listOf(OpticsTarget.ISO, OpticsTarget.DSL) .filter { targets.isEmpty() || it in targets } else -> - if (targets.isEmpty()) + if (targets.isEmpty()) { listOf(OpticsTarget.ISO, OpticsTarget.LENS, OpticsTarget.OPTIONAL, OpticsTarget.DSL) - else targets.filter { + } else targets.filter { when (it) { OpticsTarget.ISO, OpticsTarget.LENS, OpticsTarget.OPTIONAL, OpticsTarget.DSL -> true else -> false @@ -59,7 +63,7 @@ internal fun KSClassDeclaration.targetsFromOpticsAnnotation(): List).orEmpty().mapNotNull { it as? KSType } } ?.mapNotNull { - when (it.qualifiedString() ) { + when (it.qualifiedString()) { "arrow.optics.OpticsTarget.ISO" -> OpticsTarget.ISO "arrow.optics.OpticsTarget.LENS" -> OpticsTarget.LENS "arrow.optics.OpticsTarget.PRISM" -> OpticsTarget.PRISM @@ -72,7 +76,7 @@ internal fun KSClassDeclaration.targetsFromOpticsAnnotation(): List = when { element.isSealed -> { @@ -82,7 +86,7 @@ internal fun evalAnnotatedPrismElement( it.primaryConstructor?.returnType?.resolve()?.qualifiedString() ?: it.qualifiedNameOrSimpleName, it.simpleName.asString().replaceFirstChar { c -> c.lowercase(Locale.getDefault()) }, it.superTypes.first().resolve(), - onlyOneSealedSubclass = sealedSubclasses.size == 1 + onlyOneSealedSubclass = sealedSubclasses.size == 1, ) } } @@ -101,7 +105,7 @@ internal fun KSClassDeclaration.sealedSubclassFqNameList(): List = internal fun evalAnnotatedDataClass( element: KSClassDeclaration, errorMessage: String, - logger: KSPLogger + logger: KSPLogger, ): List = when { element.isDataClass -> @@ -120,11 +124,11 @@ internal fun evalAnnotatedDslElement(element: KSClassDeclaration, logger: KSPLog DataClassDsl( element .getConstructorTypesNames() - .zip(element.getConstructorParamNames(), Focus.Companion::invoke) + .zip(element.getConstructorParamNames(), Focus.Companion::invoke), ) element.isValue -> ValueClassDsl( - Focus(element.getConstructorTypesNames().first(), element.getConstructorParamNames().first()) + Focus(element.getConstructorTypesNames().first(), element.getConstructorParamNames().first()), ) element.isSealed -> SealedClassDsl(evalAnnotatedPrismElement(element, element.qualifiedNameOrSimpleName.prismErrorMessage, logger)) @@ -134,7 +138,7 @@ internal fun evalAnnotatedDslElement(element: KSClassDeclaration, logger: KSPLog internal fun evalAnnotatedIsoElement( element: KSClassDeclaration, errorMessage: String, - logger: KSPLogger + logger: KSPLogger, ): List = when { element.isDataClass -> diff --git a/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/utils.kt b/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/utils.kt index f7bce0daf7d..edacd98bcd8 100644 --- a/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/utils.kt +++ b/arrow-libs/optics/arrow-optics-ksp-plugin/src/main/kotlin/arrow/optics/plugin/internals/utils.kt @@ -15,7 +15,6 @@ fun String.plusIfNotBlank(prefix: String = "", postfix: String = "") = fun KSName.asSanitizedString(delimiter: String = ".", prefix: String = "") = asString().splitToSequence(delimiter).joinToString(delimiter, prefix) { if (it in kotlinKeywords) "`$it`" else it } - private val kotlinKeywords = setOf( // Hard keywords "as", diff --git a/arrow-libs/optics/arrow-optics-ksp-plugin/src/test/kotlin/arrow/optics/plugin/Compilation.kt b/arrow-libs/optics/arrow-optics-ksp-plugin/src/test/kotlin/arrow/optics/plugin/Compilation.kt index 0399c7c17da..37380de368a 100644 --- a/arrow-libs/optics/arrow-optics-ksp-plugin/src/test/kotlin/arrow/optics/plugin/Compilation.kt +++ b/arrow-libs/optics/arrow-optics-ksp-plugin/src/test/kotlin/arrow/optics/plugin/Compilation.kt @@ -62,7 +62,7 @@ fun buildCompilation(text: String, allWarningsAsErrors: Boolean = false) = Kotli classpaths = listOf( "arrow-annotations:$arrowVersion", "arrow-core:$arrowVersion", - "arrow-optics:$arrowVersion" + "arrow-optics:$arrowVersion", ).map { classpathOf(it) } symbolProcessorProviders = listOf(OpticsProcessorProvider()) sources = listOf(SourceFile.kotlin(SOURCE_FILENAME, text.trimMargin())) diff --git a/arrow-libs/optics/arrow-optics-ksp-plugin/src/test/kotlin/arrow/optics/plugin/Utils.kt b/arrow-libs/optics/arrow-optics-ksp-plugin/src/test/kotlin/arrow/optics/plugin/Utils.kt index 49222a8b154..819a78a3555 100644 --- a/arrow-libs/optics/arrow-optics-ksp-plugin/src/test/kotlin/arrow/optics/plugin/Utils.kt +++ b/arrow-libs/optics/arrow-optics-ksp-plugin/src/test/kotlin/arrow/optics/plugin/Utils.kt @@ -65,4 +65,3 @@ const val dslValues = | Four to "four" | ) |)""" - diff --git a/arrow-libs/optics/arrow-optics-reflect/build.gradle.kts b/arrow-libs/optics/arrow-optics-reflect/build.gradle.kts index 49a5814e59f..e2d869cd62b 100644 --- a/arrow-libs/optics/arrow-optics-reflect/build.gradle.kts +++ b/arrow-libs/optics/arrow-optics-reflect/build.gradle.kts @@ -6,6 +6,13 @@ plugins { alias(libs.plugins.arrowGradleConfig.publish) alias(libs.plugins.arrowGradleConfig.versioning) alias(libs.plugins.kotlinx.kover) + alias(libs.plugins.spotless) +} + +spotless { + kotlin { + ktlint().editorConfigOverride(mapOf("ktlint_standard_filename" to "disabled")) + } } apply(from = property("ANIMALSNIFFER_MPP")) diff --git a/arrow-libs/optics/arrow-optics-reflect/src/main/kotlin/arrow/optics/Reflection.kt b/arrow-libs/optics/arrow-optics-reflect/src/main/kotlin/arrow/optics/Reflection.kt index 4e34bc43880..8c8d5c21ce3 100644 --- a/arrow-libs/optics/arrow-optics-reflect/src/main/kotlin/arrow/optics/Reflection.kt +++ b/arrow-libs/optics/arrow-optics-reflect/src/main/kotlin/arrow/optics/Reflection.kt @@ -3,21 +3,23 @@ package arrow.optics import arrow.core.Either import arrow.core.left import arrow.core.right -import kotlin.reflect.* +import kotlin.reflect.KClass +import kotlin.reflect.KProperty1 import kotlin.reflect.full.instanceParameter import kotlin.reflect.full.memberFunctions +import kotlin.reflect.safeCast /** Focuses on those elements of the specified [klass] */ -public fun instance(klass: KClass): Prism = - object: Prism { +public fun instance(klass: KClass): Prism = + object : Prism { override fun getOrModify(source: S): Either = klass.safeCast(source)?.right() ?: source.left() override fun reverseGet(focus: A): S = focus } /** Focuses on those elements of the specified class */ -public inline fun instance(): Prism = - object: Prism { +public inline fun instance(): Prism = + object : Prism { override fun getOrModify(source: S): Either = (source as? A)?.right() ?: source.left() override fun reverseGet(focus: A): S = focus @@ -36,7 +38,7 @@ public val ((S) -> A).ogetter: Getter public val KProperty1.lens: Lens get() = PLens( get = this, - set = { s, a -> clone(this, s, a) } + set = { s, a -> clone(this, s, a) }, ) /** [Optional] that focuses on a nullable field */ diff --git a/arrow-libs/optics/arrow-optics-reflect/src/test/kotlin/arrow/optics/ReflectionTest.kt b/arrow-libs/optics/arrow-optics-reflect/src/test/kotlin/arrow/optics/ReflectionTest.kt index 6d383afa845..bb6533c76a6 100644 --- a/arrow-libs/optics/arrow-optics-reflect/src/test/kotlin/arrow/optics/ReflectionTest.kt +++ b/arrow-libs/optics/arrow-optics-reflect/src/test/kotlin/arrow/optics/ReflectionTest.kt @@ -11,47 +11,46 @@ import io.kotest.property.checkAll data class Person(val name: String, val friends: List) sealed interface Cutlery -object Fork: Cutlery -object Spoon: Cutlery +object Fork : Cutlery +object Spoon : Cutlery -object ReflectionTest: StringSpec({ +object ReflectionTest : StringSpec({ - "optional for function" { - checkAll(Arb.list(Arb.int())) { ints -> - val firsty = { it: List -> it.firstOrNull() } - firsty.ogetter.get(ints) shouldBe ints.firstOrNull() - } + "optional for function" { + checkAll(Arb.list(Arb.int())) { ints -> + val firsty = { it: List -> it.firstOrNull() } + firsty.ogetter.get(ints) shouldBe ints.firstOrNull() } + } - "lenses for field, get" { - checkAll(Arb.string(), Arb.list(Arb.string())) { nm, fs -> - val p = Person(nm, fs.toMutableList()) - Person::name.lens.get(p) shouldBe nm - } + "lenses for field, get" { + checkAll(Arb.string(), Arb.list(Arb.string())) { nm, fs -> + val p = Person(nm, fs.toMutableList()) + Person::name.lens.get(p) shouldBe nm } + } - "lenses for field, set" { - checkAll(Arb.string(), Arb.list(Arb.string())) { nm, fs -> - val p = Person(nm, fs.toMutableList()) - val m = Person::name.lens.modify(p) { it.capitalize() } - m shouldBe Person(nm.capitalize(), fs) - } + "lenses for field, set" { + checkAll(Arb.string(), Arb.list(Arb.string())) { nm, fs -> + val p = Person(nm, fs.toMutableList()) + val m = Person::name.lens.modify(p) { it.capitalize() } + m shouldBe Person(nm.capitalize(), fs) } + } - "traversal for list, set" { - checkAll(Arb.string(), Arb.list(Arb.string())) { nm, fs -> - val p = Person(nm, fs) - val m = Person::friends.every.modify(p) { it.capitalize() } - m shouldBe Person(nm, fs.map { it.capitalize() }) - } + "traversal for list, set" { + checkAll(Arb.string(), Arb.list(Arb.string())) { nm, fs -> + val p = Person(nm, fs) + val m = Person::friends.every.modify(p) { it.capitalize() } + m shouldBe Person(nm, fs.map { it.capitalize() }) } - - "instances" { - val things = listOf(Fork, Spoon, Fork) - val forks = Every.list() compose instance() - val spoons = Every.list() compose instance() - forks.size(things) shouldBe 2 - spoons.size(things) shouldBe 1 - } - + } + + "instances" { + val things = listOf(Fork, Spoon, Fork) + val forks = Every.list() compose instance() + val spoons = Every.list() compose instance() + forks.size(things) shouldBe 2 + spoons.size(things) shouldBe 1 + } }) diff --git a/arrow-libs/optics/arrow-optics/build.gradle.kts b/arrow-libs/optics/arrow-optics/build.gradle.kts index 38c9a2df19e..4ce516cb736 100644 --- a/arrow-libs/optics/arrow-optics/build.gradle.kts +++ b/arrow-libs/optics/arrow-optics/build.gradle.kts @@ -7,6 +7,13 @@ plugins { alias(libs.plugins.arrowGradleConfig.versioning) alias(libs.plugins.kotlinx.kover) alias(libs.plugins.kotest.multiplatform) + alias(libs.plugins.spotless) +} + +spotless { + kotlin { + ktlint().editorConfigOverride(mapOf("ktlint_standard_filename" to "disabled")) + } } apply(from = property("ANIMALSNIFFER_MPP")) diff --git a/arrow-libs/resilience/arrow-resilience/build.gradle.kts b/arrow-libs/resilience/arrow-resilience/build.gradle.kts index 3c47894e711..0fcfb2456d8 100644 --- a/arrow-libs/resilience/arrow-resilience/build.gradle.kts +++ b/arrow-libs/resilience/arrow-resilience/build.gradle.kts @@ -6,6 +6,13 @@ plugins { alias(libs.plugins.arrowGradleConfig.publish) alias(libs.plugins.arrowGradleConfig.versioning) alias(libs.plugins.kotlinx.kover) + alias(libs.plugins.spotless) +} + +spotless { + kotlin { + ktlint().editorConfigOverride(mapOf("ktlint_standard_filename" to "disabled")) + } } val enableCompatibilityMetadataVariant = diff --git a/build.gradle.kts b/build.gradle.kts index 49e45184c3c..cd6589fad18 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -35,6 +35,7 @@ plugins { alias(libs.plugins.kotlin.multiplatform) apply false alias(libs.plugins.kotlin.binaryCompatibilityValidator) alias(libs.plugins.arrowGradleConfig.nexus) + alias(libs.plugins.spotless) apply false } apply(plugin = libs.plugins.kotlinx.knit.get().pluginId) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 31a434a011f..d0ff5574de8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -20,6 +20,7 @@ kotlinxSerialization = "1.5.1" mockWebServer = "4.11.0" retrofit = "2.9.0" retrofitKotlinxSerialization = "1.0.0" +spotlessVersion = "6.19.0" [libraries] arrow-kotlinMetadata = { module = "io.arrow-kt:kotlin-metadata", version.ref = "kotlin" } @@ -67,3 +68,4 @@ kotlinx-knit = { id = "org.jetbrains.kotlinx.knit", version.ref = "knit" } kotlinx-kover = { id = "org.jetbrains.kotlinx.kover", version.ref = "kover" } kotlinx-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } ksp = { id = "com.google.devtools.ksp", version.ref = "kspVersion" } +spotless = { id = "com.diffplug.spotless", version.ref = "spotlessVersion" }