2016-06-12 2 views
0

Я написал JDBC для выбора и вставки карт с использованием функции scala macro.Рефакторинг макросов Scala

gist

Как вы можете видеть, в сущности есть много дублированного кода ... Я не могу извлечь тематические классы 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, так что если у вас есть какие-либо другие комментарии о том, как писать макросы - если я сделал какую-то ошибку - пожалуйста, дай мне знать =)

ответ

0

Оказывается, это работает как это :

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 
} 

она компилирует, но IntelliJ сообщает об ошибке:

Type missmatch, expected: c.Type, actual: whitebox.Context#Type 

Так что это IDE ошибка =)

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