Я написал JDBC для выбора и вставки карт с использованием функции scala macro.Рефакторинг макросов Scala
Как вы можете видеть, в сущности есть много дублированного кода ... Я не могу извлечь тематические классы ClassInfo и ColumnInfo вне метода объема импорта из-за c.universe._, потому что Я использую c.Type.
Я попытался использовать scala.reflect.runtime.universe._, но затем я получаю некоторые исключения зеркал, и вдруг тип сравнения больше не работает - я больше не получаю ClassSymbol, но SynchronizedClassSymbol, и мне нужно сравнить его, используя FULLNAME и вдруг получить очень грязный ...
Так что мой вопрос:
Я хотел бы реорганизовать:
case class ClassInfo
case class ColumnInfo
mapGet
mapSet
def getBaseClass(tp: c.Type): c.Type
def getClassInfo(tp: c.Type): Option[ClassInfo]
def getConstructorParameters(tp: c.Type): Seq[ColumnInfo]
def selectFullTermName(sym: c.Symbol): c.Tree
вне методов selectImpl и insertImpl, но я просто не знаю, как :( Я пытался, например, с помощью метода
def getBaseClass(tp: c.Type): c.Type
Выражаясь снаружи, как это:
def getBaseClass(c: whitebox.Context)(tp: c.Type) = {
import c.universe._
if (tp.baseClasses.map(_.fullName).contains(symbolOf[Option[_]].fullName))
tp.typeArgs.head
else
tp
}
Но тогда, когда я называю это как
getBaseClass(c)(x.typeSignature)
Я получаю сообщение об ошибке:
Type missmatch, expected: c.Type, actual: whitebox.Context#Type
И это сводит меня с ума у =)
Я совершенно новый в Scala, так что если у вас есть какие-либо другие комментарии о том, как писать макросы - если я сделал какую-то ошибку - пожалуйста, дай мне знать =)