- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
更新:请参阅下面的答案来解决此问题。还有第二个问题(宏现在找不到Pojo),关于第二个问题的问题在这里:Scala macro can't find my java class
我正在创建一个 scala 宏来自动从 POJO 生成案例类(以便更好地使用 avro)。
除了编译器被内置的 java 类(如 java.util.List 和 java.lang.Object)阻塞之外,一切都“有效”。
我的问题是:如何在宏中生成代码以便编译器解析 java 类?
[info] Compiling 1 Scala source to /Users/marcin/development/repo/problemdemo/target/scala-2.11/classes...
fieldType:java.util.List
fieldType:Int
fieldType:java.util.List
Expr[Any](case class Demo extends scala.Product with scala.Serializable {
<caseaccessor> <paramaccessor> val baz: java.util.List[com.squarefoot.Pojo] = _;
<caseaccessor> <paramaccessor> val bar: Int = _;
<caseaccessor> <paramaccessor> val foo: java.util.List[java.lang.Integer] = _;
def <init>(baz: java.util.List[com.squarefoot.Pojo], bar: Int, foo: java.util.List[java.lang.Integer]) = {
super.<init>();
()
}
})
[error] /Users/marcin/development/repos/problemdemo/src/main/scala/com/squarefoot/converters/problemdemo.scala:5: not found: type java.util.List
[error] @Caseify(classOf[com.squarefoot.Pojo])
[error] ^
[error] one error found
[error] (root/compile:compileIncremental) Compilation failed
[error] Total time: 17 s, completed Dec 11, 2016 12:00:57 PM
[info] Compiling 1 Scala source to /Users/marcin/development/repos/problemdemo/target/scala-2.11/classes...
fieldType:java.lang.Object
fieldType:Int
Expr[Any](case class Demo extends scala.Product with scala.Serializable {
<caseaccessor> <paramaccessor> val qux: java.lang.Object = _;
<caseaccessor> <paramaccessor> val bar: Int = _;
def <init>(qux: java.lang.Object, bar: Int) = {
super.<init>();
()
}
})
[error] /Users/marcin/development/repos/problemdemo/src/main/scala/com/squarefoot/converters/problemdemo.scala:5: not found: type java.lang.Object
[error] @Caseify(classOf[com.squarefoot.Pojo])
[error] ^
[error] one error found
[error] (root/compile:compileIncremental) Compilation failed
[error] Total time: 6 s, completed Dec 11, 2016 12:04:29 PM
showRaw
给出这样的输出,对我来说看起来不错:
ValDef(Modifiers(DEFERRED), TermName("availablebuildouts"), AppliedTypeTree(Ident(TypeName("java.util.List")), List(Ident(TypeName("com.squarefoot.buildouttype")))), EmptyTree)
problemdemo/avroschemas/src/main/java/com/squarefoot/Pojo.java
:package com.squarefoot;
public class Pojo {
//public java.util.List<Integer> foo;
public int bar;
//public java.util.List<Pojo> baz;
public java.lang.Object qux;
}
problemdemo/src/main/scala/com/squarefoot/converters/problemdemo.scala
:package com.squarefoot.converters
import com.squarefoot.Pojo
class Foomin {
val foobar: java.util.List[Int]
}
@Caseify(classOf[com.squarefoot.Pojo])
case class Demo()
problemdemo/macros/src/main/scala/com/squarefoot/converters/Caseify.scala
:package com.squarefoot.converters
import scala.language.experimental.macros
import scala.annotation.StaticAnnotation
import scala.reflect.macros.Context
/**
* Generate case class from POJO
* ex:
* @Caseify(classOf[com.squarefoot.incominglisting])
* case class Incominglisting()
* NOTE that the type parameter to classOf must be provided as a fully
* qualified name, otherwise the macro code here won't be able to find it.
*
* Generates a case class with the same members as the public, non-static
* members of the pojo
*
* Note that you must have all types used in the POJO in scope where the macro
* is invoked
*/
class Caseify[T](source: Class[T]) extends StaticAnnotation {
def macroTransform(annottees: Any*) = macro CaseifyMacro.expand_impl[T]
}
object CaseifyMacro {
/** generate case class from POJO */
def expand_impl[T](c: Context)(annottees: c.Expr[Any]*) = {
import c.universe._
// macro expand the macro expression itself to extract param
val source: Class[T] = c.prefix.tree match {
case q"new Caseify($param)" => c.eval[Class[T]](c.Expr(param))
}
val rm = scala.reflect.runtime.currentMirror
val vars =
rm.classSymbol(source).toType.members.map(_.asTerm).
filter(_.isVar).filter(_.isPublic)
lazy val fields = vars.map({f=>
val fieldName = TermName(f.name.toString)
val fieldType = TypeName(f.typeSignature.typeConstructor.toString)
val typeArgs = f.typeSignature.typeArgs.map(a=>TypeName(a.toString))
println("fieldType:"+fieldType.toString)
q"val $fieldName: $fieldType"
if(typeArgs.size > 0)
q"val $fieldName: $fieldType[..$typeArgs]"
else
q"val $fieldName: $fieldType"
})
annottees.map(_.tree) match {
case List(q"case class $newname()") => {
val q = c.Expr[Any](
// Add your own logic here, possibly using arguments on the annotation.
q"""
case class $newname(..$fields)
""")
println(q.toString)
q
}
// Add validation and error handling here.
}
}
}
problemdemo/build.sbt
name := "data-importer"
addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full)
scalaVersion := "2.11.8"
val avroVersion = "1.8.1"
lazy val root =
project.in( file(".") )
.aggregate(avroschemas, macros).dependsOn(macros, avroschemas)
lazy val macros = project.dependsOn(avroschemas)
lazy val avroschemas = project
libraryDependencies ++= Seq(
"org.scala-lang" % "scala-reflect" % scalaVersion.value
)
// better error reporting
scalacOptions in Test ++= Seq("-Yrangepos")
run in Compile := Defaults.runTask(fullClasspath in Compile, mainClass in (Compile, run), runner in (Compile, run))
problemdemo/macros/build.sbt
name := "data-importer-macros"
addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full)
organization := "com.squarefoot"
scalaVersion := "2.11.3"
libraryDependencies ++= Seq(
"org.scala-lang" % "scala-reflect" % scalaVersion.value
)
scalacOptions in Test ++= Seq("-Yrangepos")
problemdemo/avroschemas/build.sbt
name := "data-importer-avroschemas"
addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full)
organization := "com.squarefoot"
scalaVersion := "2.11.8"
// better error reporting
scalacOptions in Test ++= Seq("-Yrangepos")
run in Compile := Defaults.runTask(fullClasspath in Compile, mainClass in (Compile, run), runner in (Compile, run))
最佳答案
基本上,您想要的不是 TypeName("java.util.List")
,而是类似的内容(基于 http://docs.scala-lang.org/overviews/reflection/symbols-trees-types.html#tree-creation-via-reify 中的示例,目前无法测试)选择(选择(此(TypeName(“java”)),TypeName(“util”)),TypeName(“List”))
。如果您在输入树上执行showRaw
,您应该会看到更准确的结果。因此,不要使用 TypeName(...toString)
,而是按 .
进行拆分。也许只是删除 TypeName
:
val fieldType = f.typeSignature.typeConstructor
val typeArgs = f.typeSignature.typeArgs
够了吗?
关于java - Scala 宏找不到 java.util.List、java.lang.Object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41088861/
例如,我有一个父类Author: class Author { String name static hasMany = [ fiction: Book,
代码如下: dojo.query(subNav.navClass).forEach(function(node, index, arr){ if(dojo.style(node, 'd
我有一个带有 Id 和姓名的学生表和一个带有 Id 和 friend Id 的 Friends 表。我想加入这两个表并找到学生的 friend 。 例如,Ashley 的 friend 是 Saman
我通过互联网浏览,但仍未找到问题的答案。应该很容易: class Parent { String name Child child } 当我有一个 child 对象时,如何获得它的 paren
我正在尝试创建一个以 Firebase 作为我的后端的社交应用。现在我正面临如何(在哪里?)找到 friend 功能的问题。 我有每个用户的邮件地址。 我可以访问用户的电话也预订。 在传统的后端中,我
我主要想澄清以下几点: 1。有人告诉我,在 iOS 5 及以下版本中,如果您使用 Game Center 设置多人游戏,则“查找 Facebook 好友”(如与好友争夺战)的功能不是内置的,因此您需要
关于redis docker镜像ENTRYPOINT脚本 docker-entrypoint.sh : #!/bin/sh set -e # first arg is `-f` or `--some-
我是一名优秀的程序员,十分优秀!