Skip to content

Commit

Permalink
Fix prism generation in case of subclasses having keywords as names.
Browse files Browse the repository at this point in the history
  • Loading branch information
lukasz-kusek committed May 26, 2024
1 parent 52c02d4 commit 72d85e7
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,9 @@ private fun processPrismSyntax(ele: ADT, dsl: SealedClassDsl, className: String)
if (ele.typeParameters.isEmpty()) {
dsl.foci.joinToString(separator = "\n\n") { focus ->
"""
|${ele.visibilityModifierName} inline val <__S> $Optional<__S, ${ele.sourceClassName}>.${focus.paramName}: $Optional<__S, ${focus.classNameWithParameters}> inline get() = this + $className.${focus.paramName}
|${ele.visibilityModifierName} inline val <__S> $Prism<__S, ${ele.sourceClassName}>.${focus.paramName}: $Prism<__S, ${focus.classNameWithParameters}> inline get() = this + $className.${focus.paramName}
|${ele.visibilityModifierName} inline val <__S> $Traversal<__S, ${ele.sourceClassName}>.${focus.paramName}: $Traversal<__S, ${focus.classNameWithParameters}> inline get() = this + $className.${focus.paramName}
|${ele.visibilityModifierName} inline val <__S> $Optional<__S, ${ele.sourceClassName}>.${focus.escapedParamName}: $Optional<__S, ${focus.classNameWithParameters}> inline get() = this + $className.${focus.escapedParamName}
|${ele.visibilityModifierName} inline val <__S> $Prism<__S, ${ele.sourceClassName}>.${focus.escapedParamName}: $Prism<__S, ${focus.classNameWithParameters}> inline get() = this + $className.${focus.escapedParamName}
|${ele.visibilityModifierName} inline val <__S> $Traversal<__S, ${ele.sourceClassName}>.${focus.escapedParamName}: $Traversal<__S, ${focus.classNameWithParameters}> inline get() = this + $className.${focus.escapedParamName}
|
""".trimMargin()
}
Expand All @@ -74,9 +74,9 @@ private fun processPrismSyntax(ele: ADT, dsl: SealedClassDsl, className: String)
else -> focus.refinedArguments.joinToString(separator = ",")
}
"""
|${ele.visibilityModifierName} inline fun <__S,$joinedTypeParams> $Optional<__S, $sourceClassNameWithParams>.${focus.paramName}(): $Optional<__S, ${focus.classNameWithParameters}> = this + $className.${focus.paramName}()
|${ele.visibilityModifierName} inline fun <__S,$joinedTypeParams> $Prism<__S, $sourceClassNameWithParams>.${focus.paramName}(): $Prism<__S, ${focus.classNameWithParameters}> = this + $className.${focus.paramName}()
|${ele.visibilityModifierName} inline fun <__S,$joinedTypeParams> $Traversal<__S, $sourceClassNameWithParams>.${focus.paramName}(): $Traversal<__S, ${focus.classNameWithParameters}> = this + $className.${focus.paramName}()
|${ele.visibilityModifierName} inline fun <__S,$joinedTypeParams> $Optional<__S, $sourceClassNameWithParams>.${focus.escapedParamName}(): $Optional<__S, ${focus.classNameWithParameters}> = this + $className.${focus.escapedParamName}()
|${ele.visibilityModifierName} inline fun <__S,$joinedTypeParams> $Prism<__S, $sourceClassNameWithParams>.${focus.escapedParamName}(): $Prism<__S, ${focus.classNameWithParameters}> = this + $className.${focus.escapedParamName}()
|${ele.visibilityModifierName} inline fun <__S,$joinedTypeParams> $Traversal<__S, $sourceClassNameWithParams>.${focus.escapedParamName}(): $Traversal<__S, ${focus.classNameWithParameters}> = this + $className.${focus.escapedParamName}()
|
""".trimMargin()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ private fun OpticsProcessorOptions.processElement(ele: ADT, foci: List<Focus>):
}
val firstLine = when {
ele.typeParameters.isEmpty() ->
"${ele.visibilityModifierName} $inlineText val ${ele.sourceClassName}.Companion.${focus.paramName}: $Prism<${ele.sourceClassName}, ${focus.classNameWithParameters}> $inlineText get()"
"${ele.visibilityModifierName} $inlineText val ${ele.sourceClassName}.Companion.${focus.escapedParamName}: $Prism<${ele.sourceClassName}, ${focus.classNameWithParameters}> $inlineText get()"
else ->
"${ele.visibilityModifierName} $inlineText fun $angledTypeParameters ${ele.sourceClassName}.Companion.${focus.paramName}(): $Prism<$sourceClassNameWithParams, ${focus.classNameWithParameters}>"
"${ele.visibilityModifierName} $inlineText fun $angledTypeParameters ${ele.sourceClassName}.Companion.${focus.escapedParamName}(): $Prism<$sourceClassNameWithParams, ${focus.classNameWithParameters}>"
}
"$firstLine = $Prism.instanceOf()"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,36 @@ class PrismTests {
""".compilationSucceeds(allWarningsAsErrors = true)
}

@Test
fun `Prism will be generated for sealed class and subclasses having keywords as names`() {
"""
|$`package`
|$imports
|@optics
|sealed class PrismSealed(val field: String, val nullable: String?) {
| data class In(private val a: String?) : PrismSealed("", a)
| data class PrismSealed2(private val b: String?) : PrismSealed("", b)
| companion object
|}
|val i: Prism<PrismSealed, PrismSealed.In> = PrismSealed.`in`
""".compilationSucceeds(allWarningsAsErrors = true)
}

@Test
fun `Prism will be generated for generic sealed class and subclasses having keywords as names`() {
"""
|$`package`
|$imports
|@optics
|sealed class PrismSealed<A,B>(val field: A, val nullable: B?) {
| data class In(private val a: String?) : PrismSealed<String, String>("", a)
| data class PrismSealed2<C>(private val b: C?) : PrismSealed<String, C>("", b)
| companion object
|}
|val i: Prism<PrismSealed<String, String>, PrismSealed.In> = PrismSealed.`in`()
""".compilationSucceeds(allWarningsAsErrors = true)
}

@Test
fun `Prism will be generated without warning for sealed class with only one subclass`() {
"""
Expand Down

0 comments on commit 72d85e7

Please sign in to comment.