Tôi đang cố gắng để gọi một Shapeless
vĩ mô từ một bên quasiquote
với Scala
và tôi không nhận được những gì tôi muốn có được.
Macro của tôi không trả về bất kỳ lỗi nào nhưng nó không mở rộng Witness(fieldName)
thànhWitness.Lt[String]
val implicits = schema.fields.map { field =>
val fieldName:String = field.name
val fieldType = TypeName(field.valueType.fullName)
val in = TermName("implicitField"+fieldName)
val tn = TermName(fieldName)
val cc = TermName("cc")
q"""implicit val $in = Field.apply[$className,$fieldType](Witness($fieldName), ($cc: $className) => $cc.$tn)"""
}
Đây là Field
định nghĩa của tôi :
sealed abstract class Field[CC, FieldName] {
val fieldName: String
type fieldType
// How to extract this field
def get(cc : CC) : fieldType
}
object Field {
// fieldType is existencial in Field but parametric in Fied.Aux
// used to explict constraints on fieldType
type Aux[CC, FieldName, fieldType_] = Field[CC, FieldName] {
type fieldType = fieldType_
}
def apply[CC, fieldType_](fieldWitness : Witness.Lt[String], ext : CC => fieldType_) : Field.Aux[CC, fieldWitness.T, fieldType_] =
new Field[CC, fieldWitness.T] {
val fieldName : String = fieldWitness.value
type fieldType = fieldType_
def get(cc : CC) : fieldType = ext(cc)
}
}
Trong trường hợp này, ẩn tôi tạo ra trông giống như:
implicit val implicitFieldname : Field[MyCaseClass, fieldWitness.`type`#T]{
override type fieldType = java.lang.String
}
Nếu nó đã được xác định bên ngoài, quasiquote
nó sẽ tạo ra một cái gì đó như:
implicit val implicitFieldname : Field.Aux[MyCaseClass, Witness.Lt[String]#T, String] = ...
Có một cái gì đó có thể được thực hiện?
q"""implicit val $in : Field.Aux[$className, Witness.Lt[String]#T, String] = Field.apply[$className,$fieldType](Witness($fieldName), ($cc: $className) => $cc.$tn)"""
ConstantType
). Bạn có tình cờ có một ví dụ làm việc hoàn chỉnh xung quanh?
$in
(mà tôi nghĩ sẽ yêu cầu sử dụngConstantType
)?