Skip to content

Commit

Permalink
Fix derivation for scala3 enums
Browse files Browse the repository at this point in the history
Enums should be converted into StringValueNode without object start and object end,
but when discriminator is used, it should be converted into object with discriminator
  • Loading branch information
Aleksandr Petukhov committed Jul 13, 2023
1 parent 61b245a commit 2905f7b
Showing 1 changed file with 10 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@ package tethys.derivation.impl.derivation
import scala.annotation.tailrec
import scala.compiletime.*
import scala.quoted.*

import tethys.commons.LowPriorityInstance
import tethys.commons.TokenNode.FieldNameNode
import tethys.derivation.builder.WriterDerivationConfig
import tethys.derivation.impl.builder.{WriterBuilderCommons, WriterBuilderUtils}
import tethys.derivation.impl.FieldStyle
import tethys.writers.tokens.TokenWriter
import tethys.writers.tokens.{SimpleTokenWriter, TokenWriter}
import tethys.{JsonObjectWriter, JsonWriter}

trait WriterDerivation extends WriterBuilderCommons {
Expand Down Expand Up @@ -436,16 +436,16 @@ trait WriterDerivation extends WriterBuilderCommons {
.getWrite3Method
.appliedTo(Expr(discriminator).asTerm, termChildNameTerm, tokenWriterTerm)
}
val writeObjectStartTerm = tokenWriterTerm.selectFirstMethod("writeObjectStart").appliedToNone
val writeObjectEndTerm = tokenWriterTerm.selectFirstMethod("writeObjectEnd").appliedToNone
val terms: List[Term] =
if (termChildWriter.underlying.symbol.flags.is(Flags.Macro))
List(
termChildWriter.selectWriteValuesMethod.appliedTo(termChildRef, tokenWriterTerm),
discriminatorTerm
)
else {
val writeObjectStartTerm = tokenWriterTerm.selectFirstMethod("writeObjectStart").appliedToNone
if (termChildSym.flags.is(Flags.Enum)) {
if (discriminator.isEmpty)
List(termChildWriter.selectWriteValuesMethod.appliedTo(termChildRef, tokenWriterTerm))
else
List(writeObjectStartTerm, discriminatorTerm, writeObjectEndTerm)
} else {
val writeValuesTerm = termChildWriter.selectWriteValuesMethod.appliedTo(termChildRef, tokenWriterTerm)
val writeObjectEndTerm = tokenWriterTerm.selectFirstMethod("writeObjectEnd").appliedToNone
List(writeObjectStartTerm, writeValuesTerm, discriminatorTerm, writeObjectEndTerm)
}
val rhs = Block(terms, '{ () }.asTerm)
Expand Down

0 comments on commit 2905f7b

Please sign in to comment.