From 0e938faefcb83696ddbf21fc62b950d8bd56c7fd Mon Sep 17 00:00:00 2001 From: Vladimir Klyushnikov <72238+vladimirkl@users.noreply.github.com> Date: Sun, 17 Feb 2019 17:32:01 +0300 Subject: [PATCH 1/2] fix GenApplyLensSyntax.value collision --- example/src/test/scala/monocle/LensExample.scala | 10 ++++++++++ .../monocle/macros/syntax/GenApplyLensSyntax.scala | 11 +++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/example/src/test/scala/monocle/LensExample.scala b/example/src/test/scala/monocle/LensExample.scala index 6cab5ef9d..390ec1d4e 100644 --- a/example/src/test/scala/monocle/LensExample.scala +++ b/example/src/test/scala/monocle/LensExample.scala @@ -69,6 +69,16 @@ class LensMonoExample extends MonocleSuite { test("@Lenses is for case classes only") { illTyped( """@Lenses class C""", "Invalid annotation target: must be a case class") } + + test("GenApplyLensOps has no collision with .value") { + case class MyString(s: String) + object MyString { + implicit class Ops(self: MyString) { + val value: String = self.s + } + } + MyString("a").value shouldEqual "a" + } } class LensPolyExample extends MonocleSuite { diff --git a/macro/shared/src/main/scala/monocle/macros/syntax/GenApplyLensSyntax.scala b/macro/shared/src/main/scala/monocle/macros/syntax/GenApplyLensSyntax.scala index 1248d5205..a8d4b0443 100644 --- a/macro/shared/src/main/scala/monocle/macros/syntax/GenApplyLensSyntax.scala +++ b/macro/shared/src/main/scala/monocle/macros/syntax/GenApplyLensSyntax.scala @@ -6,16 +6,23 @@ trait GenApplyLensSyntax { implicit def toGenApplyLensOps[S](value: S): GenApplyLensOps[S] = new GenApplyLensOps(value) } -class GenApplyLensOps[A](val value: A) extends AnyVal { +class GenApplyLensOps[A](private val value: A) extends AnyVal { def lens[C]( field: A => C ): ApplyLens[A,A,C,C] = macro GenApplyLensOpsImpl.lens_impl[A, C] } class GenApplyLensOpsImpl(val c: blackbox.Context){ def lens_impl[A: c.WeakTypeTag, C](field: c.Expr[A => C]): c.Expr[ApplyLens[A,A,C,C]] = { import c.universe._ + + val subj = c.prefix.tree match { + case Apply(TypeApply(_, _), List(x)) => x + case t => + c.abort(c.enclosingPosition, s"Invalid prefix tree ${show(t)}") + } + c.Expr[ApplyLens[A,A,C,C]](q""" _root_.monocle.syntax.ApplyLens( - ${c.prefix.tree}.value, + $subj, _root_.monocle.macros.GenLens[${c.weakTypeOf[A]}](${field}) ) """) From f9b5c8cdea13d64b8a8d0a306fa9a3206818af32 Mon Sep 17 00:00:00 2001 From: Vladimir Klyushnikov <72238+vladimirkl@users.noreply.github.com> Date: Tue, 19 Feb 2019 16:58:57 +0300 Subject: [PATCH 2/2] make all syntax classes to extend AnyVal with private value --- core/shared/src/main/scala/monocle/Prism.scala | 2 +- .../src/main/scala/monocle/internal/IsEq.scala | 2 +- .../src/main/scala/monocle/syntax/Apply.scala | 16 ++++++++-------- .../scala/monocle/state/ReaderGetterSyntax.scala | 2 +- .../scala/monocle/state/StateGetterSyntax.scala | 2 +- .../scala/monocle/state/StateLensSyntax.scala | 2 +- .../monocle/state/StateOptionalSyntax.scala | 2 +- .../scala/monocle/state/StateSetterSyntax.scala | 2 +- .../monocle/state/StateTraversalSyntax.scala | 2 +- 9 files changed, 16 insertions(+), 16 deletions(-) diff --git a/core/shared/src/main/scala/monocle/Prism.scala b/core/shared/src/main/scala/monocle/Prism.scala index e6f38119d..63b17a497 100644 --- a/core/shared/src/main/scala/monocle/Prism.scala +++ b/core/shared/src/main/scala/monocle/Prism.scala @@ -317,7 +317,7 @@ sealed abstract class PrismInstances { } } -final case class PrismSyntax[S, A](self: Prism[S, A]) extends AnyVal { +final case class PrismSyntax[S, A](private val self: Prism[S, A]) extends AnyVal { /** lift a [[Prism]] such as it only matches if all elements of `F[S]` are getOrModify */ def below[F[_]](implicit F: Traverse[F]): Prism[F[S], F[A]] = diff --git a/core/shared/src/main/scala/monocle/internal/IsEq.scala b/core/shared/src/main/scala/monocle/internal/IsEq.scala index 91e53d38d..9b37c0ca2 100644 --- a/core/shared/src/main/scala/monocle/internal/IsEq.scala +++ b/core/shared/src/main/scala/monocle/internal/IsEq.scala @@ -9,7 +9,7 @@ final case class IsEq[A](lhs: A, rhs: A) object IsEq { implicit def syntax[A](lhs: A): IsEqOps[A] = new IsEqOps(lhs) - final class IsEqOps[A](val lhs: A) extends AnyVal { + final class IsEqOps[A](private val lhs: A) extends AnyVal { def <==>(rhs: A): IsEq[A] = IsEq(lhs, rhs) } } diff --git a/core/shared/src/main/scala/monocle/syntax/Apply.scala b/core/shared/src/main/scala/monocle/syntax/Apply.scala index 724f30512..9a853dd68 100644 --- a/core/shared/src/main/scala/monocle/syntax/Apply.scala +++ b/core/shared/src/main/scala/monocle/syntax/Apply.scala @@ -17,43 +17,43 @@ trait ApplySyntax { implicit def toApplyTraversalOps[S](value: S): ApplyTraversalOps[S] = new ApplyTraversalOps(value) } -final case class ApplyFoldOps[S](s: S) { +final case class ApplyFoldOps[S](private val s: S) extends AnyVal { def applyFold[A](fold: Fold[S, A]): ApplyFold[S, A] = new ApplyFold[S, A](s, fold) } -final case class ApplyGetterOps[S](s: S) { +final case class ApplyGetterOps[S](private val s: S) extends AnyVal{ def applyGetter[A](getter: Getter[S, A]): ApplyGetter[S, A] = new ApplyGetter[S, A](s, getter) } -final case class ApplyIsoOps[S](s: S) { +final case class ApplyIsoOps[S](private val s: S) extends AnyVal { @inline def applyIso[T, A, B](iso: PIso[S, T, A, B]): ApplyIso[S, T, A, B] = ApplyIso[S, T, A, B](s, iso) /** alias to applyIso */ @inline def &<->[T, A, B](iso: PIso[S, T, A, B]): ApplyIso[S, T, A, B] = applyIso(iso) } -final case class ApplyLensOps[S](s: S) { +final case class ApplyLensOps[S](private val s: S) extends AnyVal { def applyLens[T, A, B](lens: PLens[S, T, A, B]): ApplyLens[S, T, A, B] = ApplyLens[S, T, A, B](s, lens) /** alias to applyLens */ def &|->[T, A, B](lens: PLens[S, T, A, B]): ApplyLens[S, T, A, B] = applyLens(lens) } -final case class ApplyOptionalOps[S](s: S) { +final case class ApplyOptionalOps[S](private val s: S) extends AnyVal { def applyOptional[T, A, B](optional: POptional[S, T, A, B]): ApplyOptional[S, T, A, B] = ApplyOptional[S, T, A, B](s, optional) /** alias to applyOptional */ def &|-?[T, A, B](optional: POptional[S, T, A, B]): ApplyOptional[S, T, A, B] = applyOptional(optional) } -final case class ApplyPrismOps[S](s: S) { +final case class ApplyPrismOps[S](private val s: S) extends AnyVal { def applyPrism[T, A, B](prism: PPrism[S, T, A, B]): ApplyPrism[S, T, A, B] = ApplyPrism[S, T, A, B](s, prism) /** alias to applyPrism */ def &<-?[T, A, B](prism: PPrism[S, T, A, B]): ApplyPrism[S, T, A, B] = applyPrism(prism) } -final case class ApplySetterOps[S](s: S) { +final case class ApplySetterOps[S](private val s: S) extends AnyVal { def applySetter[T, A, B](setter: PSetter[S, T, A, B]): ApplySetter[S, T, A, B] = new ApplySetter[S, T, A, B](s, setter) } -final case class ApplyTraversalOps[S](s: S) { +final case class ApplyTraversalOps[S](private val s: S) extends AnyVal { def applyTraversal[T, A, B](traversal: PTraversal[S, T, A, B]): ApplyTraversal[S, T, A, B] = ApplyTraversal[S, T, A, B](s, traversal) /** alias to applyTraversal */ def &|->>[T, A, B](traversal: PTraversal[S, T, A, B]): ApplyTraversal[S, T, A, B] = applyTraversal(traversal) diff --git a/state/shared/src/main/scala/monocle/state/ReaderGetterSyntax.scala b/state/shared/src/main/scala/monocle/state/ReaderGetterSyntax.scala index 7efe6d1c4..421772eee 100644 --- a/state/shared/src/main/scala/monocle/state/ReaderGetterSyntax.scala +++ b/state/shared/src/main/scala/monocle/state/ReaderGetterSyntax.scala @@ -9,7 +9,7 @@ trait ReaderGetterSyntax { new ReaderGetterOps[S, A](getter) } -final class ReaderGetterOps[S, A](getter: Getter[S, A]) { +final class ReaderGetterOps[S, A](private val getter: Getter[S, A]) extends AnyVal { /** transforms a Getter into a Reader */ def toReader: Reader[S, A] = Reader(getter.get) diff --git a/state/shared/src/main/scala/monocle/state/StateGetterSyntax.scala b/state/shared/src/main/scala/monocle/state/StateGetterSyntax.scala index 75579f0fc..2eefd36c1 100644 --- a/state/shared/src/main/scala/monocle/state/StateGetterSyntax.scala +++ b/state/shared/src/main/scala/monocle/state/StateGetterSyntax.scala @@ -9,7 +9,7 @@ trait StateGetterSyntax { new StateGetterOps[S, A](getter) } -final class StateGetterOps[S, A](getter: Getter[S, A]) { +final class StateGetterOps[S, A](private val getter: Getter[S, A]) extends AnyVal { /** transforms a Getter into a State */ def toState: State[S, A] = State(s => (s, getter.get(s))) diff --git a/state/shared/src/main/scala/monocle/state/StateLensSyntax.scala b/state/shared/src/main/scala/monocle/state/StateLensSyntax.scala index a274b3297..1d617d7ae 100644 --- a/state/shared/src/main/scala/monocle/state/StateLensSyntax.scala +++ b/state/shared/src/main/scala/monocle/state/StateLensSyntax.scala @@ -9,7 +9,7 @@ trait StateLensSyntax { new StateLensOps[S, T, A, B](lens) } -final class StateLensOps[S, T, A, B](lens: PLens[S, T, A, B]) { +final class StateLensOps[S, T, A, B](private val lens: PLens[S, T, A, B]) extends AnyVal { /** transforms a PLens into a State */ def toState: State[S, A] = State(s => (s, lens.get(s))) diff --git a/state/shared/src/main/scala/monocle/state/StateOptionalSyntax.scala b/state/shared/src/main/scala/monocle/state/StateOptionalSyntax.scala index 85e2012b6..d32f5997e 100644 --- a/state/shared/src/main/scala/monocle/state/StateOptionalSyntax.scala +++ b/state/shared/src/main/scala/monocle/state/StateOptionalSyntax.scala @@ -9,7 +9,7 @@ trait StateOptionalSyntax { new StateOptionalOps[S, T, A, B](optional) } -final class StateOptionalOps[S, T, A, B](optional: POptional[S, T, A, B]) { +final class StateOptionalOps[S, T, A, B](private val optional: POptional[S, T, A, B]) extends AnyVal { /** transforms a POptional into a State */ def toState: State[S, Option[A]] = State(s => (s, optional.getOption(s))) diff --git a/state/shared/src/main/scala/monocle/state/StateSetterSyntax.scala b/state/shared/src/main/scala/monocle/state/StateSetterSyntax.scala index 53078b566..14a085f01 100644 --- a/state/shared/src/main/scala/monocle/state/StateSetterSyntax.scala +++ b/state/shared/src/main/scala/monocle/state/StateSetterSyntax.scala @@ -9,7 +9,7 @@ trait StateSetterSyntax { new StateSetterOps[S, T, A, B](setter) } -final class StateSetterOps[S, T, A, B](setter: PSetter[S, T, A, B]) { +final class StateSetterOps[S, T, A, B](private val setter: PSetter[S, T, A, B]) extends AnyVal { /** modify the value referenced through the setter */ def mod_(f: A => B): IndexedState[S, T, Unit] = IndexedState(s => (setter.modify(f)(s), ())) diff --git a/state/shared/src/main/scala/monocle/state/StateTraversalSyntax.scala b/state/shared/src/main/scala/monocle/state/StateTraversalSyntax.scala index a79926bd1..eefb0636a 100644 --- a/state/shared/src/main/scala/monocle/state/StateTraversalSyntax.scala +++ b/state/shared/src/main/scala/monocle/state/StateTraversalSyntax.scala @@ -9,7 +9,7 @@ trait StateTraversalSyntax { new StateTraversalOps[S, T, A, B](traversal) } -final class StateTraversalOps[S, T, A, B](traversal: PTraversal[S, T, A, B]) { +final class StateTraversalOps[S, T, A, B](private val traversal: PTraversal[S, T, A, B]) extends AnyVal { /** transforms a PTraversal into a State */ def toState: State[S, List[A]] = State(s => (s, traversal.getAll(s)))