Skip to content

Commit a282f47

Browse files
cheesengbvenners
authored andcommitted
Make generators to generate files only when necessary.
(cherry picked from commit 68d9c29) Conflicts: project/GenTable.scala
1 parent bc44293 commit a282f47

9 files changed

+550
-484
lines changed

project/GenCompatibleClasses.scala

Lines changed: 46 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import java.io.{FileWriter, BufferedWriter, File}
22

33
object GenCompatibleClasses {
44

5+
val generatorSource = new File("GenCompatibleClasses.scala")
6+
57
def genMain(targetDir: File, version: String, scalaVersion: String): Seq[File] = {
68
targetDir.mkdirs()
79
val listCellRendererClass = Class.forName("javax.swing.ListCellRenderer")
@@ -16,55 +18,59 @@ object GenCompatibleClasses {
1618
val java6ClassesFiles =
1719
java6Classes.map { case (name, cls) =>
1820
val file = new File(targetDir, name + ".scala")
19-
val bw = new BufferedWriter(new FileWriter(file))
20-
try {
21-
bw.write("package org.scalatest.tools\n")
22-
bw.write("import javax.swing._\n")
23-
if (isJava7)
24-
bw.write(cls + "[EventHolder]")
25-
else
26-
bw.write(cls)
27-
}
28-
finally {
29-
bw.flush()
30-
bw.close()
21+
if (!file.exists || generatorSource.lastModified > file.lastModified) {
22+
val bw = new BufferedWriter(new FileWriter(file))
23+
try {
24+
bw.write("package org.scalatest.tools\n")
25+
bw.write("import javax.swing._\n")
26+
if (isJava7)
27+
bw.write(cls + "[EventHolder]")
28+
else
29+
bw.write(cls)
30+
}
31+
finally {
32+
bw.flush()
33+
bw.close()
34+
}
35+
println("Generated " + file.getAbsolutePath)
3136
}
32-
println("Generated " + file.getAbsolutePath)
3337
file
3438
}
3539

3640
val file = new File(targetDir, "EventHolderListCellRenderer.scala")
37-
val bw = new BufferedWriter(new FileWriter(file))
41+
if (!file.exists || generatorSource.lastModified > file.lastModified) {
42+
val bw = new BufferedWriter(new FileWriter(file))
3843

39-
try {
40-
bw.write("package org.scalatest.tools\n")
41-
bw.write("import java.awt.Component\n")
42-
bw.write("import javax.swing._\n")
43-
if (isJava7) { // workaround from http://www.scala-lang.org/old/node/10687
44-
bw.write("private[tools] trait EventHolderListCellRenderer extends ListCellRenderer[EventHolder] {\n")
45-
bw.write(" private val defaultRenderer: ListCellRenderer[EventHolder] = (new DefaultListCellRenderer()).asInstanceOf[ListCellRenderer[EventHolder]]\n")
46-
bw.write(" protected def decorate(renderer: JLabel, value: Object, isSelected: Boolean): Component\n")
47-
bw.write(" def getListCellRendererComponent(list: JList[_ <: EventHolder], value: EventHolder, index: Int, isSelected: Boolean, cellHasFocus: Boolean): Component = {\n")
48-
bw.write(" val renderer: JLabel = defaultRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus).asInstanceOf[JLabel]\n")
49-
bw.write(" decorate(renderer, value, isSelected)\n")
50-
bw.write(" }")
51-
bw.write("}\n")
44+
try {
45+
bw.write("package org.scalatest.tools\n")
46+
bw.write("import java.awt.Component\n")
47+
bw.write("import javax.swing._\n")
48+
if (isJava7) { // workaround from http://www.scala-lang.org/old/node/10687
49+
bw.write("private[tools] trait EventHolderListCellRenderer extends ListCellRenderer[EventHolder] {\n")
50+
bw.write(" private val defaultRenderer: ListCellRenderer[EventHolder] = (new DefaultListCellRenderer()).asInstanceOf[ListCellRenderer[EventHolder]]\n")
51+
bw.write(" protected def decorate(renderer: JLabel, value: Object, isSelected: Boolean): Component\n")
52+
bw.write(" def getListCellRendererComponent(list: JList[_ <: EventHolder], value: EventHolder, index: Int, isSelected: Boolean, cellHasFocus: Boolean): Component = {\n")
53+
bw.write(" val renderer: JLabel = defaultRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus).asInstanceOf[JLabel]\n")
54+
bw.write(" decorate(renderer, value, isSelected)\n")
55+
bw.write(" }")
56+
bw.write("}\n")
57+
}
58+
else {
59+
bw.write("private[tools] trait EventHolderListCellRenderer extends ListCellRenderer {\n")
60+
bw.write(" private val defaultRenderer: DefaultListCellRenderer = new DefaultListCellRenderer()\n")
61+
bw.write(" protected def decorate(renderer: JLabel, value: Object, isSelected: Boolean): Component\n")
62+
bw.write(" def getListCellRendererComponent(list: JList, value: Object, index: Int, isSelected: Boolean, cellHasFocus: Boolean): Component = {\n")
63+
bw.write(" val renderer: JLabel = defaultRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus).asInstanceOf[JLabel]\n")
64+
bw.write(" decorate(renderer, value, isSelected)\n")
65+
bw.write(" }")
66+
bw.write("}\n")
67+
}
5268
}
53-
else {
54-
bw.write("private[tools] trait EventHolderListCellRenderer extends ListCellRenderer {\n")
55-
bw.write(" private val defaultRenderer: DefaultListCellRenderer = new DefaultListCellRenderer()\n")
56-
bw.write(" protected def decorate(renderer: JLabel, value: Object, isSelected: Boolean): Component\n")
57-
bw.write(" def getListCellRendererComponent(list: JList, value: Object, index: Int, isSelected: Boolean, cellHasFocus: Boolean): Component = {\n")
58-
bw.write(" val renderer: JLabel = defaultRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus).asInstanceOf[JLabel]\n")
59-
bw.write(" decorate(renderer, value, isSelected)\n")
60-
bw.write(" }")
61-
bw.write("}\n")
69+
finally {
70+
bw.flush()
71+
bw.close()
6272
}
6373
}
64-
finally {
65-
bw.flush()
66-
bw.close()
67-
}
6874

6975
java6ClassesFiles.toSeq ++ Seq(file)
7076
}

project/GenFactories.scala

Lines changed: 61 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import scala.collection.JavaConversions._
2121

2222
object GenFactories {
2323

24+
val generatorSource = new File("GenFactories.scala")
25+
2426
val topPart = """
2527
package org.scalatest.matchers
2628
@@ -3061,70 +3063,71 @@ private[scalatest] class MatcherFactory$arity$Macro[-SC, $typeConstructors$] {
30613063
}
30623064

30633065
val targetFile = new File(targetDir, "MatcherFactory" + arity + ".scala")
3064-
val bw = new BufferedWriter(new FileWriter(targetFile))
3065-
3066-
try {
3067-
3068-
val topSt = new org.antlr.stringtemplate.StringTemplate(topPart)
3069-
setCommonOnes(arity, topSt)
3070-
val nTypeclassInstances =
3071-
if (arity == 1) "one typeclass instance"
3072-
else {
3073-
val numStr =
3074-
arity match {
3075-
case 2 => "two"
3076-
case 3 => "three"
3077-
case 4 => "four"
3078-
case 5 => "five"
3079-
case 6 => "six"
3080-
case 7 => "seven"
3081-
case 8 => "eight"
3082-
case 9 => "nine"
3083-
}
3084-
numStr + " typeclass instances"
3066+
if (!targetFile.exists || generatorSource.lastModified > targetFile.lastModified) {
3067+
val bw = new BufferedWriter(new FileWriter(targetFile))
3068+
3069+
try {
3070+
3071+
val topSt = new org.antlr.stringtemplate.StringTemplate(topPart)
3072+
setCommonOnes(arity, topSt)
3073+
val nTypeclassInstances =
3074+
if (arity == 1) "one typeclass instance"
3075+
else {
3076+
val numStr =
3077+
arity match {
3078+
case 2 => "two"
3079+
case 3 => "three"
3080+
case 4 => "four"
3081+
case 5 => "five"
3082+
case 6 => "six"
3083+
case 7 => "seven"
3084+
case 8 => "eight"
3085+
case 9 => "nine"
3086+
}
3087+
numStr + " typeclass instances"
3088+
}
3089+
topSt.setAttribute("nTypeclassInstances", nTypeclassInstances)
3090+
bw.write(transform(topSt.toString))
3091+
3092+
// Now do the and/or methods that take matcher factories of various arities
3093+
for (passedArity <- 1 to MaxArity - arity) {
3094+
val resultArity = arity + passedArity
3095+
val middleSt = new org.antlr.stringtemplate.StringTemplate(middlePart)
3096+
setCommonOnes(arity, middleSt)
3097+
middleSt.setAttribute("passedArity", passedArity);
3098+
middleSt.setAttribute("resultArity", resultArity);
3099+
val resultColonSeparatedTCNs = (1 to resultArity).map("TC" + _).mkString(" : ")
3100+
middleSt.setAttribute("resultColonSeparatedTCNs", resultColonSeparatedTCNs);
3101+
val resultCommaSeparatedTCNs = (1 to resultArity).map("TC" + _).mkString(", ")
3102+
middleSt.setAttribute("resultCommaSeparatedTCNs", resultCommaSeparatedTCNs);
3103+
val passedTypeConstructors = (arity + 1 to resultArity).map("TC" + _ + "[_]").mkString(", ")
3104+
middleSt.setAttribute("passedTypeConstructors", passedTypeConstructors);
3105+
val passedCommaSeparatedTCNs = (arity + 1 to resultArity).map("TC" + _).mkString(", ")
3106+
middleSt.setAttribute("passedCommaSeparatedTCNs", passedCommaSeparatedTCNs);
3107+
bw.write(transform(middleSt.toString))
30853108
}
3086-
topSt.setAttribute("nTypeclassInstances", nTypeclassInstances)
3087-
bw.write(transform(topSt.toString))
3088-
3089-
// Now do the and/or methods that take matcher factories of various arities
3090-
for (passedArity <- 1 to MaxArity - arity) {
3091-
val resultArity = arity + passedArity
3092-
val middleSt = new org.antlr.stringtemplate.StringTemplate(middlePart)
3093-
setCommonOnes(arity, middleSt)
3094-
middleSt.setAttribute("passedArity", passedArity);
3095-
middleSt.setAttribute("resultArity", resultArity);
3096-
val resultColonSeparatedTCNs = (1 to resultArity).map("TC" + _).mkString(" : ")
3097-
middleSt.setAttribute("resultColonSeparatedTCNs", resultColonSeparatedTCNs);
3098-
val resultCommaSeparatedTCNs = (1 to resultArity).map("TC" + _).mkString(", ")
3099-
middleSt.setAttribute("resultCommaSeparatedTCNs", resultCommaSeparatedTCNs);
3100-
val passedTypeConstructors = (arity + 1 to resultArity).map("TC" + _ + "[_]").mkString(", ")
3101-
middleSt.setAttribute("passedTypeConstructors", passedTypeConstructors);
3102-
val passedCommaSeparatedTCNs = (arity + 1 to resultArity).map("TC" + _).mkString(", ")
3103-
middleSt.setAttribute("passedCommaSeparatedTCNs", passedCommaSeparatedTCNs);
3104-
bw.write(transform(middleSt.toString))
3105-
}
31063109

3107-
// Just don't put the and/or DSL under MatcherFactory<MaxArity>, even though the ones that could
3108-
// return another MatcherFactory<MaxArity> could be implemented. That would mean only *some* of the
3109-
// DSL is implemented under MatcherFactory<MaxArity>. I'd rather just say none of it is.
3110-
if (arity < MaxArity) {
3111-
def doABottomHalf(bottomSt: org.antlr.stringtemplate.StringTemplate) {
3112-
setCommonOnes(arity, bottomSt)
3113-
bottomSt.setAttribute("arityPlusOne", arity + 1);
3114-
bw.write(transform(bottomSt.toString))
3110+
// Just don't put the and/or DSL under MatcherFactory<MaxArity>, even though the ones that could
3111+
// return another MatcherFactory<MaxArity> could be implemented. That would mean only *some* of the
3112+
// DSL is implemented under MatcherFactory<MaxArity>. I'd rather just say none of it is.
3113+
if (arity < MaxArity) {
3114+
def doABottomHalf(bottomSt: org.antlr.stringtemplate.StringTemplate) {
3115+
setCommonOnes(arity, bottomSt)
3116+
bottomSt.setAttribute("arityPlusOne", arity + 1);
3117+
bw.write(transform(bottomSt.toString))
3118+
}
3119+
doABottomHalf(new org.antlr.stringtemplate.StringTemplate(bottomPart1)) // Do in two halves, because hitting class file max string size limit
3120+
doABottomHalf(new org.antlr.stringtemplate.StringTemplate(bottomPart2))
3121+
}
3122+
else {
3123+
bw.write("}\n")
31153124
}
3116-
doABottomHalf(new org.antlr.stringtemplate.StringTemplate(bottomPart1)) // Do in two halves, because hitting class file max string size limit
3117-
doABottomHalf(new org.antlr.stringtemplate.StringTemplate(bottomPart2))
31183125
}
3119-
else {
3120-
bw.write("}\n")
3126+
finally {
3127+
bw.close()
31213128
}
3122-
3123-
targetFile
3124-
}
3125-
finally {
3126-
bw.close()
31273129
}
3130+
targetFile
31283131
}
31293132
}
31303133

0 commit comments

Comments
 (0)