Skip to content

Commit

Permalink
wip #75
Browse files Browse the repository at this point in the history
  • Loading branch information
carueda committed Nov 4, 2021
1 parent f35e2af commit dc4957d
Show file tree
Hide file tree
Showing 11 changed files with 96 additions and 122 deletions.
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -3,6 +3,7 @@ src/main/resources/codeDefs/
.metals
metals.sbt
.bloop
.bsp

### Scala template
*.class
Expand Down
9 changes: 0 additions & 9 deletions build.sbt
Expand Up @@ -44,15 +44,6 @@ fullRunTask(genCode, Compile, "tscfg.gen4tests")
/* pending stuff for when using java 16+
Test / javacOptions ++= Seq("-source", "1.17")
// google-java-format:
javaOptions ++= Seq(
"--add-exports", "jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED",
"--add-exports", "jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED",
"--add-exports", "jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED",
"--add-exports", "jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED",
"--add-exports", "jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED",
)
*/

(Test / testOnly) := ((Test / testOnly) dependsOn (codeDefs, genCode)).evaluated
Expand Down
6 changes: 6 additions & 0 deletions src/main/scala/tscfg/Main.scala
Expand Up @@ -33,6 +33,7 @@ object Main {
| --java generate java code (the default)
| --j7 generate code for java <= 7 (8)
| --java:getters generate getters (see #31) (false)
| --java:records generate records (false)
| --java:optionals use optionals (false)
| --scala generate scala code (java)
| --scala:2.12 generate code for scala 2.12 (2.13)
Expand All @@ -59,6 +60,7 @@ object Main {
s12: Boolean = false,
useBackticks: Boolean = false,
genGetters: Boolean = false,
genRecords: Boolean = false,
useOptionals: Boolean = false,
useDurations: Boolean = false,
tplFilename: Option[String] = None,
Expand Down Expand Up @@ -130,6 +132,9 @@ object Main {
case "--java:getters" :: rest =>
traverseList(rest, opts.copy(genGetters = true))

case "--java:records" :: rest =>
traverseList(rest, opts.copy(genRecords = true))

case "--java:optionals" :: rest =>
traverseList(rest, opts.copy(useOptionals = true))

Expand Down Expand Up @@ -189,6 +194,7 @@ object Main {
s12 = opts.s12,
useBackticks = opts.useBackticks,
genGetters = opts.genGetters,
genRecords = opts.genRecords,
useOptionals = opts.useOptionals,
useDurations = opts.useDurations
)
Expand Down
1 change: 1 addition & 0 deletions src/main/scala/tscfg/gen4tests.scala
Expand Up @@ -40,6 +40,7 @@ object gen4tests {
case "--scala:2.12" => genOpts = genOpts.copy(s12 = true)
case "--scala:bt" => genOpts = genOpts.copy(useBackticks = true)
case "--java:getters" => genOpts = genOpts.copy(genGetters = true)
case "--java:records" => genOpts = genOpts.copy(genRecords = true)
case "--java:optionals" => genOpts = genOpts.copy(useOptionals = true)
case "--durations" => genOpts = genOpts.copy(useDurations = true)
case "--all-required" =>
Expand Down
1 change: 1 addition & 0 deletions src/main/scala/tscfg/generators/Generator.scala
Expand Up @@ -32,6 +32,7 @@ case class GenOpts(
s12: Boolean = false,
useBackticks: Boolean = false,
genGetters: Boolean = false,
genRecords: Boolean = false,
useOptionals: Boolean = false,
useDurations: Boolean = false
)
Expand Down
95 changes: 71 additions & 24 deletions src/main/scala/tscfg/generators/java/JavaGen.scala
Expand Up @@ -109,10 +109,13 @@ class JavaGen(genOpts: GenOpts) extends Generator(genOpts) {
}
genResults = genResults
.copy(fields = genResults.fields + (javaId -> type_.toString))
s"public final $type_ $javaId;" + dbg("<decl>")
if (genOpts.genRecords)
s"$type_ $javaId" + dbg("<decl>")
else
s"public final $type_ $javaId;" + dbg("<decl>")
}
}
.mkString("\n ")
.mkString(if (genOpts.genRecords) ",\n " else "\n ")

val classMemberGettersStr = if (genOpts.genGetters) {
classDeclMembers
Expand All @@ -137,20 +140,33 @@ class JavaGen(genOpts: GenOpts) extends Generator(genOpts) {
implicit val listAccessors =
collection.mutable.LinkedHashMap[String, String]()

val ctorMembersStr = results
.flatMap { case (symbol, res, a) =>
if (a.isDefine) None
else
Some {
val javaId = javaIdentifier(symbol)
"this." + javaId + " = " + instance(
a,
res,
path = escapeString(symbol)
) + ";"
}
}
.mkString("\n ")
val ctorMembersStr = if (genOpts.genRecords) {
results
.flatMap { case (symbol, res, a) =>
if (a.isDefine) None
else
Some {
instance(a, res, path = escapeString(symbol), isRoot = isRoot)
}
}
.mkString("this(\n ", ",\n ", "\n );")
}
else {
results
.flatMap { case (symbol, res, a) =>
if (a.isDefine) None
else
Some {
val javaId = javaIdentifier(symbol)
"this." + javaId + " = " + instance(
a,
res,
path = escapeString(symbol)
) + ";"
}
}
.mkString("\n ")
}

val elemAccessorsStr = {
val objOnes =
Expand Down Expand Up @@ -185,11 +201,14 @@ class JavaGen(genOpts: GenOpts) extends Generator(genOpts) {
val (ctorParams, errHandlingDecl, errHandlingDispatch) = if (isRoot) {
(
"com.typesafe.config.Config c",
"""final $TsCfgValidator $tsCfgValidator = new $TsCfgValidator();
| final java.lang.String parentPath = "";
| """.stripMargin,
if (genOpts.genRecords)
""
else
"""final $TsCfgValidator $tsCfgValidator = new $TsCfgValidator();
| final java.lang.String parentPath = "";
| """.stripMargin,
s"""
| $$tsCfgValidator.validate();""".stripMargin
| $$tsCfgValidator.validate();""".stripMargin
)
}
else
Expand All @@ -207,6 +226,20 @@ class JavaGen(genOpts: GenOpts) extends Generator(genOpts) {

val classStr =
ot match {
case _: ObjectType if genOpts.genRecords =>
s"""public ${if (isRoot) "" else "static "}record $classNameAdjusted $extendsString(
| $classDeclMembersStr$classMemberGettersStr
|) {
|${if (isRoot)
" static final $TsCfgValidator $tsCfgValidator = new $TsCfgValidator();\n"
else ""}
| $membersStr
| public $classNameAdjusted($ctorParams) {$superString
| $errHandlingDecl$ctorMembersStr$errHandlingDispatch
| }$elemAccessorsStr
|$rootAuxClasses}
|""".stripMargin

case _: ObjectType =>
s"""public ${if (isRoot) "" else "static "}class $classNameAdjusted $extendsString{
| $classDeclMembersStr$classMemberGettersStr
Expand Down Expand Up @@ -317,7 +350,12 @@ class JavaGen(genOpts: GenOpts) extends Generator(genOpts) {
case other => other
}

private def instance(a: AnnType, res: Res, path: String)(implicit
private def instance(
a: AnnType,
res: Res,
path: String,
isRoot: Boolean = false
)(implicit
listAccessors: collection.mutable.LinkedHashMap[String, String]
): String = {

Expand All @@ -329,7 +367,7 @@ class JavaGen(genOpts: GenOpts) extends Generator(genOpts) {
objRefResolution.getOrElse {
a.t match {
case bt: BasicType => basicInstance(a, bt, path)
case _: ObjectAbsType => objectInstance(a, res, path)
case _: ObjectAbsType => objectInstance(a, res, path, isRoot)
case lt: ListType => listInstance(a, lt, res, path)
}
}
Expand All @@ -355,12 +393,21 @@ class JavaGen(genOpts: GenOpts) extends Generator(genOpts) {
s"""$className.valueOf(c.getString("$path"))"""
}

private def objectInstance(a: AnnType, res: Res, path: String)(implicit
private def objectInstance(
a: AnnType,
res: Res,
path: String,
isRoot: Boolean
)(implicit
listAccessors: collection.mutable.Map[String, String]
): String = {
val className = res.javaType.toString

val ppArg = s""", parentPath + "$path.", $$tsCfgValidator"""
val ppArg =
if (isRoot)
s""", "$path.", $$tsCfgValidator"""
else
s""", parentPath + "$path.", $$tsCfgValidator"""

def reqConfigCall = {
val methodName = "$_reqConfig"
Expand Down
6 changes: 6 additions & 0 deletions src/main/tscfg/example/issue75.spec.conf
@@ -0,0 +1,6 @@
// GenOpts: --skip-gen4tests ## skipping because sbt is not compiling with java 16!
// GenOpts: --java:records
simple {
int: int
foo = "simple"
}
5 changes: 0 additions & 5 deletions src/main/tscfg/example/issue75a.spec.conf

This file was deleted.

7 changes: 0 additions & 7 deletions src/main/tscfg/example/issue75b.spec.conf

This file was deleted.

63 changes: 0 additions & 63 deletions src/test/java/tscfg/example/JavaIssue75aCfg.java

This file was deleted.

24 changes: 10 additions & 14 deletions src/test/scala/tscfg/generators/java/JavaMainSpec.scala
Expand Up @@ -1193,20 +1193,16 @@ class JavaMainSpec extends AnyWordSpec {
}
}

"issue 75" should {
"work with no records" in {
val c0 = ConfigFactory.parseString("simple.int = 9")
val c = new JavaIssue75aCfg(c0)
c.simple.foo === "simple"
c.simple.int_ === 9
/*
"issue 75 - java:records" when {
"with simple spec" should {
"work " in {
val c0 = ConfigFactory.parseString("simple.int = 9")
val c = new JavaIssue75Cfg(c0)
c.simple().foo() === "simple"
c.simple().int_() === 9
}
}
}
// "issue 75" should {
// "work with records" in {
// val c0 = ConfigFactory.parseString("int = 9")
// val c = new JavaIssue75bCfg(c0)
// c.simple().foo() === "simple"
// c.simple().int_() === 9
// }
// }
*/
}

0 comments on commit dc4957d

Please sign in to comment.