Skip to content

Commit 7635485

Browse files
author
Roman Janusz
authored
Merge pull request #429 from AVSystem/poly-mongo-implicit-conflict
Fix implicit resolution conflict when MongoPolyDataCompanion is used with custom implicits
2 parents 464b56a + f1d82b2 commit 7635485

File tree

2 files changed

+39
-7
lines changed

2 files changed

+39
-7
lines changed

commons-mongo/jvm/src/main/scala-2.13/com/avsystem/commons/mongo/typed/MongoPolyDataCompanion.scala

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,26 @@ import com.avsystem.commons.serialization.{GenCodec, GenObjectCodec}
99
import scala.annotation.compileTimeOnly
1010

1111
trait MongoPolyAdtInstances[D[_]] {
12-
// needed by MongoAdtFormat.materialize for generic type
13-
protected final implicit def codecFromFormat[T: MongoFormat]: GenCodec[T] = MongoFormat[T].codec
14-
1512
def codec[T: GenCodec]: GenObjectCodec[D[T]]
16-
def format[T: MongoFormat]: MongoAdtFormat[D[T]]
13+
14+
/**
15+
* We need to accept an implicit `GenCodec[T]` because materialization of
16+
* [[MongoAdtFormat]] requires a [[GenObjectCodec]] ([[MongoAdtFormat.codec]]). In practice, it can be derived
17+
* from the `MongoFormat[T]` that is already accepted by this method but we have to be careful about priority of
18+
* implicits. Because of that, this implicit is actually provided by [[AbstractMongoPolyDataCompanion.format]].
19+
*/
20+
def format[T: MongoFormat : GenCodec]: MongoAdtFormat[D[T]]
1721
}
1822

1923
abstract class AbstractMongoPolyDataCompanion[Implicits, D[_]](implicits: Implicits)(
20-
implicit instances: MacroInstances[Implicits, MongoPolyAdtInstances[D]]
24+
implicit instances: MacroInstances[Implicits, MongoPolyAdtInstances[D]],
2125
) {
2226
implicit def codec[T: GenCodec]: GenObjectCodec[D[T]] = instances(implicits, this).codec[T]
23-
implicit def format[T: MongoFormat]: MongoAdtFormat[D[T]] = instances(implicits, this).format[T]
27+
28+
implicit def format[T: MongoFormat]: MongoAdtFormat[D[T]] = {
29+
implicit def tCodec: GenCodec[T] = MongoFormat[T].codec
30+
instances(implicits, this).format[T]
31+
}
2432

2533
implicit def isMongoAdtOrSubtype[C <: D[_]]: IsMongoAdtOrSubtype[C] = null
2634

@@ -49,5 +57,5 @@ abstract class AbstractMongoPolyDataCompanion[Implicits, D[_]](implicits: Implic
4957
* }}}
5058
*/
5159
abstract class MongoPolyDataCompanion[D[_]](
52-
implicit instances: MacroInstances[BsonGenCodecs.type, MongoPolyAdtInstances[D]]
60+
implicit instances: MacroInstances[BsonGenCodecs.type, MongoPolyAdtInstances[D]],
5361
) extends AbstractMongoPolyDataCompanion[BsonGenCodecs.type, D](BsonGenCodecs)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.avsystem.commons
2+
package mongo.typed
3+
4+
import com.avsystem.commons.meta.MacroInstances
5+
import com.avsystem.commons.serialization.GenCodec
6+
7+
case class CustomWrappy(value: String)
8+
9+
object CustomImplicits {
10+
implicit val customWrappyCodec: GenCodec[CustomWrappy] =
11+
GenCodec.transformed[CustomWrappy, String](_.value, CustomWrappy)
12+
}
13+
14+
abstract class CustomPolyDataCompanion[D[_]](
15+
implicit instances: MacroInstances[CustomImplicits.type, MongoPolyAdtInstances[D]],
16+
) extends AbstractMongoPolyDataCompanion[CustomImplicits.type, D](CustomImplicits)
17+
18+
/**
19+
* This class tests (through its compilation) if implicit resolution conflicts that were
20+
* previously present in [[MongoPolyAdtInstances]] are fixed
21+
* ([[https://github.com/AVSystem/scala-commons/pull/429 #429]]).
22+
*/
23+
case class PolyDataWithCustomImplicits[+T](wrappy: CustomWrappy, value: List[T])
24+
object PolyDataWithCustomImplicits extends CustomPolyDataCompanion[PolyDataWithCustomImplicits]

0 commit comments

Comments
 (0)