2016-04-14 26 views
0

Bu hat:Scala bulunamadı: değeri makro

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

Bu hata:

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

Bu kanca:

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

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

Bu makro:

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 
    } 
} 

^Bu derleyici hatasının nedeninin ne olduğunu veya nasıl düzeltileceğini anlayamıyorum.

Sadece makroyu değil, kaynak dosyayı derlediğimde olduğunu unutmayın.

+0

Makroyu çağıran kodu derlemeden önce bir derleme oturumunda makronun derlemesini mi yapıyorsunuz? – pedrofurla

+0

@pedrofurla - [başarı] 'daki sbt sonundaki makrolarda "derleme" yürütme. "Foo" için "test: derleme" çalıştırılıyor .assertNonFatal (_ eşittir "foo", "hata iletisi") "bulunamadı: değer beyanı" içinde biter –

cevap

1

O değiştirerek çalışır:

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

bir def makro artık hiçbir iddiası parametresi vardır çağrı mahalde genişler.