8000 Merge pull request #4425 from sjrd/dont-emit-abstract-members-in-js-c… · renowncoder/scala-js@ff0627a · GitHub
[go: up one dir, main page]

Skip to content

Commit ff0627a

Browse files
authored
Merge pull request scala-js#4425 from sjrd/dont-emit-abstract-members-in-js-classes
Fix scala-js#4409: Do not emit abstract methods in non-native JS classes.
2 parents 3906487 + 294efab commit ff0627a

File tree

3 files changed

+40
-4
lines changed

3 files changed

+40
-4
lines changed

compiler/src/main/scala/org/scalajs/nscplugin/GenJSCode.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1820,11 +1820,16 @@ abstract class GenJSCode[G <: Global with Singleton](val global: G)
18201820
val methodName = encodeMethodSym(sym)
18211821
val originalName = originalNameOfMethod(sym)
18221822

1823+
val isAbstract = isAbstractMethod(dd)
1824+
18231825
def jsParams = params.map(genParamDef(_))
18241826

18251827
if (scalaPrimitives.isPrimitive(sym)) {
18261828
None
1827-
} else if (isAbstractMethod(dd)) {
1829+
} else if (isAbstract && isNonNativeJSClass(currentClassSym)) {
1830+
// #4409: Do not emit abstract methods in non-native JS classes
1831+
None
1832+
} else if (isAbstract) {
18281833
val body = if (scalaUsesImplClasses &&
18291834
sym.hasAnnotation(JavaDefaultMethodAnnotation)) {
18301835
/* For an interface method with @JavaDefaultMethod, make it a

ir/shared/src/main/scala/org/scalajs/ir/InvalidIRException.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,5 @@
1212

1313
package org.scalajs.ir
1414

15-
class InvalidIRException(val tree: Trees.Tree, message: String)
15+
class InvalidIRException(val tree: Trees.IRNode, message: String)
1616
extends Exception(message)

ir/shared/src/main/scala/org/scalajs/ir/Serializers.scala

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1349,8 +1349,39 @@ object Serializers {
13491349
}
13501350
}
13511351

1352-
def readMemberDefs(owner: ClassName, ownerKind: ClassKind): List[MemberDef] =
1353-
List.fill(readInt())(readMemberDef(owner, ownerKind))
1352+
def readMemberDefs(owner: ClassName, ownerKind: ClassKind): List[MemberDef] = {
1353+
val memberDefs = List.fill(readInt())(readMemberDef(owner, ownerKind))
1354+
1355+
// #4409: Filter out abstract methods in non-native JS classes for version < 1.5
1356+
if (ownerKind.isJSClass) {
1357+
if (hacks.use14) {
1358+
memberDefs.filter { m =>
1359+
m match {
1360+
case MethodDef(_, _, _, _, _, None) => false
1361+
case _ => true
1362+
}
1363+
}
1364+
} else {
1365+
/* #4388 This check should be moved to a link-time check dependent on
1366+
* `checkIR`, but currently we only have the post-BaseLinker IR
1367+
* checker, at which points those methods have already been
1368+
* eliminated.
1369+
*/
1370+
for (m <- memberDefs) {
1371+
m match {
1372+
case MethodDef(_, _, _, _, _, None) =>
1373+
throw new InvalidIRException(m,
1374+
"Invalid abstract method in non-native JS class")
1375+
case _ =>
1376+
// ok
1377+
}
1378+
}
1379+
memberDefs
1380+
}
1381+
} else {
1382+
memberDefs
1383+
}
1384+
}
13541385

13551386
def readTopLevelExportDef(owner: ClassName,
13561387
ownerKind: ClassKind): TopLevelExportDef = {

0 commit comments

Comments
 (0)
0