Skip to content

Commit 952ba32

Browse files
author
Roman Janusz
committed
made MongoPolyDataCompanion a 2.13 only feature
1 parent 76efc34 commit 952ba32

File tree

7 files changed

+96
-68
lines changed

7 files changed

+96
-68
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.avsystem.commons
2+
package mongo.typed
3+
4+
// MongoPolyDataCompanion is a 2.13 only feature
5+
// This serves only to avoid writing macro code cross-compiled for Scala 2.12
6+
private trait AbstractMongoPolyDataCompanion {
7+
trait macroDslExtensions {
8+
def as[C <: D[T]]: C = sys.error("stub")
9+
}
10+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.avsystem.commons
2+
package mongo.typed
3+
4+
import com.avsystem.commons.annotation.explicitGenerics
5+
import com.avsystem.commons.meta.MacroInstances
6+
import com.avsystem.commons.mongo.BsonGenCodecs
7+
import com.avsystem.commons.serialization.{GenCodec, GenObjectCodec}
8+
9+
import scala.annotation.compileTimeOnly
10+
11+
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+
15+
def codec[T: GenCodec]: GenObjectCodec[D[T]]
16+
def format[T: MongoFormat]: MongoAdtFormat[D[T]]
17+
}
18+
19+
abstract class AbstractMongoPolyDataCompanion[Implicits, D[_]](implicits: Implicits)(
20+
implicit instances: MacroInstances[Implicits, MongoPolyAdtInstances[D]]
21+
) {
22+
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]
24+
25+
implicit def isMongoAdtOrSubtype[C <: D[_]]: IsMongoAdtOrSubtype[C] = null
26+
27+
implicit class macroDslExtensions[T](value: D[T]) {
28+
@explicitGenerics
29+
@compileTimeOnly("the .as[Subtype] construct can only be used inside lambda passed to .ref(...) macro")
30+
def as[C <: D[T]]: C = sys.error("stub")
31+
}
32+
33+
@explicitGenerics
34+
def dsl[T: MongoFormat]: DataTypeDsl[D[T]] = new DataTypeDsl[D[T]] {
35+
def SelfRef: MongoRef[D[T], D[T]] = MongoRef.RootRef(format[T])
36+
}
37+
}
38+
39+
/**
40+
* Like [[MongoDataCompanion]] buf for generic types (with exactly one unbounded type parameter).
41+
*
42+
* @example
43+
* {{{
44+
* case class Point[+T](x: T, y: T)
45+
* object Point extends MongoPolyDataCompanion[Point] {
46+
* def XRef[T: MongoFormat]: MongoPropertyRef[Point[T], T] =
47+
* Point[T].ref(_.x)
48+
* }
49+
* }}}
50+
*/
51+
abstract class MongoPolyDataCompanion[D[_]](
52+
implicit instances: MacroInstances[BsonGenCodecs.type, MongoPolyAdtInstances[D]]
53+
) extends AbstractMongoPolyDataCompanion[BsonGenCodecs.type, D](BsonGenCodecs)

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

Lines changed: 1 addition & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ package mongo.typed
44
import com.avsystem.commons.annotation.explicitGenerics
55
import com.avsystem.commons.meta.MacroInstances
66
import com.avsystem.commons.mongo.BsonGenCodecs
7-
import com.avsystem.commons.serialization.{GenCodec, GenObjectCodec}
7+
import com.avsystem.commons.serialization.GenObjectCodec
88

99
import scala.annotation.{compileTimeOnly, implicitNotFound}
1010

@@ -13,14 +13,6 @@ trait MongoAdtInstances[T] {
1313
def format: MongoAdtFormat[T]
1414
}
1515

16-
trait MongoPolyAdtInstances[D[_]] {
17-
// needed by MongoAdtFormat.materialize for generic type
18-
protected final implicit def codecFromFormat[T: MongoFormat]: GenCodec[T] = MongoFormat[T].codec
19-
20-
def codec[T: GenCodec]: GenObjectCodec[D[T]]
21-
def format[T: MongoFormat]: MongoAdtFormat[D[T]]
22-
}
23-
2416
trait MongoEntityInstances[E <: BaseMongoEntity] extends MongoAdtInstances[E] {
2517
def meta: MongoEntityMeta[E]
2618
}
@@ -55,28 +47,6 @@ abstract class AbstractMongoDataCompanion[Implicits, E](implicits: Implicits)(
5547
implicit val format: MongoAdtFormat[E] = instances(implicits, this).format
5648
}
5749

58-
abstract class AbstractMongoPolyDataCompanion[Implicits, D[_]](implicits: Implicits)(
59-
implicit instances: MacroInstances[Implicits, MongoPolyAdtInstances[D]]
60-
) {
61-
implicit def codec[T: GenCodec]: GenObjectCodec[D[T]] = instances(implicits, this).codec[T]
62-
implicit def format[T: MongoFormat]: MongoAdtFormat[D[T]] = instances(implicits, this).format[T]
63-
64-
implicit def isMongoAdtOrSubtype[C <: D[_]]: IsMongoAdtOrSubtype[C] = null
65-
66-
implicit class macroDslExtensions[T](value: D[T]) {
67-
@explicitGenerics
68-
@compileTimeOnly("the .as[Subtype] construct can only be used inside lambda passed to .ref(...) macro")
69-
def as[C <: D[T]]: C = sys.error("stub")
70-
}
71-
72-
def apply[T: MongoFormat]: DataTypeDsl[D[T]] = new DataTypeDsl[D[T]] {
73-
def SelfRef: MongoRef[D[T], D[T]] = MongoRef.RootRef(format[T])
74-
}
75-
76-
// for Scala 2.12 which has some problems with overloaded apply
77-
def refs[T: MongoFormat]: DataTypeDsl[D[T]] = apply[T]
78-
}
79-
8050
abstract class AbstractMongoEntityCompanion[Implicits, E <: BaseMongoEntity](implicits: Implicits)(
8151
implicit instances: MacroInstances[Implicits, MongoEntityInstances[E]]
8252
) extends BaseMongoCompanion[E] {
@@ -109,19 +79,3 @@ abstract class MongoDataCompanion[E](
10979
abstract class MongoEntityCompanion[E <: BaseMongoEntity](
11080
implicit instances: MacroInstances[BsonGenCodecs.type, MongoEntityInstances[E]]
11181
) extends AbstractMongoEntityCompanion[BsonGenCodecs.type, E](BsonGenCodecs)
112-
113-
/**
114-
* Like [[MongoDataCompanion]] buf for generic types (with exactly one unbounded type parameter).
115-
*
116-
* @example
117-
* {{{
118-
* case class Point[+T](x: T, y: T)
119-
* object Point extends MongoPolyDataCompanion[Point] {
120-
* def XRef[T: MongoFormat]: MongoPropertyRef[Point[T], T] =
121-
* Point[T].ref(_.x)
122-
* }
123-
* }}}
124-
*/
125-
abstract class MongoPolyDataCompanion[D[_]](
126-
implicit instances: MacroInstances[BsonGenCodecs.type, MongoPolyAdtInstances[D]]
127-
) extends AbstractMongoPolyDataCompanion[BsonGenCodecs.type, D](BsonGenCodecs)
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.avsystem.commons
2+
package mongo.typed
3+
4+
import com.avsystem.commons.serialization.flatten
5+
import org.scalatest.funsuite.AnyFunSuite
6+
7+
@flatten sealed trait PolyMongoUnion[+T]
8+
object PolyMongoUnion extends MongoPolyDataCompanion[PolyMongoUnion] {
9+
case class CaseOne[+T](value: T, str: String) extends PolyMongoUnion[T]
10+
case class CaseTwo[+T](foo: T, int: Int) extends PolyMongoUnion[T]
11+
case object CaseThree extends PolyMongoUnion[Nothing]
12+
}
13+
14+
case class PolyMongoRecord[+T](value: T, meta: String)
15+
object PolyMongoRecord extends MongoPolyDataCompanion[PolyMongoRecord]
16+
17+
class MongoPolyDataTest extends AnyFunSuite {
18+
final val Pmr = PolyMongoRecord
19+
final val Pmu = PolyMongoUnion
20+
21+
test("filterPath") {
22+
assert(Pmr.dsl[Int].ref(_.value).rawPath == "value")
23+
assert(Pmu.dsl[Int].ref(_.as[PolyMongoUnion.CaseOne[Int]].value).rawPath == "value")
24+
assert(Pmu.dsl[Int].as[PolyMongoUnion.CaseOne[Int]].ref(_.value).rawPath == "value")
25+
assert(Pmu.dsl[Int].ref(_.as[PolyMongoUnion.CaseOne[Int]].str).rawPath == "str")
26+
assert(Pmu.dsl[PolyMongoUnion[Int]].ref(x =>
27+
x.as[PolyMongoUnion.CaseOne[PolyMongoUnion[Int]]].value
28+
.as[PolyMongoUnion.CaseOne[Int]].str
29+
).rawPath == "value.str")
30+
}
31+
}

commons-mongo/jvm/src/test/scala/com/avsystem/commons/mongo/typed/MongoRefTest.scala

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ class MongoRefTest extends AnyFunSuite {
77
final val Rte = RecordTestEntity
88
final val Ute = UnionTestEntity
99
final val Ir = InnerRecord
10-
final val Pmr = PolyMongoRecord
11-
final val Pmu = PolyMongoUnion
1210

1311
test("filterPath") {
1412
assert(Rte.IdRef.rawPath == "_id")
@@ -32,19 +30,11 @@ class MongoRefTest extends AnyFunSuite {
3230
assert(Rte.ref(_.union.as[CaseOne].data).rawPath == "union.data")
3331
assert(Rte.ref(_.union.as[HasInner].inner).rawPath == "union.inner")
3432
assert(Rte.ref(_.union).as[HasInner].ref(_.inner).rawPath == "union.inner")
35-
assert(Pmr.refs[Int].ref(_.value).rawPath == "value")
3633
assert(Ute.ref(_.as[HasInner].inner).rawPath == "inner")
3734
assert(Ute.as[HasInner].ref(_.inner).rawPath == "inner")
3835
assert(Ute.ref(_.as[HasInner].inner.union.as[HasInner].inner).rawPath == "inner.union.inner")
3936
assert((Ute.ref(_.as[HasInner].inner) andThen Rte.ref(_.union.as[HasInner].inner)).rawPath == "inner.union.inner")
4037
assert((Rte.ref(_.union.as[HasInner].inner) compose Ute.ref(_.as[HasInner].inner)).rawPath == "inner.union.inner")
41-
assert(Pmu[Int].ref(_.as[PolyMongoUnion.CaseOne[Int]].value).rawPath == "value")
42-
assert(Pmu[Int].as[PolyMongoUnion.CaseOne[Int]].ref(_.value).rawPath == "value")
43-
assert(Pmu[Int].ref(_.as[PolyMongoUnion.CaseOne[Int]].str).rawPath == "str")
44-
assert(Pmu[PolyMongoUnion[Int]].ref(x =>
45-
x.as[PolyMongoUnion.CaseOne[PolyMongoUnion[Int]]].value
46-
.as[PolyMongoUnion.CaseOne[Int]].str
47-
).rawPath == "value.str")
4838
}
4939

5040
test("projectionPath") {

commons-mongo/jvm/src/test/scala/com/avsystem/commons/mongo/typed/testEntities.scala

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -70,16 +70,6 @@ case class CaseTwo(id: String, str: String, data: Int, inner: RecordTestEntity)
7070
case class CaseThree(id: String, str: String, data: String, inner: RecordTestEntity) extends HasInner
7171
object UnionTestEntity extends MongoEntityCompanion[UnionTestEntity]
7272

73-
@flatten sealed trait PolyMongoUnion[+T]
74-
object PolyMongoUnion extends MongoPolyDataCompanion[PolyMongoUnion] {
75-
case class CaseOne[+T](value: T, str: String) extends PolyMongoUnion[T]
76-
case class CaseTwo[+T](foo: T, int: Int) extends PolyMongoUnion[T]
77-
case object CaseThree extends PolyMongoUnion[Nothing]
78-
}
79-
80-
case class PolyMongoRecord[+T](value: T, meta: String)
81-
object PolyMongoRecord extends MongoPolyDataCompanion[PolyMongoRecord]
82-
8373
case class TestAutoId(id: ObjectId) extends AnyVal
8474
object TestAutoId extends ObjectIdWrapperCompanion[TestAutoId]
8575

project/build.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
# suppress inspection "UnusedProperty"
2-
sbt.version=1.5.5
2+
sbt.version=1.5.7

0 commit comments

Comments
 (0)