2016-04-14 5 views
0

Эта строка:Scala не найдено: значение макроса

"foo".assertNonFatal(_ equals "foo", "error message"); 

Эта ошибка:

Error:(120, 47) not found: value assertion 

Этот крюк:

final implicit class ImplicitAssert[MyType](val me: MyType) { 

    final def assertNonFatal(assertion: (MyType) => Boolean, message: String) 
    : MyType = macro ImplicitAssertMacros.assertNonFatal[MyType] 
} 

Этот макрос:

object ImplicitAssertMacros { 
    def assertNonFatal[MyType](c: scala.reflect.macros.blackbox.Context) 
     (assertion: c.Tree, message: c.Tree): c.Tree = { 
    import c.universe._ 
    val me = q"${c.prefix}.me" // "me" from ImplicitAssert class. 
    val numLines = q"Int.MaxValue" 
    val useStdOut = q"false" 
    val assertionTrue = q"assertion($me)" 
    val isFatal = q"false" 
    val toReturn = q""" 
     _root_.info.collaboration_station.debug.internal.Printer.traceInternalAssert($message, $numLines, $useStdOut, $assertionTrue, $isFatal); 
     $me; 
    """ 
    toReturn 
    } 
} 

^Я не могу понять, в чем причина этой ошибки компилятора или как ее исправить.

Обратите внимание, что это происходит только при компиляции исходного файла, а не макросов.

+0

Вы компилируете макрос до, в сеансе компиляции, перед компиляцией кода, который вызывает макрос? – pedrofurla

+0

@pedrofurla - запуск «компиляции» на макросах в sbt заканчивается на [success]. Запуск «test: compile» для «foo» .assertNonFatal (_ equals «foo», «сообщение об ошибке») заканчивается на «not found: value assertion» –

ответ

1

Он работает путем изменения:

val assertionTrue = q"$assertion($me)" 

A По умолчанию макроса на месте вызова, где нет больше никаких параметров утверждения.

Смежные вопросы