KJS: don't copy members from native interfaces

This commit is contained in:
Zalim Bashorov
2016-11-16 23:27:09 +03:00
parent 01d10a9592
commit e1248f8f0b
3 changed files with 26 additions and 1 deletions
@@ -3437,6 +3437,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
doTest(fileName);
}
@TestMetadata("fromNativeInterface.kt")
public void testFromNativeInterface() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inheritance/fromNativeInterface.kt");
doTest(fileName);
}
@TestMetadata("inheritFromCharIterator.kt")
public void testInheritFromCharIterator() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inheritance/inheritFromCharIterator.kt");
@@ -22,6 +22,7 @@ import com.google.dart.compiler.backend.js.ast.JsNameRef
import org.jetbrains.kotlin.backend.common.bridges.generateBridgesForFunctionDescriptor
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.js.translate.context.StaticContext
import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils.isNativeObject
import org.jetbrains.kotlin.js.translate.utils.JsAstUtils
import org.jetbrains.kotlin.js.translate.utils.JsAstUtils.prototypeOf
import org.jetbrains.kotlin.js.translate.utils.JsAstUtils.pureFqn
@@ -43,6 +44,9 @@ class InterfaceFunctionCopier(val context: StaticContext) {
}
private fun addInterfaceDefaultMembers(descriptor: ClassDescriptor, context: StaticContext) {
// optimization: don't do anything for native declarations
if (isNativeObject(descriptor)) return
val classModel = ClassModel(descriptor)
classModels[descriptor] = classModel
@@ -60,7 +64,7 @@ class InterfaceFunctionCopier(val context: StaticContext) {
}
val superModels = DescriptorUtils.getSuperclassDescriptors(descriptor)
.filter { it.kind == ClassKind.INTERFACE }
.filter { it.kind == ClassKind.INTERFACE && !isNativeObject(it) }
.map { classModels[it]!! }
for (superModel in superModels) {
for (name in superModel.copiedFunctions) {
@@ -0,0 +1,15 @@
package foo
@native
interface A {
val bar: Int get() = noImpl
fun foo(): String = noImpl
}
class C : A
fun box(): String {
val c = C()
return "OK"
}