2015-12-02 2 views
0

Я пытаюсь выполнить порт this answer от this question до scala-2.10. Это то, что я пробовал:scala macros error: not found: значение

Macros.scala

package myProject.macros 

import scala.reflect.macros.Context 
import scala.language.experimental.macros 

class LoggerImpl(val c: Context) { 
    import c.universe._                                 

    def getClassSymbol(s: Symbol): Symbol = if (s.isClass) s else getClassSymbol(s.owner) 

    def logImpl(msg: Expr[String]): Unit = { 
    val cl = getClassSymbol(c.enclosingClass.symbol).toString 
    // Do something with cl 
    // For this case cl should be "SomeObject" 
    } 
} 

object Logger { 
    def warning(msg: String): Unit = macro LoggerImpl.logImpl 
} 

XYZ.scala

package myProject.XYZ 

import myProject.macros.Logger 

object SomeObject { 

    def doSomething(...) = { 
    // Some operations 
    Logger.warning("sss") 
    } 
} 

Но когда я пытаюсь построить я получаю эти ошибки:

[scalac-2.10] /../Macros.scala:20: error: not found: value LoggerImpl 
[scalac-2.10] def warning(msg: String): Unit = macro LoggerImpl.logImpl 
[scalac-2.10]           ^
[scalac-2.10] /../XYZ.scala:18: error: not found: value LoggerImpl 
[scalac-2.10] def warning(msg: String): Unit = macro LoggerImpl.logImpl 
[scalac-2.10]           ^
[scalac-2.10] two errors found 

I посмотрел на this example, разве нет способа заставить макросы работать, если они находятся в разных пакетах?

+0

Вы пытаетесь для резервного копирования этого значения в 2.10, или версия для версии 2.11 также вас устраивает? – Archeg

+0

Мне нужно придерживаться только 2.10 ..:/ –

ответ

0

Вы можете попробовать это:

object LoggerImpl { 

    def logImpl(c: Context)(msg: c.Expr[String]): c.Expr[Unit] = { 
    import c.universe._                                 

    def getClassSymbol(s: Symbol): Symbol = if (s.isClass) s else getClassSymbol(s.owner) 

    val cl = getClassSymbol(c.enclosingClass.symbol).toString 
    // Do something with cl 
    // For this case cl should be "SomeObject" 
    } 
} 

К сожалению, у меня нет Scala 2.10 под рукой, но я полагаю, что выше должны работать для вас, потому что ваш код не компилируется Скале 2.11 либо и реализаций 10 и 11, кажется, не быть сильно отличается

Пожалуйста, обратите внимание, что вам нужно возвратить c.Expr[Unit] для того, чтобы сделать что-нибудь, и вы также должны собрать его в отдельном модуле - последний является требование SCALA макросов

+0

Разве это не то же самое, что компилировать их в разные пакеты в одном проекте? –