Skip to content

Commit 3164944

Browse files
authored
Merge pull request #246 from scala/backport-lts-3.3-22255
Backport "Use by-name parameter for Properties.*OrElse " to 3.3 LTS
2 parents 6f36dea + 805eadc commit 3164944

File tree

4 files changed

+55
-11
lines changed

4 files changed

+55
-11
lines changed

compiler/src/dotty/tools/dotc/config/PathResolver.scala

+1-2
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,7 @@ object PathResolver {
5353
def classPathEnv: String = envOrElse("CLASSPATH", "")
5454
def sourcePathEnv: String = envOrElse("SOURCEPATH", "")
5555

56-
//using propOrNone/getOrElse instead of propOrElse so that searchForBootClasspath is lazy evaluated
57-
def javaBootClassPath: String = propOrNone("sun.boot.class.path") getOrElse searchForBootClasspath
56+
def javaBootClassPath: String = propOrElse("sun.boot.class.path", searchForBootClasspath)
5857

5958
def javaExtDirs: String = propOrEmpty("java.ext.dirs")
6059
def scalaHome: String = propOrEmpty("scala.home")

compiler/src/dotty/tools/dotc/config/Properties.scala

+3-3
Original file line numberDiff line numberDiff line change
@@ -45,19 +45,19 @@ trait PropertiesTrait {
4545

4646
def propIsSet(name: String): Boolean = System.getProperty(name) != null
4747
def propIsSetTo(name: String, value: String): Boolean = propOrNull(name) == value
48-
def propOrElse(name: String, alt: String): String = System.getProperty(name, alt)
48+
def propOrElse(name: String, alt: => String): String = Option(System.getProperty(name)).getOrElse(alt)
4949
def propOrEmpty(name: String): String = propOrElse(name, "")
5050
def propOrNull(name: String): String = propOrElse(name, null)
5151
def propOrNone(name: String): Option[String] = Option(propOrNull(name))
5252
def propOrFalse(name: String): Boolean = propOrNone(name) exists (x => List("yes", "on", "true") contains x.toLowerCase)
5353
def setProp(name: String, value: String): String = System.setProperty(name, value)
5454
def clearProp(name: String): String = System.clearProperty(name)
5555

56-
def envOrElse(name: String, alt: String): String = Option(System getenv name) getOrElse alt
56+
def envOrElse(name: String, alt: => String): String = Option(System getenv name) getOrElse alt
5757
def envOrNone(name: String): Option[String] = Option(System getenv name)
5858

5959
// for values based on propFilename
60-
def scalaPropOrElse(name: String, alt: String): String = scalaProps.getProperty(name, alt)
60+
def scalaPropOrElse(name: String, alt: => String): String = scalaProps.getProperty(name, alt)
6161
def scalaPropOrEmpty(name: String): String = scalaPropOrElse(name, "")
6262
def scalaPropOrNone(name: String): Option[String] = Option(scalaProps.getProperty(name))
6363

compiler/src/dotty/tools/dotc/config/WrappedProperties.scala

+6-6
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ trait WrappedProperties extends PropertiesTrait {
1414
protected def propCategory: String = "wrapped"
1515
protected def pickJarBasedOn: Class[?] = this.getClass
1616

17-
override def propIsSet(name: String): Boolean = wrap(super.propIsSet(name)) exists (x => x)
18-
override def propOrElse(name: String, alt: String): String = wrap(super.propOrElse(name, alt)) getOrElse alt
19-
override def setProp(name: String, value: String): String = wrap(super.setProp(name, value)).orNull
20-
override def clearProp(name: String): String = wrap(super.clearProp(name)).orNull
21-
override def envOrElse(name: String, alt: String): String = wrap(super.envOrElse(name, alt)) getOrElse alt
22-
override def envOrNone(name: String): Option[String] = wrap(super.envOrNone(name)).flatten
17+
override def propIsSet(name: String): Boolean = wrap(super.propIsSet(name)) exists (x => x)
18+
override def propOrElse(name: String, alt: => String): String = wrap(super.propOrElse(name, alt)) getOrElse alt
19+
override def setProp(name: String, value: String): String = wrap(super.setProp(name, value)).orNull
20+
override def clearProp(name: String): String = wrap(super.clearProp(name)).orNull
21+
override def envOrElse(name: String, alt: => String): String = wrap(super.envOrElse(name, alt)) getOrElse alt
22+
override def envOrNone(name: String): Option[String] = wrap(super.envOrNone(name)).flatten
2323

2424
def systemProperties: Iterator[(String, String)] = {
2525
import scala.jdk.CollectionConverters.*
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package dotty.tools.dotc.config
2+
3+
import org.junit.Before
4+
import org.junit.Test
5+
import org.junit.Assert._
6+
import scala.language.unsafeNulls
7+
8+
class PropertiesTest {
9+
final val TestProperty = "dotty.tools.dotc.config.PropertiesTest.__test_property__"
10+
11+
@Before
12+
def beforeEach(): Unit = {
13+
Properties.clearProp(TestProperty)
14+
}
15+
16+
@Test
17+
def testPropOrNone(): Unit = {
18+
assertEquals(Properties.propOrNone(TestProperty), None)
19+
20+
Properties.setProp(TestProperty, "foo")
21+
22+
assertEquals(Properties.propOrNone(TestProperty), Some("foo"))
23+
}
24+
25+
@Test
26+
def testPropOrElse(): Unit = {
27+
assertEquals(Properties.propOrElse(TestProperty, "bar"), "bar")
28+
29+
Properties.setProp(TestProperty, "foo")
30+
31+
var done = false
32+
assertEquals(Properties.propOrElse(TestProperty, { done = true; "bar" }), "foo")
33+
assertFalse("Does not evaluate alt if not needed", done)
34+
}
35+
36+
@Test
37+
def testEnvOrElse(): Unit = {
38+
assertEquals(Properties.envOrElse("_PropertiesTest_NOT_DEFINED", "test"), "test")
39+
40+
var done = false
41+
val envName = System.getenv().keySet().iterator().next()
42+
assertNotEquals(Properties.envOrElse(envName, {done = true; "bar"}), "bar")
43+
assertFalse("Does not evaluate alt if not needed", done)
44+
}
45+
}

0 commit comments

Comments
 (0)