Skip to content

Commit

Permalink
Fix lenses generation for data classes with secondary constructors (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
andrzejressel authored and pakoito committed Jan 14, 2019
1 parent 795f8ae commit 2604a46
Show file tree
Hide file tree
Showing 10 changed files with 83 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package arrow.ap.objects.iso

import arrow.optics.OpticsTarget
import arrow.optics.optics

@optics([OpticsTarget.ISO])
data class IsoSecondaryConstructor(val fieldNumber: Int, val fieldString: String) {
constructor(number: Int): this(number, number.toString())
companion object
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package arrow.ap.objects.lens

import arrow.optics.OpticsTarget
import arrow.optics.optics

@optics([OpticsTarget.LENS])
data class LensSecondaryConstructor(val field: String) {
constructor(number: Int): this(number.toString())
companion object
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package arrow.ap.objects.optional

import arrow.optics.OpticsTarget
import arrow.optics.optics

@optics([OpticsTarget.OPTIONAL])
data class OptionalSecondaryConstructor(val field: String?) {
constructor(number: Int?): this(number?.toString())
companion object
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import me.eugeniomarletti.kotlin.metadata.kotlinMetadata
import me.eugeniomarletti.kotlin.metadata.modality
import me.eugeniomarletti.kotlin.metadata.proto
import me.eugeniomarletti.kotlin.metadata.shadow.metadata.ProtoBuf
import me.eugeniomarletti.kotlin.metadata.shadow.metadata.deserialization.Flags
import me.eugeniomarletti.kotlin.metadata.shadow.metadata.deserialization.TypeTable
import me.eugeniomarletti.kotlin.metadata.shadow.metadata.deserialization.supertypes
import me.eugeniomarletti.kotlin.metadata.shadow.serialization.deserialization.getName
Expand All @@ -28,7 +29,7 @@ interface ProcessorUtils : KotlinMetadataUtils {
.let { it as KotlinClassMetadata }.data
.let { (nameResolver, classProto) ->
classProto.constructorOrBuilderList
.first()
.first { it.isPrimary }
.valueParameterList
.map(ProtoBuf.ValueParameter::getName)
.map(nameResolver::getString)
Expand All @@ -43,7 +44,7 @@ interface ProcessorUtils : KotlinMetadataUtils {
.let { it as KotlinClassMetadata }.data
.let { data ->
data.proto.constructorOrBuilderList
.first()
.first { it.isPrimary }
.valueParameterList
.map { it.type.extractFullName(data) }
}
Expand Down Expand Up @@ -98,6 +99,9 @@ interface ProcessorUtils : KotlinMetadataUtils {

}

private val ProtoBuf.ConstructorOrBuilder.isPrimary: Boolean get() = !isSecondary
private val ProtoBuf.ConstructorOrBuilder.isSecondary: Boolean get() = Flags.IS_SECONDARY[flags]

fun String.removeBackticks() = replace("`", "")

fun knownError(message: String, element: Element? = null): Nothing =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,13 @@ class IsoTest : APTest("arrow.ap.objects.iso") {
processor = OpticsProcessor()
))

testProcessor(AnnotationProcessor(
name = "Isos will be generated for data class with secondary constructors",
sourceFiles = listOf("IsoSecondaryConstructor.java"),
destFile = "IsoSecondaryConstructor.kt",
processor = OpticsProcessor()
))

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,13 @@ class LensTest : APTest("arrow.ap.objects.lens") {
processor = OpticsProcessor()
))

testProcessor(AnnotationProcessor(
name = "Lenses will be generated for secondary constructor arguments",
sourceFiles = listOf("LensSecondaryConstructor.java"),
destFile = "LensSecondaryConstructor.kt",
processor = OpticsProcessor()
))

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,13 @@ class OptionalTest : APTest("arrow.ap.objects.optional") {
processor = OpticsProcessor()
))

testProcessor(AnnotationProcessor(
name = "Optionals will be generated for secondary constructor arguments",
sourceFiles = listOf("OptionalSecondaryConstructor.java"),
destFile = "OptionalSecondaryConstructor.kt",
processor = OpticsProcessor()
))

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package `arrow`.`ap`.`objects`.`iso`



inline val `arrow`.`ap`.`objects`.`iso`.`IsoSecondaryConstructor`.Companion.iso: arrow.optics.Iso<`arrow`.`ap`.`objects`.`iso`.`IsoSecondaryConstructor`, arrow.core.Tuple2<`kotlin`.`Int`, `kotlin`.`String`>> inline get()= arrow.optics.Iso(
get = { isoSecondaryConstructor: `arrow`.`ap`.`objects`.`iso`.`IsoSecondaryConstructor` -> arrow.core.Tuple2(isoSecondaryConstructor.`fieldNumber`, isoSecondaryConstructor.`fieldString`) },
reverseGet = { tuple: arrow.core.Tuple2<`kotlin`.`Int`, `kotlin`.`String`> -> `arrow`.`ap`.`objects`.`iso`.`IsoSecondaryConstructor`(tuple.a, tuple.b) }
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package `arrow`.`ap`.`objects`.`lens`



inline val `arrow`.`ap`.`objects`.`lens`.`LensSecondaryConstructor`.Companion.field: arrow.optics.Lens<`arrow`.`ap`.`objects`.`lens`.`LensSecondaryConstructor`, `kotlin`.`String`> inline get()= arrow.optics.Lens(
get = { lensSecondaryConstructor: `arrow`.`ap`.`objects`.`lens`.`LensSecondaryConstructor` -> lensSecondaryConstructor.`field` },
set = { lensSecondaryConstructor: `arrow`.`ap`.`objects`.`lens`.`LensSecondaryConstructor`, value: `kotlin`.`String` -> lensSecondaryConstructor.copy(`field` = value) }
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package `arrow`.`ap`.`objects`.`optional`

import arrow.core.left
import arrow.core.right
import arrow.core.toOption

inline val `arrow`.`ap`.`objects`.`optional`.`OptionalSecondaryConstructor`.Companion.field: arrow.optics.Optional<`arrow`.`ap`.`objects`.`optional`.`OptionalSecondaryConstructor`, `kotlin`.`String`> inline get()= arrow.optics.Optional(
getOrModify = { optionalSecondaryConstructor: `arrow`.`ap`.`objects`.`optional`.`OptionalSecondaryConstructor` -> optionalSecondaryConstructor.`field`?.right() ?: optionalSecondaryConstructor.left() },
set = { optionalSecondaryConstructor: `arrow`.`ap`.`objects`.`optional`.`OptionalSecondaryConstructor`, value: `kotlin`.`String` -> optionalSecondaryConstructor.copy(`field` = value) }
)

0 comments on commit 2604a46

Please sign in to comment.