Saya mencoba memanggil Shapeless
makro dari dalam quasiquote
dengan Scala
dan saya tidak mendapatkan apa yang ingin saya dapatkan.
Makro saya tidak mengembalikan kesalahan apa pun tetapi tidak berkembang Witness(fieldName)
menjadiWitness.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)"""
}
Ini Field
definisi saya :
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)
}
}
Dalam hal ini implisit yang saya hasilkan terlihat seperti:
implicit val implicitFieldname : Field[MyCaseClass, fieldWitness.`type`#T]{
override type fieldType = java.lang.String
}
Jika sudah didefinisikan di luar quasiquote
itu akan menghasilkan sesuatu seperti:
implicit val implicitFieldname : Field.Aux[MyCaseClass, Witness.Lt[String]#T, String] = ...
Adakah sesuatu yang bisa dilakukan?
$in
(yang menurut saya perlu menggunakanConstantType
)?q"""implicit val $in : Field.Aux[$className, Witness.Lt[String]#T, String] = Field.apply[$className,$fieldType](Witness($fieldName), ($cc: $className) => $cc.$tn)"""
ConstantType
). Apakah Anda memiliki contoh kerja yang lengkap?Jawaban:
Ini adalah solusi kerja saya menggunakan anotasi makro gaya lama.
Tentu saja, ini dapat ditingkatkan dengan menggunakan kuasiquote yang lebih baik, tetapi tujuan saya adalah untuk menunjukkan sesuatu yang sebersih mungkin.
Dapat digunakan sebagai:
Ini menghasilkan
MyCaseClass
objek pendamping yang memerlukanFields
implisit:Seperti yang sudah ditunjukkan, tanpa contoh kerja yang lengkap, cukup sulit untuk menulis jawaban yang lengkap.
sumber