|
1 | 1 | package io.estatico.newtype.macros |
2 | 2 |
|
3 | 3 | import io.estatico.newtype.Coercible |
4 | | -import scala.reflect.ClassTag |
5 | 4 | import scala.reflect.macros.blackbox |
6 | 5 |
|
7 | 6 | //noinspection TypeAnnotation |
@@ -39,8 +38,6 @@ private[macros] class NewTypeMacros(val c: blackbox.Context) |
39 | 38 |
|
40 | 39 | val CoercibleCls = typeOf[Coercible[Nothing, Nothing]].typeSymbol |
41 | 40 | val CoercibleObj = CoercibleCls.companion |
42 | | - val ClassTagCls = typeOf[ClassTag[Nothing]].typeSymbol |
43 | | - val ClassTagObj = ClassTagCls.companion |
44 | 41 | val ObjectCls = typeOf[Object].typeSymbol |
45 | 42 |
|
46 | 43 | // We need to know if the newtype is defined in an object so we can report |
@@ -118,12 +115,18 @@ private[macros] class NewTypeMacros(val c: blackbox.Context) |
118 | 115 | val reprType = valDef.tpt |
119 | 116 | val typesTraitName = TypeName(s"${clsName.decodedName}__Types") |
120 | 117 | val tparams = clsDef.tparams |
| 118 | + val extra = generateExtra( |
| 119 | + clsDef, modDef, valDef, |
| 120 | + tparamsNoVar, tparamNames, tparamsWild, |
| 121 | + subtype |
| 122 | + ) |
121 | 123 | val companionExtraDefs = |
122 | 124 | maybeGenerateApplyMethod(clsDef, valDef, tparamsNoVar, tparamNames) ::: |
123 | 125 | maybeGenerateUnapplyMethod(clsDef, valDef, tparamsNoVar, tparamNames) ::: |
124 | 126 | maybeGenerateOpsDef(clsDef, valDef, tparamsNoVar, tparamNames) ::: |
125 | 127 | generateCoercibleInstances(tparamsNoVar, tparamNames, tparamsWild) ::: |
126 | | - generateDerivingMethods(tparamsNoVar, tparamNames, tparamsWild) |
| 128 | + generateDerivingMethods(tparamsNoVar, tparamNames, tparamsWild) ::: |
| 129 | + extra |
127 | 130 |
|
128 | 131 | val newtypeObjParents = objParents :+ tq"$typesTraitName" |
129 | 132 | val newtypeObjDef = ModuleDef( |
@@ -294,24 +297,14 @@ private[macros] class NewTypeMacros(val c: blackbox.Context) |
294 | 297 | q"@_root_.scala.inline implicit def unsafeWrap: $CoercibleCls[Repr, Type] = $CoercibleObj.instance", |
295 | 298 | q"@_root_.scala.inline implicit def unsafeUnwrap: $CoercibleCls[Type, Repr] = $CoercibleObj.instance", |
296 | 299 | q"@_root_.scala.inline implicit def unsafeWrapM[M[_]]: $CoercibleCls[M[Repr], M[Type]] = $CoercibleObj.instance", |
297 | | - q"@_root_.scala.inline implicit def unsafeUnwrapM[M[_]]: $CoercibleCls[M[Type], M[Repr]] = $CoercibleObj.instance", |
298 | | - // Avoid ClassCastException with Array types by prohibiting Array coercing. |
299 | | - q"@_root_.scala.inline implicit def cannotWrapArrayAmbiguous1: $CoercibleCls[_root_.scala.Array[Repr], _root_.scala.Array[Type]] = $CoercibleObj.instance", |
300 | | - q"@_root_.scala.inline implicit def cannotWrapArrayAmbiguous2: $CoercibleCls[_root_.scala.Array[Repr], _root_.scala.Array[Type]] = $CoercibleObj.instance", |
301 | | - q"@_root_.scala.inline implicit def cannotUnwrapArrayAmbiguous1: $CoercibleCls[_root_.scala.Array[Type], _root_.scala.Array[Repr]] = $CoercibleObj.instance", |
302 | | - q"@_root_.scala.inline implicit def cannotUnwrapArrayAmbiguous2: $CoercibleCls[_root_.scala.Array[Type], _root_.scala.Array[Repr]] = $CoercibleObj.instance" |
| 300 | + q"@_root_.scala.inline implicit def unsafeUnwrapM[M[_]]: $CoercibleCls[M[Type], M[Repr]] = $CoercibleObj.instance" |
303 | 301 | ) else List( |
304 | 302 | q"@_root_.scala.inline implicit def unsafeWrap[..$tparamsNoVar]: $CoercibleCls[Repr[..$tparamNames], Type[..$tparamNames]] = $CoercibleObj.instance", |
305 | 303 | q"@_root_.scala.inline implicit def unsafeUnwrap[..$tparamsNoVar]: $CoercibleCls[Type[..$tparamNames], Repr[..$tparamNames]] = $CoercibleObj.instance", |
306 | 304 | q"@_root_.scala.inline implicit def unsafeWrapM[M[_], ..$tparamsNoVar]: $CoercibleCls[M[Repr[..$tparamNames]], M[Type[..$tparamNames]]] = $CoercibleObj.instance", |
307 | 305 | q"@_root_.scala.inline implicit def unsafeUnwrapM[M[_], ..$tparamsNoVar]: $CoercibleCls[M[Type[..$tparamNames]], M[Repr[..$tparamNames]]] = $CoercibleObj.instance", |
308 | 306 | q"@_root_.scala.inline implicit def unsafeWrapK[T[_[..$tparamsNoVar]]]: $CoercibleCls[T[Repr], T[Type]] = $CoercibleObj.instance", |
309 | | - q"@_root_.scala.inline implicit def unsafeUnwrapK[T[_[..$tparamsNoVar]]]: $CoercibleCls[T[Type], T[Repr]] = $CoercibleObj.instance", |
310 | | - // Avoid ClassCastException with Array types by prohibiting Array coercing. |
311 | | - q"@_root_.scala.inline implicit def cannotWrapArrayAmbiguous1[..$tparamsNoVar]: $CoercibleCls[_root_.scala.Array[Repr[..$tparamNames]], _root_.scala.Array[Type[..$tparamNames]]] = $CoercibleObj.instance", |
312 | | - q"@_root_.scala.inline implicit def cannotWrapArrayAmbiguous2[..$tparamsNoVar]: $CoercibleCls[_root_.scala.Array[Repr[..$tparamNames]], _root_.scala.Array[Type[..$tparamNames]]] = $CoercibleObj.instance", |
313 | | - q"@_root_.scala.inline implicit def cannotUnwrapArrayAmbiguous1[..$tparamsNoVar]: $CoercibleCls[_root_.scala.Array[Type[..$tparamNames]], _root_.scala.Array[Repr[..$tparamNames]]] = $CoercibleObj.instance", |
314 | | - q"@_root_.scala.inline implicit def cannotUnwrapArrayAmbiguous2[..$tparamsNoVar]: $CoercibleCls[_root_.scala.Array[Type[..$tparamNames]], _root_.scala.Array[Repr[..$tparamNames]]] = $CoercibleObj.instance" |
| 307 | + q"@_root_.scala.inline implicit def unsafeUnwrapK[T[_[..$tparamsNoVar]]]: $CoercibleCls[T[Type], T[Repr]] = $CoercibleObj.instance" |
315 | 308 | ) |
316 | 309 | } |
317 | 310 |
|
|
0 commit comments