Skip to main content

extras-type-info - Scala 3

types

import extras.typeinfo.syntax.types.*

nestedTypeName

import extras.typeinfo.syntax.types.*

sealed trait Foo
object Foo {
case object Bar extends Foo
final case class Baz(n: Int) extends Foo

def bar: Foo = Bar
def baz(n: Int): Foo = Baz(n)
}

Foo.Bar.nestedTypeName
// res1: String = "Foo.Bar"
Foo.Baz(1).nestedTypeName
// res2: String = "Foo.Baz"

Foo.bar.nestedTypeName
// res3: String = "Foo.Bar"
Foo.baz(1).nestedTypeName
// res4: String = "Foo.Baz"
import extras.typeinfo.syntax.types.*

enum Foo {
case Bar
case Baz(n: Int)
}

Foo.Bar.nestedTypeName
// res6: String = "Foo.Bar"
Foo.Baz(1).nestedTypeName
// res7: String = "Foo.Baz"
import extras.typeinfo.syntax.types.*

object data {
final case class Person(firstName: Person.FirstName, lastName: Person.LastName)

object Person {
type FirstName = FirstName.FirstName

object FirstName {
opaque
type FirstName = String

def apply(firstName: String): FirstName = firstName

given firstNameCanEqual: CanEqual[FirstName, FirstName]
= CanEqual.derived

extension(firstName: FirstName) {
def value: String = firstName
}
}

type LastName = LastName.LastName

object LastName {
opaque
type LastName = String

def apply(lastName: String): LastName = lastName

given lastNameCanEqual: CanEqual[LastName, LastName]
= CanEqual.derived

extension(lastName: LastName) {
def value: String = lastName
}
}

}
}

import data.*

val firstName = Person.FirstName("Kevin")
// firstName: FirstName = "Kevin"
val lastName = Person.LastName("Lee")
// lastName: LastName = "Lee"

firstName.nestedTypeName
// res9: String = "Person.FirstName"
lastName.nestedTypeName
// res10: String = "Person.LastName"
Person(firstName, lastName).nestedTypeName
// res11: String = "data.Person"