Skip to content

Commit 613cd6d

Browse files
committed
Apply the IR cleaner to the scalalib and the library-aux.
It is configured differently than for the javalib. We allow references to `scala.*` (obviously) but disallow references to `scala.scalajs.*`. We also avoid rewriting Scala functions to JS functions, since that changes the binary APIs. We use a local copy of `sjs.runtime.AnonFunctionN` classes in `scala.runtime.*` to support the codegen of lambdas.
1 parent 721dcab commit 613cd6d

File tree

3 files changed

+200
-25
lines changed

3 files changed

+200
-25
lines changed

project/Build.scala

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -571,9 +571,9 @@ object Build {
571571
}
572572
)
573573

574-
val cleanIRSettings = Def.settings(
574+
def cleanIRSettings(forScalalib: Boolean): Seq[Setting[_]] = Def.settings(
575575
// In order to rewrite anonymous functions and tuples, the code must not be specialized
576-
scalacOptions += "-no-specialization",
576+
scalacOptions ++= (if (forScalalib) Nil else Seq("-no-specialization")),
577577

578578
products in Compile := {
579579
val s = streams.value
@@ -582,7 +582,7 @@ object Build {
582582

583583
val outputDir = crossTarget.value / "cleaned-classes"
584584

585-
val irCleaner = new JavalibIRCleaner((LocalRootProject / baseDirectory).value.toURI())
585+
val irCleaner = new JavalibIRCleaner((LocalRootProject / baseDirectory).value.toURI(), forScalalib)
586586

587587
val libFileMappings = (PathFinder(prevProducts) ** "*.sjsir")
588588
.pair(Path.rebase(prevProducts, outputDir))
@@ -1002,7 +1002,7 @@ object Build {
10021002
name := "Scala.js linker private library",
10031003
publishArtifact in Compile := false,
10041004
delambdafySetting,
1005-
cleanIRSettings
1005+
cleanIRSettings(forScalalib = false),
10061006
).withScalaJSCompiler2_12.withScalaJSJUnitPlugin2_12.dependsOnLibrary2_12.dependsOn(
10071007
jUnitRuntime.v2_12 % "test", testBridge.v2_12 % "test",
10081008
)
@@ -1319,7 +1319,7 @@ object Build {
13191319
Seq(output)
13201320
}.taskValue,
13211321

1322-
cleanIRSettings,
1322+
cleanIRSettings(forScalalib = false),
13231323

13241324
Compile / doc := {
13251325
val dir = (Compile / doc / target).value
@@ -1516,6 +1516,8 @@ object Build {
15161516

15171517
headerSources in Compile := Nil,
15181518
headerSources in Test := Nil,
1519+
1520+
cleanIRSettings(forScalalib = true),
15191521
).withScalaJSCompiler.dependsOnLibraryNoJar
15201522

15211523
lazy val libraryAux: MultiScalaProject = MultiScalaProject(
@@ -1531,6 +1533,8 @@ object Build {
15311533
delambdafySetting,
15321534

15331535
recompileAllOrNothingSettings,
1536+
1537+
cleanIRSettings(forScalalib = true),
15341538
).withScalaJSCompiler.dependsOnLibraryNoJar
15351539

15361540
lazy val library: MultiScalaProject = MultiScalaProject(

project/JavalibIRCleaner.scala

Lines changed: 57 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,13 @@ import sbt.{Logger, MessageOnlyException}
3939
* Afterwards, we check that the IR does not contain any reference to classes
4040
* under the `scala.*` package.
4141
*/
42-
final class JavalibIRCleaner(baseDirectoryURI: URI) {
42+
final class JavalibIRCleaner(baseDirectoryURI: URI, forScalalib: Boolean) {
4343
import JavalibIRCleaner._
4444

45+
private val classNameSubstitutions: Map[ClassName, ClassName] =
46+
if (forScalalib) ClassNameSubstitutionsForScalalib
47+
else ClassNameSubstitutionsForJavalib
48+
4549
def cleanIR(dependencyFiles: Seq[File], libFileMappings: Seq[(File, File)],
4650
logger: Logger): Set[File] = {
4751

@@ -80,11 +84,19 @@ final class JavalibIRCleaner(baseDirectoryURI: URI) {
8084
}
8185

8286
if (errorManager.hasErrors) {
83-
throw new MessageOnlyException(
84-
s"There were ${errorManager.errorCount} errors while " +
85-
"postprocessing the IR of the javalanglib. " +
86-
"The javalanglib must be written in a style that does not leak any " +
87-
"reference to the Scala library.")
87+
if (forScalalib) {
88+
throw new MessageOnlyException(
89+
s"There were ${errorManager.errorCount} errors while " +
90+
"postprocessing the IR of the scalalib. " +
91+
"The scalalib must be written in a style that does not leak any " +
92+
"reference to the Scala.js standard library.")
93+
} else {
94+
throw new MessageOnlyException(
95+
s"There were ${errorManager.errorCount} errors while " +
96+
"postprocessing the IR of the javalib. " +
97+
"The javalib must be written in a style that does not leak any " +
98+
"reference to the Scala library.")
99+
}
88100
}
89101

90102
resultBuilder.result()
@@ -149,11 +161,16 @@ final class JavalibIRCleaner(baseDirectoryURI: URI) {
149161
/* Remove the `private def writeReplace__O` generated by scalac 2.13+
150162
* in the companion of serializable classes.
151163
*/
152-
val newMemberDefs = memberDefs.filter {
153-
case MethodDef(_, MethodIdent(`writeReplaceMethodName`), _, _, _, _) =>
154-
false
155-
case _ =>
156-
true
164+
val newMemberDefs = if (forScalalib) {
165+
// Don't do it for the scalalib
166+
memberDefs
167+
} else {
168+
memberDefs.filter {
169+
case MethodDef(_, MethodIdent(`writeReplaceMethodName`), _, _, _, _) =>
170+
false
171+
case _ =>
172+
true
173+
}
157174
}
158175

159176
val preprocessedTree = ClassDef(name, originalName, kind, jsClassCaptures,
@@ -181,9 +198,13 @@ final class JavalibIRCleaner(baseDirectoryURI: URI) {
181198
/* Replace references to scala.Serializable by java.io.Serializable.
182199
* This works around the fact that scalac adds scala.Serializable to the
183200
* companion object of any class that extends java.io.Serializable.
201+
*
202+
* Don't do it for the scalalib.
184203
*/
185204

186-
if (!interfaces.exists(_.name == ScalaSerializable)) {
205+
if (forScalalib) {
206+
interfaces
207+
} else if (!interfaces.exists(_.name == ScalaSerializable)) {
187208
interfaces
188209
} else if (interfaces.exists(_.name == JavaIOSerializable)) {
189210
interfaces.filter(_.name != ScalaSerializable)
@@ -319,13 +340,13 @@ final class JavalibIRCleaner(baseDirectoryURI: URI) {
319340
implicit val pos = tree.pos
320341

321342
tree match {
322-
// new AnonFunctionN(closure) --> closure
323-
case New(AnonFunctionNClass(n), _, List(closure)) =>
343+
// javalib only: new AnonFunctionN(closure) --> closure
344+
case New(AnonFunctionNClass(n), _, List(closure)) if !forScalalib =>
324345
closure
325346

326-
// someFunctionN.apply(args) --> someFunctionN(args)
347+
// javalib only: someFunctionN.apply(args) --> someFunctionN(args)
327348
case Apply(ApplyFlags.empty, fun, MethodIdent(FunctionApplyMethodName(n)), args)
328-
if isFunctionNType(n, fun.tpe) =>
349+
if !forScalalib && isFunctionNType(n, fun.tpe) =>
329350
JSFunctionApply(fun, args)
330351

331352
// <= 2.12 : toJSVarArgs(jsArrayOps(jsArray).toSeq) -> jsArray
@@ -584,7 +605,7 @@ final class JavalibIRCleaner(baseDirectoryURI: URI) {
584605
}
585606

586607
private def transformClassName(cls: ClassName)(implicit pos: Position): ClassName = {
587-
ClassNameSubstitutions.getOrElse(cls, {
608+
classNameSubstitutions.getOrElse(cls, {
588609
validateClassName(cls)
589610
cls
590611
})
@@ -602,8 +623,13 @@ final class JavalibIRCleaner(baseDirectoryURI: URI) {
602623
def isAnException: Boolean =
603624
isJavaScriptExceptionWithinItself || isTypedArrayBufferBridgeWithinItself
604625

605-
if (cls.nameString.startsWith("scala.") && !isAnException)
606-
reportError(s"Illegal reference to Scala class ${cls.nameString}")
626+
if (forScalalib) {
627+
if (cls.nameString.startsWith("scala.scalajs."))
628+
reportError(s"Illegal reference to Scala.js class ${cls.nameString}")
629+
} else {
630+
if (cls.nameString.startsWith("scala.") && !isAnException)
631+
reportError(s"Illegal reference to Scala class ${cls.nameString}")
632+
}
607633
}
608634

609635
private def transformNonJSClassName(cls: ClassName)(implicit pos: Position): ClassName = {
@@ -731,7 +757,7 @@ object JavalibIRCleaner {
731757
false
732758
}
733759

734-
private val ClassNameSubstitutions: Map[ClassName, ClassName] = {
760+
private val ClassNameSubstitutionsForJavalib: Map[ClassName, ClassName] = {
735761
val functionTypePairs = for {
736762
funClass <- FunctionNClasses ++ AnonFunctionNClasses
737763
} yield {
@@ -764,4 +790,15 @@ object JavalibIRCleaner {
764790
val allPairs = functionTypePairs ++ refPairs ++ tuplePairs ++ otherPairs
765791
allPairs.toMap
766792
}
793+
794+
private val ClassNameSubstitutionsForScalalib: Map[ClassName, ClassName] = {
795+
val anonFunctionPairs = for {
796+
n <- (0 to 22).toList
797+
} yield {
798+
ClassName(s"scala.scalajs.runtime.AnonFunction$n") -> ClassName(s"scala.runtime.AnonFunction$n")
799+
}
800+
801+
val allPairs = anonFunctionPairs
802+
allPairs.toMap
803+
}
767804
}
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
/*
2+
* Scala.js (https://www.scala-js.org/)
3+
*
4+
* Copyright EPFL.
5+
*
6+
* Licensed under Apache License 2.0
7+
* (https://www.apache.org/licenses/LICENSE-2.0).
8+
*
9+
* See the NOTICE file distributed with this work for
10+
* additional information regarding copyright ownership.
11+
*/
12+
13+
package scala.runtime
14+
15+
import scala.scalajs.js
16+
17+
// scalastyle:off line.size.limit
18+
19+
@inline
20+
final class AnonFunction0[+R](f: js.Function0[R]) extends AbstractFunction0[R] {
21+
override def apply(): R = f()
22+
}
23+
24+
@inline
25+
final class AnonFunction1[-T1, +R](f: js.Function1[T1, R]) extends AbstractFunction1[T1, R] {
26+
override def apply(arg1: T1): R = f(arg1)
27+
}
28+
29+
@inline
30+
final class AnonFunction2[-T1, -T2, +R](f: js.Function2[T1, T2, R]) extends AbstractFunction2[T1, T2, R] {
31+
override def apply(arg1: T1, arg2: T2): R = f(arg1, arg2)
32+
}
33+
34+
@inline
35+
final class AnonFunction3[-T1, -T2, -T3, +R](f: js.Function3[T1, T2, T3, R]) extends AbstractFunction3[T1, T2, T3, R] {
36+
override def apply(arg1: T1, arg2: T2, arg3: T3): R = f(arg1, arg2, arg3)
37+
}
38+
39+
@inline
40+
final class AnonFunction4[-T1, -T2, -T3, -T4, +R](f: js.Function4[T1, T2, T3, T4, R]) extends AbstractFunction4[T1, T2, T3, T4, R] {
41+
override def apply(arg1: T1, arg2: T2, arg3: T3, arg4: T4): R = f(arg1, arg2, arg3, arg4)
42+
}
43+
44+
@inline
45+
final class AnonFunction5[-T1, -T2, -T3, -T4, -T5, +R](f: js.Function5[T1, T2, T3, T4, T5, R]) extends AbstractFunction5[T1, T2, T3, T4, T5, R] {
46+
override def apply(arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5): R = f(arg1, arg2, arg3, arg4, arg5)
47+
}
48+
49+
@inline
50+
final class AnonFunction6[-T1, -T2, -T3, -T4, -T5, -T6, +R](f: js.Function6[T1, T2, T3, T4, T5, T6, R]) extends AbstractFunction6[T1, T2, T3, T4, T5, T6, R] {
51+
override def apply(arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6): R = f(arg1, arg2, arg3, arg4, arg5, arg6)
52+
}
53+
54+
@inline
55+
final class AnonFunction7[-T1, -T2, -T3, -T4, -T5, -T6, -T7, +R](f: js.Function7[T1, T2, T3, T4, T5, T6, T7, R]) extends AbstractFunction7[T1, T2, T3, T4, T5, T6, T7, R] {
56+
override def apply(arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7): R = f(arg1, arg2, arg3, arg4, arg5, arg6, arg7)
57+
}
58+
59+
@inline
60+
final class AnonFunction8[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, +R](f: js.Function8[T1, T2, T3, T4, T5, T6, T7, T8, R]) extends AbstractFunction8[T1, T2, T3, T4, T5, T6, T7, T8, R] {
61+
override def apply(arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8): R = f(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)
62+
}
63+
64+
@inline
65+
final class AnonFunction9[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, -T9, +R](f: js.Function9[T1, T2, T3, T4, T5, T6, T7, T8, T9, R]) extends AbstractFunction9[T1, T2, T3, T4, T5, T6, T7, T8, T9, R] {
66+
override def apply(arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9): R = f(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
67+
}
68+
69+
@inline
70+
final class AnonFunction10[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, -T9, -T10, +R](f: js.Function10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R]) extends AbstractFunction10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R] {
71+
override def apply(arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, arg10: T10): R = f(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10)
72+
}
73+
74+
@inline
75+
final class AnonFunction11[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, -T9, -T10, -T11, +R](f: js.Function11[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R]) extends AbstractFunction11[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R] {
76+
override def apply(arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, arg10: T10, arg11: T11): R = f(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11)
77+
}
78+
79+
@inline
80+
final class AnonFunction12[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, -T9, -T10, -T11, -T12, +R](f: js.Function12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R]) extends AbstractFunction12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R] {
81+
override def apply(arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, arg10: T10, arg11: T11, arg12: T12): R = f(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12)
82+
}
83+
84+
@inline
85+
final class AnonFunction13[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, -T9, -T10, -T11, -T12, -T13, +R](f: js.Function13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R]) extends AbstractFunction13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R] {
86+
override def apply(arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, arg10: T10, arg11: T11, arg12: T12, arg13: T13): R = f(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13)
87+
}
88+
89+
@inline
90+
final class AnonFunction14[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, -T9, -T10, -T11, -T12, -T13, -T14, +R](f: js.Function14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R]) extends AbstractFunction14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R] {
91+
override def apply(arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, arg10: T10, arg11: T11, arg12: T12, arg13: T13, arg14: T14): R = f(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14)
92+
}
93+
94+
@inline
95+
final class AnonFunction15[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, -T9, -T10, -T11, -T12, -T13, -T14, -T15, +R](f: js.Function15[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R]) extends AbstractFunction15[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R] {
96+
override def apply(arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, arg10: T10, arg11: T11, arg12: T12, arg13: T13, arg14: T14, arg15: T15): R = f(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
97+
}
98+
99+
@inline
100+
final class AnonFunction16[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, -T9, -T10, -T11, -T12, -T13, -T14, -T15, -T16, +R](f: js.Function16[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R]) extends AbstractFunction16[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R] {
101+
override def apply(arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, arg10: T10, arg11: T11, arg12: T12, arg13: T13, arg14: T14, arg15: T15, arg16: T16): R = f(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16)
102+
}
103+
104+
@inline
105+
final class AnonFunction17[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, -T9, -T10, -T11, -T12, -T13, -T14, -T15, -T16, -T17, +R](f: js.Function17[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R]) extends AbstractFunction17[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R] {
106+
override def apply(arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, arg10: T10, arg11: T11, arg12: T12, arg13: T13, arg14: T14, arg15: T15, arg16: T16, arg17: T17): R = f(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17)
107+
}
108+
109+
@inline
110+
final class AnonFunction18[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, -T9, -T10, -T11, -T12, -T13, -T14, -T15, -T16, -T17, -T18, +R](f: js.Function18[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R]) extends AbstractFunction18[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R] {
111+
override def apply(arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, arg10: T10, arg11: T11, arg12: T12, arg13: T13, arg14: T14, arg15: T15, arg16: T16, arg17: T17, arg18: T18): R = f(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18)
112+
}
113+
114+
@inline
115+
final class AnonFunction19[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, -T9, -T10, -T11, -T12, -T13, -T14, -T15, -T16, -T17, -T18, -T19, +R](f: js.Function19[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R]) extends AbstractFunction19[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R] {
116+
override def apply(arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, arg10: T10, arg11: T11, arg12: T12, arg13: T13, arg14: T14, arg15: T15, arg16: T16, arg17: T17, arg18: T18, arg19: T19): R = f(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19)
117+
}
118+
119+
@inline
120+
final class AnonFunction20[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, -T9, -T10, -T11, -T12, -T13, -T14, -T15, -T16, -T17, -T18, -T19, -T20, +R](f: js.Function20[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R]) extends AbstractFunction20[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R] {
121+
override def apply(arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, arg10: T10, arg11: T11, arg12: T12, arg13: T13, arg14: T14, arg15: T15, arg16: T16, arg17: T17, arg18: T18, arg19: T19, arg20: T20): R = f(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20)
122+
}
123+
124+
@inline
125+
final class AnonFunction21[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, -T9, -T10, -T11, -T12, -T13, -T14, -T15, -T16, -T17, -T18, -T19, -T20, -T21, +R](f: js.Function21[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, R]) extends AbstractFunction21[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, R] {
126+
override def apply(arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, arg10: T10, arg11: T11, arg12: T12, arg13: T13, arg14: T14, arg15: T15, arg16: T16, arg17: T17, arg18: T18, arg19: T19, arg20: T20, arg21: T21): R = f(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21)
127+
}
128+
129+
@inline
130+
final class AnonFunction22[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, -T9, -T10, -T11, -T12, -T13, -T14, -T15, -T16, -T17, -T18, -T19, -T20, -T21, -T22, +R](f: js.Function22[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, R]) extends AbstractFunction22[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, R] {
131+
override def apply(arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, arg10: T10, arg11: T11, arg12: T12, arg13: T13, arg14: T14, arg15: T15, arg16: T16, arg17: T17, arg18: T18, arg19: T19, arg20: T20, arg21: T21, arg22: T22): R = f(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22)
132+
}
133+
134+
// scalastyle:on line.size.limit

0 commit comments

Comments
 (0)