Skip to content

Commit c5620ef

Browse files
authored
Merge pull request scala#9682 from retronym/topic/jdk-11
2 parents d97376b + 9ced62e commit c5620ef

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+640
-564
lines changed

build.sbt

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,13 @@ lazy val bench = project.in(file("test") / "benchmarks")
669669
scalacOptions ++= Seq("-feature", "-opt:l:inline", "-opt-inline-from:scala/**", "-opt-warnings"),
670670
).settings(inConfig(JmhPlugin.JmhKeys.Jmh)(scalabuild.JitWatchFilePlugin.jitwatchSettings))
671671

672+
// Jigsaw: reflective access between modules (`setAccessible(true)`) requires an `opens` directive.
673+
// This is enforced by error (not just by warning) since JDK 16. In our tests we use reflective access
674+
// from the unnamed package (the classpath) to JDK modules in testing utilities like `assertNotReachable`.
675+
// `add-exports=jdk.jdeps/com.sun.tools.javap` is tests that use `:javap` in the REPL, see scala/bug#12378
676+
val addOpensForTesting = "-XX:+IgnoreUnrecognizedVMOptions" +: "--add-exports=jdk.jdeps/com.sun.tools.javap=ALL-UNNAMED" +:
677+
Seq("java.util.concurrent.atomic", "java.lang", "java.lang.reflect", "java.net").map(p => s"--add-opens=java.base/$p=ALL-UNNAMED")
678+
672679
lazy val junit = project.in(file("test") / "junit")
673680
.dependsOn(library, reflect, compiler, partest, scaladoc)
674681
.settings(clearSourceAndResourceDirectories)
@@ -677,7 +684,7 @@ lazy val junit = project.in(file("test") / "junit")
677684
.settings(disablePublishing)
678685
.settings(
679686
fork in Test := true,
680-
javaOptions in Test += "-Xss1M",
687+
javaOptions in Test ++= "-Xss1M" +: addOpensForTesting,
681688
(forkOptions in Test) := (forkOptions in Test).value.withWorkingDirectory((baseDirectory in ThisBuild).value),
682689
(forkOptions in Test in testOnly) := (forkOptions in Test in testOnly).value.withWorkingDirectory((baseDirectory in ThisBuild).value),
683690
libraryDependencies ++= Seq(junitDep, junitInterfaceDep, jolDep),
@@ -695,7 +702,7 @@ lazy val scalacheck = project.in(file("test") / "scalacheck")
695702
.settings(
696703
// enable forking to workaround https://github.com/sbt/sbt/issues/4009
697704
fork in Test := true,
698-
javaOptions in Test += "-Xss1M",
705+
javaOptions in Test ++= "-Xss1M" +: addOpensForTesting,
699706
testOptions ++= {
700707
if ((fork in Test).value) Nil
701708
else List(Tests.Cleanup { loader =>
@@ -712,11 +719,11 @@ lazy val scalacheck = project.in(file("test") / "scalacheck")
712719

713720
lazy val osgiTestFelix = osgiTestProject(
714721
project.in(file(".") / "target" / "osgiTestFelix"),
715-
"org.apache.felix" % "org.apache.felix.framework" % "5.0.1")
722+
"org.apache.felix" % "org.apache.felix.framework" % "5.6.10")
716723

717724
lazy val osgiTestEclipse = osgiTestProject(
718725
project.in(file(".") / "target" / "osgiTestEclipse"),
719-
"org.eclipse.tycho" % "org.eclipse.osgi" % "3.10.100.v20150521-1310")
726+
"org.eclipse.tycho" % "org.eclipse.osgi" % "3.13.0.v20180226-1711")
720727

721728
def osgiTestProject(p: Project, framework: ModuleID) = p
722729
.dependsOn(library, reflect, compiler)
@@ -728,7 +735,7 @@ def osgiTestProject(p: Project, framework: ModuleID) = p
728735
fork in Test := true,
729736
parallelExecution in Test := false,
730737
libraryDependencies ++= {
731-
val paxExamVersion = "4.5.0" // Last version which supports Java 6
738+
val paxExamVersion = "4.11.0" // Last version which supports Java 9+
732739
Seq(
733740
junitDep,
734741
junitInterfaceDep,
@@ -744,8 +751,9 @@ def osgiTestProject(p: Project, framework: ModuleID) = p
744751
)
745752
},
746753
Keys.test in Test := (Keys.test in Test).dependsOn(packageBin in Compile).value,
754+
Keys.testOnly in Test := (Keys.testOnly in Test).dependsOn(packageBin in Compile).evaluated,
747755
testOptions += Tests.Argument(TestFrameworks.JUnit, "-a", "-v", "-q"),
748-
javaOptions in Test += "-Dscala.bundle.dir=" + (buildDirectory in ThisBuild).value / "osgi",
756+
javaOptions in Test ++= ("-Dscala.bundle.dir=" + (buildDirectory in ThisBuild).value / "osgi") +: addOpensForTesting,
749757
(forkOptions in Test in test) := (forkOptions in Test in test).value.withWorkingDirectory((baseDirectory in ThisBuild).value),
750758
unmanagedSourceDirectories in Test := List((baseDirectory in ThisBuild).value / "test" / "osgi" / "src"),
751759
unmanagedResourceDirectories in Compile := (unmanagedSourceDirectories in Test).value,
@@ -797,10 +805,10 @@ lazy val test = project
797805
// enable this in 2.13, when tests pass
798806
//scalacOptions in Compile += "-Yvalidate-pos:parser,typer",
799807
scalacOptions in Compile -= "-Ywarn-unused:imports",
800-
javaOptions in IntegrationTest ++= List("-Xmx2G", "-Dpartest.exec.in.process=true", "-Dfile.encoding=UTF-8", "-Duser.language=en", "-Duser.country=US"),
808+
javaOptions in IntegrationTest ++= List("-Xmx2G", "-Dpartest.exec.in.process=true", "-Dfile.encoding=UTF-8", "-Duser.language=en", "-Duser.country=US") ++ addOpensForTesting,
801809
testOptions in IntegrationTest += Tests.Argument("-Dfile.encoding=UTF-8", "-Duser.language=en", "-Duser.country=US"),
802810
testFrameworks += new TestFramework("scala.tools.partest.sbt.Framework"),
803-
testOptions in IntegrationTest += Tests.Argument("-Dpartest.java_opts=-Xmx1024M -Xms64M"),
811+
testOptions in IntegrationTest += Tests.Argument(s"""-Dpartest.java_opts=-Xmx1024M -Xms64M ${addOpensForTesting.mkString(" ")}"""),
804812
testOptions in IntegrationTest += Tests.Argument("-Dpartest.scalac_opts=" + (scalacOptions in Compile).value.mkString(" ")),
805813
(forkOptions in IntegrationTest) := (forkOptions in IntegrationTest).value.withWorkingDirectory((baseDirectory in ThisBuild).value),
806814
testOptions in IntegrationTest += {

project/MimaFilters.scala

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,19 @@ object MimaFilters extends AutoPlugin {
1919
val mimaFilters: Seq[ProblemFilter] = Seq[ProblemFilter](
2020
// KEEP: scala.reflect.internal isn't public API
2121
ProblemFilters.exclude[Problem]("scala.reflect.internal.*"),
22+
23+
// KEEP: java.util.Enumeration.asIterator only exists in later JDK versions (11 at least). If you build
24+
// with JDK 11 and run MiMa it'll complain IteratorWrapper isn't forwards compatible with 2.13.0 - but we
25+
// don't publish the artifact built with JDK 11 anyways
26+
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.convert.Wrappers#IteratorWrapper.asIterator"),
27+
28+
// KEEP: when building on a recent JDK, classes implementing `CharSequence` get a mixin forwarder for
29+
// the `isEmpty` default method that was added in JDK 15
30+
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.Predef#SeqCharSequence.isEmpty"),
31+
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.runtime.SeqCharSequence.isEmpty"),
32+
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.Predef#ArrayCharSequence.isEmpty"),
33+
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.runtime.ArrayCharSequence.isEmpty"),
34+
2235
)
2336

2437
override val buildSettings = Seq(

src/compiler/scala/tools/nsc/backend/jvm/opt/BytecodeUtils.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ package scala.tools.nsc
1414
package backend.jvm
1515
package opt
1616

17-
import scala.annotation.{switch, tailrec}
17+
import scala.annotation.{tailrec, switch}
1818
import scala.collection.JavaConverters._
1919
import scala.reflect.internal.util.Collections._
2020
import scala.tools.asm.Opcodes._

test/files/jvm/annotations.check

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#partest java8
12
Test_2.scala:8: warning: class remote in package scala is deprecated (since 2.12.0): extend java.rmi.Remote instead and add @throws[java.rmi.RemoteException] to public methods
23
def foo: Unit = ()
34
^
@@ -65,3 +66,71 @@ public void Test4$Foo12.name_$eq(java.lang.String)
6566
99
6667
dylan
6768
2
69+
#partest !java8
70+
Test_2.scala:8: warning: class remote in package scala is deprecated (since 2.12.0): extend java.rmi.Remote instead and add @throws[java.rmi.RemoteException] to public methods
71+
def foo: Unit = ()
72+
^
73+
class java.rmi.RemoteException
74+
class java.io.IOException
75+
@java.lang.Deprecated(forRemoval=false, since="")
76+
@test.SourceAnnotation_1(mails={[email protected],[email protected]}, value=http://scala-lang.org)
77+
class Test4$Foo1
78+
79+
@test.SourceAnnotation_1(mails={[email protected]}, value=http://bloodsuckers.com)
80+
class Test4$Foo2
81+
82+
@test.SourceAnnotation_1(mails={[email protected]}, value=http://bloodsuckers.com)
83+
class Test4$Foo3
84+
85+
@test.SourceAnnotation_1(mails={[email protected]}, value=file:///dev/null)
86+
private final int Test4$Foo4.x
87+
88+
@test.SourceAnnotation_1(mails={[email protected]}, value=file:///dev/zero)
89+
public int Test4$Foo5.bar()
90+
91+
@test.SourceAnnotation_1(mails={[email protected]}, value=primary constructor)
92+
public Test4$Foo6(java.lang.String)
93+
94+
@test.SourceAnnotation_1(mails={[email protected]}, value=secondary constructor)
95+
public Test4$Foo7()
96+
97+
@test.SourceAnnotation_1(mails={[email protected]}, value=constructor val)
98+
public Test4$Foo8(int)
99+
100+
@test.SourceAnnotation_1(mails={[email protected]}, value=http://eppli.com)
101+
private int Test4$Foo9.z
102+
103+
@test.SourceAnnotation_1(mails={[email protected]}, value=http://eppli.com)
104+
private int Test4$Foo9.z2
105+
106+
@test.SourceAnnotation_1(mails={[email protected]}, value=http://eppli.com)
107+
private int Test4$Foo9.z3
108+
109+
@test.SourceAnnotation_1(mails={[email protected]}, value=http://eppli.com)
110+
public int Test4$Foo9.getZ()
111+
112+
@test.SourceAnnotation_1(mails={[email protected]}, value=http://eppli.com)
113+
public int Test4$Foo9.getZ2()
114+
115+
@test.SourceAnnotation_1(mails={[email protected]}, value=http://eppli.com)
116+
public int Test4$Foo9.getZ3()
117+
118+
@test.SourceAnnotation_1(mails={[email protected]}, value=http://apple.com)
119+
public int Test4$Foo9.x()
120+
121+
@test.SourceAnnotation_1(mails={[email protected]}, value=http://uppla.com)
122+
public void Test4$Foo9.setY(int)
123+
124+
@test.SourceAnnotation_1(mails={[email protected]}, value=on param 1)
125+
public Test4$Foo10(java.lang.String)
126+
127+
@test.SourceAnnotation_1(mails={[email protected]}, value=on param 2)
128+
private final java.lang.String Test4$Foo11.name
129+
130+
@test.SourceAnnotation_1(mails={[email protected]}, value=on param 3)
131+
public void Test4$Foo12.name_$eq(java.lang.String)
132+
133+
0
134+
99
135+
dylan
136+
2

test/files/jvm/annotations/Test_2.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// scalac: -deprecation
2-
2+
import scala.tools.partest.Util.ArrayDeep
33
import scala.language.{ higherKinds, reflectiveCalls }
44

55
object Test1 {
@@ -181,7 +181,7 @@ object Test5 {
181181
getClass().getMethod("setCount", classOf[Integer])
182182

183183
def get = getter.invoke(this).asInstanceOf[Integer].intValue
184-
def set(n: Int) = setter.invoke(this, new Integer(n))
184+
def set(n: Int) = setter.invoke(this, Integer.valueOf(n))
185185
}
186186
def run {
187187
val count = new Count

test/files/jvm/javaReflection.check

Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#partest java8
12
A / A (canon) / A (simple)
23
- declared cls: List(class A$B, interface A$C, class A$D$)
34
- enclosing : null (declaring cls) / null (cls) / null (constr) / null (meth)
@@ -166,3 +167,190 @@ T / T (canon) / T (simple)
166167
- declared cls: List()
167168
- enclosing : null (declaring cls) / null (cls) / null (constr) / null (meth)
168169
- properties : false (local) / false (member)
170+
#partest !java8
171+
A / A (canon) / A (simple)
172+
- declared cls: List(class A$B, interface A$C, class A$D$)
173+
- enclosing : null (declaring cls) / null (cls) / null (constr) / null (meth)
174+
- properties : false (local) / false (member)
175+
A$$anon$2 / null (canon) / (simple)
176+
- declared cls: List()
177+
- enclosing : null (declaring cls) / class A (cls) / null (constr) / null (meth)
178+
- properties : false (local) / false (member)
179+
assert not class A$$anon$2 is anonymous
180+
assert not class A$$anon$2
181+
A$$anon$3 / null (canon) / (simple)
182+
- declared cls: List()
183+
- enclosing : null (declaring cls) / class A (cls) / null (constr) / public java.lang.Object A.f() (meth)
184+
- properties : false (local) / false (member)
185+
assert not class A$$anon$3 is anonymous
186+
assert not class A$$anon$3
187+
A$$anon$4 / null (canon) / (simple)
188+
- declared cls: List()
189+
- enclosing : null (declaring cls) / class A (cls) / null (constr) / public java.lang.Object A.f() (meth)
190+
- properties : false (local) / false (member)
191+
assert not class A$$anon$4 is anonymous
192+
assert not class A$$anon$4
193+
A$$anon$5 / null (canon) / (simple)
194+
- declared cls: List()
195+
- enclosing : null (declaring cls) / class A (cls) / null (constr) / null (meth)
196+
- properties : false (local) / false (member)
197+
assert not class A$$anon$5 is anonymous
198+
assert not class A$$anon$5
199+
A$$anon$6 / null (canon) / (simple)
200+
- declared cls: List()
201+
- enclosing : null (declaring cls) / class A (cls) / null (constr) / null (meth)
202+
- properties : false (local) / false (member)
203+
assert not class A$$anon$6 is anonymous
204+
assert not class A$$anon$6
205+
A$$anon$7 / null (canon) / (simple)
206+
- declared cls: List()
207+
- enclosing : null (declaring cls) / class A (cls) / public A(int) (constr) / null (meth)
208+
- properties : false (local) / false (member)
209+
assert not class A$$anon$7 is anonymous
210+
assert not class A$$anon$7
211+
A$B / A.B (canon) / B (simple)
212+
- declared cls: List()
213+
- enclosing : class A (declaring cls) / class A (cls) / null (constr) / null (meth)
214+
- properties : false (local) / true (member)
215+
A$C / A.C (canon) / C (simple)
216+
- declared cls: List()
217+
- enclosing : class A (declaring cls) / class A (cls) / null (constr) / null (meth)
218+
- properties : false (local) / true (member)
219+
A$D$ / A.D$ (canon) / D$ (simple)
220+
- declared cls: List(class A$D$B, interface A$D$C, class A$D$D$)
221+
- enclosing : class A (declaring cls) / class A (cls) / null (constr) / null (meth)
222+
- properties : false (local) / true (member)
223+
A$D$$anon$1 / null (canon) / (simple)
224+
- declared cls: List()
225+
- enclosing : null (declaring cls) / class A$D$ (cls) / null (constr) / null (meth)
226+
- properties : false (local) / false (member)
227+
assert not class A$D$$anon$1 is anonymous
228+
assert not class A$D$$anon$1
229+
A$D$B / A.D$.B (canon) / B (simple)
230+
- declared cls: List()
231+
- enclosing : class A$D$ (declaring cls) / class A$D$ (cls) / null (constr) / null (meth)
232+
- properties : false (local) / true (member)
233+
A$D$C / A.D$.C (canon) / C (simple)
234+
- declared cls: List()
235+
- enclosing : class A$D$ (declaring cls) / class A$D$ (cls) / null (constr) / null (meth)
236+
- properties : false (local) / true (member)
237+
A$D$D$ / A.D$.D$ (canon) / D$ (simple)
238+
- declared cls: List()
239+
- enclosing : class A$D$ (declaring cls) / class A$D$ (cls) / null (constr) / null (meth)
240+
- properties : false (local) / true (member)
241+
A$D$KB$1 / null (canon) / KB$1 (simple)
242+
- declared cls: List()
243+
- enclosing : null (declaring cls) / class A$D$ (cls) / null (constr) / public void A$D$.f() (meth)
244+
- properties : true (local) / false (member)
245+
A$E$1 / null (canon) / E$1 (simple)
246+
- declared cls: List()
247+
- enclosing : null (declaring cls) / class A (cls) / null (constr) / public java.lang.Object A.f() (meth)
248+
- properties : true (local) / false (member)
249+
A$F$1 / null (canon) / F$1 (simple)
250+
- declared cls: List()
251+
- enclosing : null (declaring cls) / class A (cls) / null (constr) / public java.lang.Object A.f() (meth)
252+
- properties : true (local) / false (member)
253+
A$G$1$ / null (canon) / G$1$ (simple)
254+
- declared cls: List()
255+
- enclosing : null (declaring cls) / class A (cls) / null (constr) / public java.lang.Object A.f() (meth)
256+
- properties : true (local) / false (member)
257+
A$H$1 / null (canon) / H$1 (simple)
258+
- declared cls: List()
259+
- enclosing : null (declaring cls) / class A (cls) / null (constr) / public java.lang.Object A.f() (meth)
260+
- properties : true (local) / false (member)
261+
A$I$1 / null (canon) / I$1 (simple)
262+
- declared cls: List()
263+
- enclosing : null (declaring cls) / class A (cls) / null (constr) / public java.lang.Object A.f() (meth)
264+
- properties : true (local) / false (member)
265+
A$J$1$ / null (canon) / J$1$ (simple)
266+
- declared cls: List()
267+
- enclosing : null (declaring cls) / class A (cls) / null (constr) / public java.lang.Object A.f() (meth)
268+
- properties : true (local) / false (member)
269+
A$K$1 / null (canon) / K$1 (simple)
270+
- declared cls: List()
271+
- enclosing : null (declaring cls) / class A (cls) / null (constr) / null (meth)
272+
- properties : true (local) / false (member)
273+
A$L$1 / null (canon) / L$1 (simple)
274+
- declared cls: List()
275+
- enclosing : null (declaring cls) / class A (cls) / null (constr) / null (meth)
276+
- properties : true (local) / false (member)
277+
A$M$1$ / null (canon) / M$1$ (simple)
278+
- declared cls: List()
279+
- enclosing : null (declaring cls) / class A (cls) / null (constr) / null (meth)
280+
- properties : true (local) / false (member)
281+
A$N$1 / null (canon) / N$1 (simple)
282+
- declared cls: List()
283+
- enclosing : null (declaring cls) / class A (cls) / null (constr) / null (meth)
284+
- properties : true (local) / false (member)
285+
A$O$1 / null (canon) / O$1 (simple)
286+
- declared cls: List()
287+
- enclosing : null (declaring cls) / class A (cls) / null (constr) / null (meth)
288+
- properties : true (local) / false (member)
289+
A$P$1$ / null (canon) / P$1$ (simple)
290+
- declared cls: List()
291+
- enclosing : null (declaring cls) / class A (cls) / null (constr) / null (meth)
292+
- properties : true (local) / false (member)
293+
A$Q$1 / null (canon) / Q$1 (simple)
294+
- declared cls: List()
295+
- enclosing : null (declaring cls) / class A (cls) / public A(int) (constr) / null (meth)
296+
- properties : true (local) / false (member)
297+
A$R$1 / null (canon) / R$1 (simple)
298+
- declared cls: List()
299+
- enclosing : null (declaring cls) / class A (cls) / public A(int) (constr) / null (meth)
300+
- properties : true (local) / false (member)
301+
A$S$1$ / null (canon) / S$1$ (simple)
302+
- declared cls: List()
303+
- enclosing : null (declaring cls) / class A (cls) / public A(int) (constr) / null (meth)
304+
- properties : true (local) / false (member)
305+
AO / AO (canon) / AO (simple)
306+
- declared cls: List(class AO$B, interface AO$C, class AO$D$)
307+
- enclosing : null (declaring cls) / null (cls) / null (constr) / null (meth)
308+
- properties : false (local) / false (member)
309+
AO$ / AO$ (canon) / AO$ (simple)
310+
- declared cls: List()
311+
- enclosing : null (declaring cls) / null (cls) / null (constr) / null (meth)
312+
- properties : false (local) / false (member)
313+
AO$$anon$8 / null (canon) / (simple)
314+
- declared cls: List()
315+
- enclosing : null (declaring cls) / class AO$ (cls) / null (constr) / null (meth)
316+
- properties : false (local) / false (member)
317+
assert not class AO$$anon$8 is anonymous
318+
assert not class AO$$anon$8
319+
AO$B / AO.B (canon) / B (simple)
320+
- declared cls: List()
321+
- enclosing : class AO (declaring cls) / class AO (cls) / null (constr) / null (meth)
322+
- properties : false (local) / true (member)
323+
AO$C / AO.C (canon) / C (simple)
324+
- declared cls: List()
325+
- enclosing : class AO (declaring cls) / class AO (cls) / null (constr) / null (meth)
326+
- properties : false (local) / true (member)
327+
AO$D$ / AO.D$ (canon) / D$ (simple)
328+
- declared cls: List()
329+
- enclosing : class AO (declaring cls) / class AO (cls) / null (constr) / null (meth)
330+
- properties : false (local) / true (member)
331+
AT / AT (canon) / AT (simple)
332+
- declared cls: List(class AT$B, interface AT$C, class AT$D$)
333+
- enclosing : null (declaring cls) / null (cls) / null (constr) / null (meth)
334+
- properties : false (local) / false (member)
335+
AT$$anon$9 / null (canon) / (simple)
336+
- declared cls: List()
337+
- enclosing : null (declaring cls) / interface AT (cls) / null (constr) / null (meth)
338+
- properties : false (local) / false (member)
339+
assert not class AT$$anon$9 is anonymous
340+
assert not class AT$$anon$9
341+
AT$B / AT.B (canon) / B (simple)
342+
- declared cls: List()
343+
- enclosing : interface AT (declaring cls) / interface AT (cls) / null (constr) / null (meth)
344+
- properties : false (local) / true (member)
345+
AT$C / AT.C (canon) / C (simple)
346+
- declared cls: List()
347+
- enclosing : interface AT (declaring cls) / interface AT (cls) / null (constr) / null (meth)
348+
- properties : false (local) / true (member)
349+
AT$D$ / AT.D$ (canon) / D$ (simple)
350+
- declared cls: List()
351+
- enclosing : interface AT (declaring cls) / interface AT (cls) / null (constr) / null (meth)
352+
- properties : false (local) / true (member)
353+
T / T (canon) / T (simple)
354+
- declared cls: List()
355+
- enclosing : null (declaring cls) / null (cls) / null (constr) / null (meth)
356+
- properties : false (local) / false (member)

0 commit comments

Comments
 (0)