From df2491a0c97f3557259e08039b8ab50eed320462 Mon Sep 17 00:00:00 2001 From: Aleksander Rainko Date: Sat, 18 Nov 2023 21:06:04 +0100 Subject: [PATCH] privatize stuff inside the internal package --- .../arainko/ducktape/AppliedBuilder.scala | 2 +- .../arainko/ducktape/AppliedViaBuilder.scala | 5 +-- .../arainko/ducktape/DefinitionBuilder.scala | 3 +- .../ducktape/DefinitionViaBuilder.scala | 5 ++- .../github/arainko/ducktape/Playground.scala | 35 +++++++------------ .../github/arainko/ducktape/Transformer.scala | 18 +++------- .../ducktape/internal/Configuration.scala | 2 +- .../arainko/ducktape/internal/Defaults.scala | 6 ++-- .../arainko/ducktape/internal/Depth.scala | 4 +-- .../ducktape/internal/ErrorMessage.scala | 11 +++--- .../arainko/ducktape/internal/Function.scala | 8 +++-- .../arainko/ducktape/internal/Logger.scala | 5 ++- .../ducktape/internal/NonEmptyList.scala | 4 +-- .../arainko/ducktape/internal/Path.scala | 8 ++--- .../ducktape/internal/PathSelector.scala | 2 +- .../arainko/ducktape/internal/Plan.scala | 6 ++-- .../ducktape/internal/PlanInterpreter.scala | 4 +-- .../arainko/ducktape/internal/Planner.scala | 2 +- .../ducktape/internal/PositionTest.scala | 22 ------------ .../arainko/ducktape/internal/Span.scala | 4 +-- .../arainko/ducktape/internal/Structure.scala | 4 +-- .../arainko/ducktape/internal/Target.scala | 18 +++++----- .../ducktape/internal/Transformations.scala | 8 ++--- .../io/github/arainko/ducktape/syntax.scala | 6 ++-- .../arainko/ducktape/DucktapeSuite.scala | 3 +- .../ducktape/total/AppliedBuilderSuite.scala | 2 +- .../total/AppliedViaBuilderSuite.scala | 5 +-- .../total/DefinitionViaBuilderSuite.scala | 5 +-- .../total/DerivedTransformerSuite.scala | 4 ++- .../ducktape/total/ErrorReportingSuite.scala | 1 + .../arainko/ducktape/total/LoggerSuite.scala | 7 ++-- .../total/NestedConfigurationSuite.scala | 2 +- 32 files changed, 93 insertions(+), 128 deletions(-) delete mode 100644 ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/PositionTest.scala diff --git a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/AppliedBuilder.scala b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/AppliedBuilder.scala index f947998b..acd74629 100644 --- a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/AppliedBuilder.scala +++ b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/AppliedBuilder.scala @@ -3,6 +3,6 @@ package io.github.arainko.ducktape import io.github.arainko.ducktape.internal.Transformations final class AppliedBuilder[Source, Dest](value: Source) { - inline def transform(inline config: Field[Source, Dest] | Case[Source, Dest]*): Dest = + inline def transform(inline config: Field[Source, Dest] | Case[Source, Dest]*): Dest = Transformations.between[Source, Dest](value, config*) } diff --git a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/AppliedViaBuilder.scala b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/AppliedViaBuilder.scala index 6b5d8455..820fb406 100644 --- a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/AppliedViaBuilder.scala +++ b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/AppliedViaBuilder.scala @@ -3,7 +3,7 @@ package io.github.arainko.ducktape import io.github.arainko.ducktape.internal.Transformations final class AppliedViaBuilder[Source, Dest, Func, Args <: FunctionArguments] private (value: Source, function: Func) { - inline def transform(inline config: Field[Source, Args] | Case[Source, Args]*): Dest = + inline def transform(inline config: Field[Source, Args] | Case[Source, Args]*): Dest = Transformations.via[Source, Dest, Func, Args](value, function, config*) } @@ -13,6 +13,7 @@ object AppliedViaBuilder { transparent inline def create[A, Func](source: A, inline function: Func): Any = { val inst = instance(source, function) - internal.Function.encodeAsType[[args <: FunctionArguments, retTpe] =>> AppliedViaBuilder[A, retTpe, Func, args]](function, inst) + internal.Function + .encodeAsType[[args <: FunctionArguments, retTpe] =>> AppliedViaBuilder[A, retTpe, Func, args]](function, inst) } } diff --git a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/DefinitionBuilder.scala b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/DefinitionBuilder.scala index ac41648e..a3cbc9ed 100644 --- a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/DefinitionBuilder.scala +++ b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/DefinitionBuilder.scala @@ -3,5 +3,6 @@ package io.github.arainko.ducktape import io.github.arainko.ducktape.internal.Transformations class DefinitionBuilder[Source, Dest] { - inline def build(inline config: Field[Source, Dest] | Case[Source, Dest]*): Transformer[Source, Dest] = source => Transformations.between[Source, Dest](source, config*) + inline def build(inline config: Field[Source, Dest] | Case[Source, Dest]*): Transformer[Source, Dest] = source => + Transformations.between[Source, Dest](source, config*) } diff --git a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/DefinitionViaBuilder.scala b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/DefinitionViaBuilder.scala index 3d4a1f21..4cff2467 100644 --- a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/DefinitionViaBuilder.scala +++ b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/DefinitionViaBuilder.scala @@ -21,7 +21,10 @@ object DefinitionViaBuilder { extension [Source](partial: PartiallyApplied[Source]) { transparent inline def apply[Func](inline function: Func): Any = { val builder = instance[Source, Func](function) - internal.Function.encodeAsType[[args <: FunctionArguments, retTpe] =>> DefinitionViaBuilder[Source, retTpe, Func, args]](function, builder) + internal.Function.encodeAsType[[args <: FunctionArguments, retTpe] =>> DefinitionViaBuilder[Source, retTpe, Func, args]]( + function, + builder + ) } } } diff --git a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/Playground.scala b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/Playground.scala index 84c47761..0380abf3 100644 --- a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/Playground.scala +++ b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/Playground.scala @@ -1,9 +1,8 @@ package io.github.arainko.ducktape +import scala.collection.SortedMap import scala.deriving.Mirror import scala.reflect.TypeTest -import scala.collection.SortedMap -import io.github.arainko.ducktape.internal.Transformations final case class Value(int: Int) extends AnyVal final case class ValueGen[A](int: A) extends AnyVal @@ -76,10 +75,9 @@ final case class NotRec[A](value: A = "string") println(cos.unapply(test)) - val rec: Rec[Int] = Rec(1, None) - // // given Transformer[NotRec[Int], NotRec[Int | String]] = + // // given Transformer[NotRec[Int], NotRec[Int | String]] = // internal.CodePrinter.code: // Transformer.defineVia[NotRec[Int]](NotRec[Int | String]).build(Field.const(_.value, "")) @@ -92,21 +90,19 @@ final case class NotRec[A](value: A = "string") // internal.CodePrinter.code: // given Transformer[Rec[Int], Rec[Int | String]] = DefinitionBuilder[Rec[Int], Rec[Int | String]].build() - - def test1[A, B](a: A)(using t: Transformer[A, B]): B = + def test1[A, B](a: A)(using t: Transformer[A, B]): B = internal.CodePrinter.code: a.to[B] - - // rec.to[Rec[Int | String]] + // rec.to[Rec[Int | String]] // // internal.CodePrinter.code: - // (??? : DeffTest1).into[DeffTest2].transform( + // (??? : DeffTest1).into[DeffTest2].transform( - // Field.default(a => a._1), - // Field.default(a => a.int), - // // Field.default(a => a.int.toByte) - // ) + // Field.default(a => a._1), + // Field.default(a => a.int), + // // Field.default(a => a.int.toByte) + // ) // PositionTest.positions( // "asdasdasdas", @@ -127,34 +123,29 @@ final case class NotRec[A](value: A = "string") */ // DebugMacros.code { // PlanInterpreter.transformBetween[ProdTest1, ProdTest2]( - // Field2.const(_.test.at[Test2.Cos].int.additional, 1), // missing field - // Field.computed(_.test.at[Test2.Cos].int.additional, _.test.ordinal + 123), + // Field2.const(_.test.at[Test2.Cos].int.additional, 1), // missing field + // Field.computed(_.test.at[Test2.Cos].int.additional, _.test.ordinal + 123), ProdTest1(Test1.Cos(Nested1(1))) .into[ProdTest2] .transform( Field.const(_.test.at[Test2.Cos].int.int, 123), // overridden fieldn, Case.const(_.test.at[Test1.Empty.type], ???), - Field.const(_.test.at[Test2.Cos].int.additional, 1), + Field.const(_.test.at[Test2.Cos].int.additional, 1) // Field.default(_.test), // Field.default(_.test), // Field.default(_.test), // Field.default(_.test), - // Field.default(_.test), - // Field.default(_.test.ordinal), // Field2.const(_.add, 1), // missing field // Case.const(_.test.at[Test1.Empty.type], Test2.Cos(Nested2(1, 1))) // missing case // Case2.const(_.test.at[Test1.Cos], Test2.Cos(Nested2(1, 1))) // overriden case - - ) - - + ) // } diff --git a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/Transformer.scala b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/Transformer.scala index 0aa570a4..075e2485 100644 --- a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/Transformer.scala +++ b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/Transformer.scala @@ -1,32 +1,22 @@ package io.github.arainko.ducktape -import scala.quoted.* -import io.github.arainko.ducktape.internal.Transformations import io.github.arainko.ducktape.DefinitionViaBuilder.PartiallyApplied +import io.github.arainko.ducktape.internal.Transformations trait Transformer[Source, Dest] extends Transformer.Derived[Source, Dest] object Transformer { inline given derive[Source, Dest]: Transformer.Derived[Source, Dest] = new { def transform(value: Source): Dest = Transformations.between[Source, Dest](value) - } + } - def define[Source, Dest]: DefinitionBuilder[Source, Dest] = + def define[Source, Dest]: DefinitionBuilder[Source, Dest] = DefinitionBuilder[Source, Dest] - def defineVia[Source]: DefinitionViaBuilder.PartiallyApplied[Source] = + def defineVia[Source]: DefinitionViaBuilder.PartiallyApplied[Source] = DefinitionViaBuilder.create[Source] sealed trait Derived[Source, Dest] { def transform(value: Source): Dest } } - -object Test extends App { - // given t: Transformer[Int, Int] = ??? - - internal.CodePrinter.code: - summon[Transformer.Derived[Int, Int]] - - // Transformer.derive[Int, Int].transform(1) -} diff --git a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Configuration.scala b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Configuration.scala index c8124f19..b386163e 100644 --- a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Configuration.scala +++ b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Configuration.scala @@ -207,7 +207,7 @@ private[ducktape] object Configuration { Span.fromExpr(cfg) ) :: Nil - case cfg @ '{ Field.allMatching[a, b, source]($fieldSource) } => + case cfg @ '{ Field.allMatching[a, b, source]($fieldSource) } => parseAllMatching(fieldSource, Path.empty(Type.of[b]), TypeRepr.of[b], TypeRepr.of[source], Span.fromExpr(cfg)) } } diff --git a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Defaults.scala b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Defaults.scala index c24e7484..3a915a7f 100644 --- a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Defaults.scala +++ b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Defaults.scala @@ -3,7 +3,7 @@ package io.github.arainko.ducktape.internal import scala.quoted.* import scala.util.chaining.* -object Defaults { +private[ducktape] object Defaults { def of(struct: Structure.Product)(using Quotes): Map[String, Expr[Any]] = { import quotes.reflect.* @@ -11,10 +11,10 @@ object Defaults { val tpe = struct.tpe.repr.widen val sym = tpe.typeSymbol - val fieldNamesWithDefaults = + val fieldNamesWithDefaults = Logger.loggedDebug("Fields that have a default"): sym.caseFields.filter(_.flags.is(Flags.HasDefault)).map(_.name) - + val companionBody = sym.companionClass.tree.asInstanceOf[ClassDef].body // sus but it works? val companion = Ref(sym.companionModule) val defaultValues = companionBody.collect { diff --git a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Depth.scala b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Depth.scala index 8e8c9419..6351e6e0 100644 --- a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Depth.scala +++ b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Depth.scala @@ -1,8 +1,8 @@ package io.github.arainko.ducktape.internal -opaque type Depth <: Int = Int +private[ducktape] opaque type Depth <: Int = Int -object Depth { +private[ducktape] object Depth { val zero: Depth = 0 def current(using depth: Depth): Depth = depth def incremented(using depth: Depth): Depth = depth + 1 diff --git a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/ErrorMessage.scala b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/ErrorMessage.scala index 438a202b..e4534425 100644 --- a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/ErrorMessage.scala +++ b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/ErrorMessage.scala @@ -1,16 +1,16 @@ package io.github.arainko.ducktape.internal -import scala.quoted.Quotes -import scala.quoted.Type import io.github.arainko.ducktape.internal.Path.Segment -sealed trait ErrorMessage derives Debug { +import scala.quoted.{ Quotes, Type } + +private[ducktape] sealed trait ErrorMessage derives Debug { def render(using Quotes): String def span: Span | None.type def target: Target } -object ErrorMessage { +private[ducktape] object ErrorMessage { final case class NoFieldFound(fieldName: String, fieldTpe: Type[?], sourceTpe: Type[?]) extends ErrorMessage { def render(using Quotes): String = s"No field '$fieldName' found in ${sourceTpe.repr.show}" def span = None @@ -76,7 +76,8 @@ object ErrorMessage { } case object RecursionSuspected extends ErrorMessage { - def render(using Quotes): String = "Recursive type suspected, consider using Transformer.define or Transformer.defineVia instead" + def render(using Quotes): String = + "Recursive type suspected, consider using Transformer.define or Transformer.defineVia instead" val span: Span | None.type = None val target: Target = Target.Dest } diff --git a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Function.scala b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Function.scala index 535d82de..b1dab159 100644 --- a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Function.scala +++ b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Function.scala @@ -5,7 +5,7 @@ import io.github.arainko.ducktape.* import scala.collection.immutable.ListMap import scala.quoted.* -final case class Function(args: ListMap[String, Type[?]], returnTpe: Type[?], expr: Expr[Any]) derives Debug { +private[ducktape] final case class Function(args: ListMap[String, Type[?]], returnTpe: Type[?], expr: Expr[Any]) derives Debug { def appliedTo(using Quotes)(terms: List[quotes.reflect.Term]): Expr[Any] = { import quotes.reflect.* @@ -28,7 +28,7 @@ final case class Function(args: ListMap[String, Type[?]], returnTpe: Type[?], ex } -object Function { +private[ducktape] object Function { private type IsFuncArgs[A <: FunctionArguments] = A def fromExpr(expr: Expr[Any])(using Quotes): Option[Function] = { @@ -44,7 +44,9 @@ object Function { } } - def fromFunctionArguments[Args <: FunctionArguments: Type, Func: Type](functionExpr: Expr[Func])(using Quotes): Option[Function] = { + def fromFunctionArguments[Args <: FunctionArguments: Type, Func: Type]( + functionExpr: Expr[Func] + )(using Quotes): Option[Function] = { import quotes.reflect.* val repr = TypeRepr.of[Args] val func = TypeRepr.of[Func] diff --git a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Logger.scala b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Logger.scala index 45279e10..019bedb6 100644 --- a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Logger.scala +++ b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Logger.scala @@ -1,17 +1,16 @@ package io.github.arainko.ducktape.internal -import io.github.arainko.ducktape.internal.{ Metainformation } +import io.github.arainko.ducktape.internal.Metainformation import scala.Ordering.Implicits.* import scala.quoted.* -import scala.annotation.nowarn private[ducktape] object Logger { // Logger Config private[ducktape] transparent inline given level: Level = Level.Off private val output = Output.StdOut - @nowarn private def filter(msg: String, meta: Metainformation) = meta.contains("DeprecatedConfig") + private def filter(msg: String, meta: Metainformation) = true enum Level { case Off, Debug, Info diff --git a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/NonEmptyList.scala b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/NonEmptyList.scala index 40da8078..756ea44d 100644 --- a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/NonEmptyList.scala +++ b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/NonEmptyList.scala @@ -16,7 +16,7 @@ private[ducktape] object NonEmptyList { private[ducktape] def fromList[A](list: List[A]): Option[NonEmptyList[A]] = PartialFunction.condOpt(list) { case cons @ (_ :: _) => fromCons(cons) } - private [ducktape] given [A: Debug]: Debug[NonEmptyList[A]] = Debug.collection[A, List] + private[ducktape] given [A: Debug]: Debug[NonEmptyList[A]] = Debug.collection[A, List] extension [A](self: NonEmptyList[A]) { export toList.{ reduceLeft, head, tail, exists, filter, collect } @@ -29,7 +29,7 @@ private[ducktape] object NonEmptyList { private[ducktape] def map[B](f: A => B): NonEmptyList[B] = unsafeCoerce(toList.map(f)) - private [ducktape] def groupBy[K](f: A => K): Map[K, NonEmptyList[A]] = unsafeCoerceK(self.groupBy(f)) + private[ducktape] def groupBy[K](f: A => K): Map[K, NonEmptyList[A]] = unsafeCoerceK(self.groupBy(f)) private[ducktape] def reverse: NonEmptyList[A] = unsafeCoerce(toList.reverse) } diff --git a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Path.scala b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Path.scala index 33c5d27f..579cc47e 100644 --- a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Path.scala +++ b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Path.scala @@ -5,7 +5,7 @@ import io.github.arainko.ducktape.internal.* import scala.quoted.* import scala.reflect.TypeTest -final case class Path(root: Type[?], segments: Vector[Path.Segment]) { self => +private[ducktape] final case class Path(root: Type[?], segments: Vector[Path.Segment]) { self => def appended(segment: Path.Segment): Path = self.copy(segments = segments.appended(segment)) def prepended(segment: Path.Segment): Path = self.copy(segments = segments.prepended(segment)) @@ -26,7 +26,7 @@ final case class Path(root: Type[?], segments: Vector[Path.Segment]) { self => def isAncestorOrSiblingOf(that: Path)(using Quotes): Boolean = { /* import quotes.reflect.* - + if (self.segments.length > that.segments.length) false else self.root.repr =:= that.root.repr && self.segments.zip(that.segments).forall { @@ -36,7 +36,7 @@ final case class Path(root: Type[?], segments: Vector[Path.Segment]) { self => leftName == rightName && leftTpe.repr =:= rightTpe.repr case _ => false } - */ + */ val thatRendered = that.render val thisRendered = this.render Logger.debug("that rendered", thatRendered) @@ -58,7 +58,7 @@ final case class Path(root: Type[?], segments: Vector[Path.Segment]) { self => } } -object Path { +private[ducktape] object Path { def empty(root: Type[?]): Path = Path(root, Vector.empty) given debug: Debug[Path] with { diff --git a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/PathSelector.scala b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/PathSelector.scala index 5bcd953d..a6af4ee4 100644 --- a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/PathSelector.scala +++ b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/PathSelector.scala @@ -3,7 +3,7 @@ package io.github.arainko.ducktape.internal import scala.annotation.tailrec import scala.quoted.* -object PathSelector { +private[ducktape] object PathSelector { def unapply(using Quotes)(expr: quotes.reflect.Term): Some[Path] = { import quotes.reflect.{ Selector as _, * } diff --git a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Plan.scala b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Plan.scala index 4a322b7d..de34f0c8 100644 --- a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Plan.scala +++ b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Plan.scala @@ -7,9 +7,9 @@ import scala.annotation.tailrec import scala.collection.immutable.ListMap import scala.quoted.* -type PlanError = Plan.Error +private[ducktape] type PlanError = Plan.Error -enum Plan[+E <: PlanError] { +private[ducktape] enum Plan[+E <: PlanError] { import Plan.* def sourceTpe: Type[?] @@ -139,7 +139,7 @@ enum Plan[+E <: PlanError] { ) extends Plan[Plan.Error] } -object Plan { +private[ducktape] object Plan { def unapply[E <: Plan.Error](plan: Plan[E]): (Type[?], Type[?]) = (plan.sourceTpe, plan.destTpe) diff --git a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/PlanInterpreter.scala b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/PlanInterpreter.scala index e8abffd4..e0c281e4 100644 --- a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/PlanInterpreter.scala +++ b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/PlanInterpreter.scala @@ -6,7 +6,7 @@ import io.github.arainko.ducktape.internal.* import scala.collection.Factory import scala.quoted.* -object PlanInterpreter { +private[ducktape] object PlanInterpreter { def run[A: Type](plan: Plan[Nothing], sourceValue: Expr[A])(using Quotes): Expr[Any] = recurse(plan, sourceValue) @@ -78,7 +78,7 @@ object PlanInterpreter { case ('[destCollTpe], '[srcElem], '[destElem]) => val sourceValue = value.asExprOf[Iterable[srcElem]] // TODO: Make it nicer, move this into Planner since we cannot be sure that a facotry exists - val factory = Expr.summon[Factory[destElem, destCollTpe]].get + val factory = Expr.summon[Factory[destElem, destCollTpe]].get def transformation(value: Expr[srcElem])(using Quotes): Expr[destElem] = recurse(plan, value).asExprOf[destElem] '{ $sourceValue.map(src => ${ transformation('src) }).to($factory) } } diff --git a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Planner.scala b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Planner.scala index be7d8933..9c1e8d9a 100644 --- a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Planner.scala +++ b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Planner.scala @@ -5,7 +5,7 @@ import io.github.arainko.ducktape.internal.* import scala.quoted.* -object Planner { +private[ducktape] object Planner { import Structure.* def between(source: Structure, dest: Structure)(using Quotes) = { diff --git a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/PositionTest.scala b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/PositionTest.scala deleted file mode 100644 index f9b1d94e..00000000 --- a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/PositionTest.scala +++ /dev/null @@ -1,22 +0,0 @@ -package io.github.arainko.ducktape.internal - -import scala.quoted.* - -object PositionTest { - inline def positions(inline args: Any*) = ${ positionsMacro('args) } - - def positionsMacro(expr: Expr[Seq[Any]])(using Quotes) = { - import quotes.reflect.* - - Position.ofMacroExpansion - - val Varargs(exprs) = expr: @unchecked - - val minPos = exprs.map(_.asTerm.pos).minBy(_.start) - val calculatedPos = - Position(SourceFile.current, Position.ofMacroExpansion.start, minPos.start - 1) - report.error("ANOTHER MESSAGE", calculatedPos) - exprs.zipWithIndex.foreach((expr, idx) => report.error(s"expr $idx", expr)) - '{} - } -} diff --git a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Span.scala b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Span.scala index baac23e1..af0b495d 100644 --- a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Span.scala +++ b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Span.scala @@ -2,14 +2,14 @@ package io.github.arainko.ducktape.internal import scala.quoted.* -final case class Span(start: Int, end: Int) derives Debug { +private[ducktape] final case class Span(start: Int, end: Int) derives Debug { def toPosition(using Quotes): quotes.reflect.Position = { import quotes.reflect.* Position(SourceFile.current, start, end) } } -object Span { +private[ducktape] object Span { def fromExpr(expr: Expr[Any])(using Quotes): Span = { import quotes.reflect.* fromPosition(expr.asTerm.pos) diff --git a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Structure.scala b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Structure.scala index 77cee317..d6fe23ce 100644 --- a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Structure.scala +++ b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Structure.scala @@ -9,7 +9,7 @@ import scala.deriving.Mirror import scala.quoted.* import scala.reflect.TypeTest -sealed trait Structure derives Debug { +private[ducktape] sealed trait Structure derives Debug { def tpe: Type[?] final def force: Structure = @@ -21,7 +21,7 @@ sealed trait Structure derives Debug { final def narrow[A <: Structure](using tt: TypeTest[Structure, A]): Option[A] = tt.unapply(this.force) } -object Structure { +private[ducktape] object Structure { case class Product(tpe: Type[?], fields: Map[String, Structure]) extends Structure case class Coproduct(tpe: Type[?], children: Map[String, Structure]) extends Structure diff --git a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Target.scala b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Target.scala index 5fc6bdb9..e9b63b44 100644 --- a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Target.scala +++ b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Target.scala @@ -1,13 +1,13 @@ package io.github.arainko.ducktape.internal -enum Target derives Debug { - case Source, Dest +private[ducktape] enum Target derives Debug { + case Source, Dest - final def isSource: Boolean = - this match { - case Source => true - case Dest => false - } + final def isSource: Boolean = + this match { + case Source => true + case Dest => false + } - final def isDest: Boolean = !isSource - } + final def isDest: Boolean = !isSource +} diff --git a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Transformations.scala b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Transformations.scala index 5691c990..db087a6b 100644 --- a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Transformations.scala +++ b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/internal/Transformations.scala @@ -1,11 +1,12 @@ package io.github.arainko.ducktape.internal import io.github.arainko.ducktape.* +import io.github.arainko.ducktape.internal.Function.fromFunctionArguments + import scala.quoted.* import scala.quoted.runtime.StopMacroExpansion -import io.github.arainko.ducktape.internal.Function.fromFunctionArguments -object Transformations { +private[ducktape] object Transformations { inline def between[A, B]( value: A, inline configs: Field[A, B] | Case[A, B]* @@ -38,9 +39,6 @@ object Transformations { configs: Expr[Seq[Field[A, Args] | Case[A, Args]]] )(using Quotes) = { val plan = - // Function - // .fromFunctionArguments[Args, Func](function) - // .orElse( Function .fromExpr(function) .map(function => Planner.between(Structure.of[A], Structure.fromFunction(function))) diff --git a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/syntax.scala b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/syntax.scala index 142704cd..49d1ea4d 100644 --- a/ducktapeNext/src/main/scala/io/github/arainko/ducktape/syntax.scala +++ b/ducktapeNext/src/main/scala/io/github/arainko/ducktape/syntax.scala @@ -2,14 +2,14 @@ package io.github.arainko.ducktape import io.github.arainko.ducktape.internal.Transformations -extension [Source] (source: Source) { +extension [Source](source: Source) { inline def to[Dest]: Dest = Transformations.between[Source, Dest](source) def into[Dest]: AppliedBuilder[Source, Dest] = AppliedBuilder[Source, Dest](source) - transparent inline def via[Func](inline function: Func): Any = + transparent inline def via[Func](inline function: Func): Any = Transformations.viaInferred[Source, Func, Nothing](source, function) - transparent inline def intoVia[Func](inline function: Func): Any = + transparent inline def intoVia[Func](inline function: Func): Any = AppliedViaBuilder.create(source, function) } diff --git a/ducktapeNext/src/test/scala/io/github/arainko/ducktape/DucktapeSuite.scala b/ducktapeNext/src/test/scala/io/github/arainko/ducktape/DucktapeSuite.scala index 79a55775..58364157 100644 --- a/ducktapeNext/src/test/scala/io/github/arainko/ducktape/DucktapeSuite.scala +++ b/ducktapeNext/src/test/scala/io/github/arainko/ducktape/DucktapeSuite.scala @@ -1,7 +1,6 @@ package io.github.arainko.ducktape -import munit.{ FunSuite, Location } -import munit.Compare +import munit.{ Compare, FunSuite, Location } trait DucktapeSuite extends FunSuite { def assertEachEquals[Source, Dest](head: Source, tail: Source*)(expected: Dest)(using Location, Compare[Source, Dest]) = { diff --git a/ducktapeNext/src/test/scala/io/github/arainko/ducktape/total/AppliedBuilderSuite.scala b/ducktapeNext/src/test/scala/io/github/arainko/ducktape/total/AppliedBuilderSuite.scala index 0f0a1ece..83c7063b 100644 --- a/ducktapeNext/src/test/scala/io/github/arainko/ducktape/total/AppliedBuilderSuite.scala +++ b/ducktapeNext/src/test/scala/io/github/arainko/ducktape/total/AppliedBuilderSuite.scala @@ -160,7 +160,7 @@ class AppliedBuilderSuite extends DucktapeSuite { val expected = TestClassWithAdditionalString(1, "str", "str-computed") - @nowarn("msg=Field 'additionalArg' is configured multiple times") + // @nowarn("msg=Field 'additionalArg' is configured multiple times") val actual = testClass .into[TestClassWithAdditionalString] diff --git a/ducktapeNext/src/test/scala/io/github/arainko/ducktape/total/AppliedViaBuilderSuite.scala b/ducktapeNext/src/test/scala/io/github/arainko/ducktape/total/AppliedViaBuilderSuite.scala index ddbaf152..86f175ac 100644 --- a/ducktapeNext/src/test/scala/io/github/arainko/ducktape/total/AppliedViaBuilderSuite.scala +++ b/ducktapeNext/src/test/scala/io/github/arainko/ducktape/total/AppliedViaBuilderSuite.scala @@ -20,7 +20,6 @@ class AppliedViaBuilderSuite extends DucktapeSuite { assertEquals(actual, expected) } - test("Arg.computed properly applies a function to an argument") { def method(str: String, int: Int, additionalArg: List[String]) = TestClassWithAdditionalList(int, str, additionalArg) @@ -74,7 +73,9 @@ class AppliedViaBuilderSuite extends DucktapeSuite { .intoVia(method) .transform() """ - }("No field 'additionalArg' found in io.github.arainko.ducktape.total.AppliedViaBuilderSuite.TestClass @ TestClassWithAdditionalString.additionalArg") + }( + "No field 'additionalArg' found in io.github.arainko.ducktape.total.AppliedViaBuilderSuite.TestClass @ TestClassWithAdditionalString.additionalArg" + ) } } diff --git a/ducktapeNext/src/test/scala/io/github/arainko/ducktape/total/DefinitionViaBuilderSuite.scala b/ducktapeNext/src/test/scala/io/github/arainko/ducktape/total/DefinitionViaBuilderSuite.scala index 75048430..44edd34a 100644 --- a/ducktapeNext/src/test/scala/io/github/arainko/ducktape/total/DefinitionViaBuilderSuite.scala +++ b/ducktapeNext/src/test/scala/io/github/arainko/ducktape/total/DefinitionViaBuilderSuite.scala @@ -30,7 +30,6 @@ class DefinitionViaBuilderSuite extends DucktapeSuite { Transformer .defineVia[TestClass](method) .build(Arg.computed(_.additionalArg, testClass => List(testClass.str))) - assertEquals(transformer.transform(testClass), expected) } @@ -93,7 +92,9 @@ class DefinitionViaBuilderSuite extends DucktapeSuite { .defineVia[TestClass](method) .build() """ - }("No field 'additionalArg' found in io.github.arainko.ducktape.total.DefinitionViaBuilderSuite.TestClass @ TestClassWithAdditionalString.additionalArg") + }( + "No field 'additionalArg' found in io.github.arainko.ducktape.total.DefinitionViaBuilderSuite.TestClass @ TestClassWithAdditionalString.additionalArg" + ) } } diff --git a/ducktapeNext/src/test/scala/io/github/arainko/ducktape/total/DerivedTransformerSuite.scala b/ducktapeNext/src/test/scala/io/github/arainko/ducktape/total/DerivedTransformerSuite.scala index 9b9f7029..cb273742 100644 --- a/ducktapeNext/src/test/scala/io/github/arainko/ducktape/total/DerivedTransformerSuite.scala +++ b/ducktapeNext/src/test/scala/io/github/arainko/ducktape/total/DerivedTransformerSuite.scala @@ -372,6 +372,8 @@ class DerivedTransformerSuite extends DucktapeSuite { } test("derivation fails when going from a sum with more cases to a sum with less cases") { - assertFailsToCompileWith("MoreCases.Case3.to[LessCases]")("No child named 'Case4' found in io.github.arainko.ducktape.total.DerivedTransformerSuite.LessCases @ MoreCases.at[io.github.arainko.ducktape.total.DerivedTransformerSuite.MoreCases.Case4]") + assertFailsToCompileWith("MoreCases.Case3.to[LessCases]")( + "No child named 'Case4' found in io.github.arainko.ducktape.total.DerivedTransformerSuite.LessCases @ MoreCases.at[io.github.arainko.ducktape.total.DerivedTransformerSuite.MoreCases.Case4]" + ) } } diff --git a/ducktapeNext/src/test/scala/io/github/arainko/ducktape/total/ErrorReportingSuite.scala b/ducktapeNext/src/test/scala/io/github/arainko/ducktape/total/ErrorReportingSuite.scala index 38c223b1..f8342e5a 100644 --- a/ducktapeNext/src/test/scala/io/github/arainko/ducktape/total/ErrorReportingSuite.scala +++ b/ducktapeNext/src/test/scala/io/github/arainko/ducktape/total/ErrorReportingSuite.scala @@ -1,6 +1,7 @@ package io.github.arainko.ducktape.total import io.github.arainko.ducktape.* + import scala.annotation.nowarn class ErrorReportingSuite extends DucktapeSuite { diff --git a/ducktapeNext/src/test/scala/io/github/arainko/ducktape/total/LoggerSuite.scala b/ducktapeNext/src/test/scala/io/github/arainko/ducktape/total/LoggerSuite.scala index 24d89e13..e4ef075d 100644 --- a/ducktapeNext/src/test/scala/io/github/arainko/ducktape/total/LoggerSuite.scala +++ b/ducktapeNext/src/test/scala/io/github/arainko/ducktape/total/LoggerSuite.scala @@ -1,11 +1,8 @@ package io.github.arainko.ducktape -import io.github.arainko.ducktape.DucktapeSuite -import io.github.arainko.ducktape.internal.* - class LoggerSuite extends DucktapeSuite { test("log level should be Off") { - val result = compiletime.testing.typeChecks("""val level: Logger.Level.Off.type = summon[Logger.Level]""") - assertEquals(result, true, "Logger's log level should be set to Off to turn all log statements into ()") + val level = summon[internal.Logger.Level] + assertEquals(level, internal.Logger.Level.Off, "Logger's log level should be set to Off to turn all log statements into ()") } } diff --git a/ducktapeNext/src/test/scala/io/github/arainko/ducktape/total/NestedConfigurationSuite.scala b/ducktapeNext/src/test/scala/io/github/arainko/ducktape/total/NestedConfigurationSuite.scala index a2bc06d7..0adc98bc 100644 --- a/ducktapeNext/src/test/scala/io/github/arainko/ducktape/total/NestedConfigurationSuite.scala +++ b/ducktapeNext/src/test/scala/io/github/arainko/ducktape/total/NestedConfigurationSuite.scala @@ -1,7 +1,7 @@ package io.github.arainko.ducktape.total -import io.github.arainko.ducktape.DucktapeSuite import io.github.arainko.ducktape.* + import scala.annotation.nowarn class NestedConfigurationSuite extends DucktapeSuite {