Macro Compilation Error with Runtime Types
Following the example outlined in the README, this test fails:
package ahlers.michael
import org.scalatest.{Matchers, WordSpec}
class MixinTest
extends WordSpec
with Matchers {
trait Foo {
def foo: Int
}
trait Bear {
def bear: String
}
val f: Foo = new Foo {
override def foo: Int = 42
}
val b: Bear = new Bear {
override def bear: String = "bear"
}
"Foo" must {
import de.unimarburg.composition._
import macros._
"mix Bar with compile-time types" in {
mix(f, b).foo should be(42)
}
"mix Bar with runtime types" in {
def canCompose[A, B](a: A, b: B)(implicit ev: A With B) = {
mix(a, b)
}
canCompose(f, b).foo should be(42)
}
}
}
If I strike the latter, it works as expected. With both, I get this:
> test-only ahlers.michael.MixinTest
[info] Compiling 1 Scala source to /Users/michaelahlers/Projects/MixinComposition/target/scala-2.11/test-classes...
[error] <macro>:1: super may not be used on value <error>
[error] { new A with B { def getClass() = b$macro$4.getClass() } }
[error] ^
[error] one error found
[error] (test:compileIncremental) Compilation failed
Is this user error? A regression with a newer Scala release (using 2.11.7)?
MixinComposition is an interesting project. Has it been abandoned?
@mslinn, looks that way. It's a powerful concept for shaping domain models, and I have use for this again in the near future. Time permitting, I'd like to fork this project and update it.
Hi, sorry -- I don't know how this issue has escaped me. I'll have a look into it (even though this issue is pretty old).
When looking at the implementation of mix, we see that it will immediately try to materialize A With B. However, since A and B are type parameters, the macro fails.
The easiest workaround is to immediately use the With provided as an argument to canCompose:
def canCompose[A, B](a: A, b: B)(implicit ev: A With B) = {
ev(a, b)
}
That said, I agree this is brittle and the error message could be way more informative.
I tried to add a error message that is a bit more expressive. Though not perfect, this should make it easier to discover this bug earlier next time.