KJS: trait -> interface
This commit is contained in:
@@ -16,9 +16,8 @@
|
|||||||
|
|
||||||
Kotlin.TYPE = {
|
Kotlin.TYPE = {
|
||||||
CLASS: "class",
|
CLASS: "class",
|
||||||
TRAIT: "trait",
|
INTERFACE: "interface",
|
||||||
OBJECT: "object",
|
OBJECT: "object"
|
||||||
INIT_FUN: "init fun"
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Kotlin.classCount = 0;
|
Kotlin.classCount = 0;
|
||||||
@@ -28,10 +27,6 @@ Kotlin.newClassIndex = function () {
|
|||||||
return tmp;
|
return tmp;
|
||||||
};
|
};
|
||||||
|
|
||||||
function isNativeClass(obj) {
|
|
||||||
return !(obj == null) && obj.$metadata$ == null;
|
|
||||||
}
|
|
||||||
|
|
||||||
Kotlin.callGetter = function (thisObject, klass, propertyName) {
|
Kotlin.callGetter = function (thisObject, klass, propertyName) {
|
||||||
var propertyDescriptor = Object.getOwnPropertyDescriptor(klass, propertyName);
|
var propertyDescriptor = Object.getOwnPropertyDescriptor(klass, propertyName);
|
||||||
if (propertyDescriptor != null) {
|
if (propertyDescriptor != null) {
|
||||||
@@ -64,20 +59,20 @@ Kotlin.callSetter = function (thisObject, klass, propertyName, value) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
function isInheritanceFromTrait(metadata, trait) {
|
function isInheritanceFromInterface(metadata, iface) {
|
||||||
// TODO: return this optimization
|
// TODO: return this optimization
|
||||||
/*if (metadata == null || metadata.classIndex < trait.$metadata$.classIndex) {
|
/*if (metadata == null || metadata.classIndex < iface.$metadata$.classIndex) {
|
||||||
return false;
|
return false;
|
||||||
}*/
|
}*/
|
||||||
var baseClasses = metadata.baseClasses;
|
var baseClasses = metadata.baseClasses;
|
||||||
var i;
|
var i;
|
||||||
for (i = 0; i < baseClasses.length; i++) {
|
for (i = 0; i < baseClasses.length; i++) {
|
||||||
if (baseClasses[i] === trait) {
|
if (baseClasses[i] === iface) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (i = 0; i < baseClasses.length; i++) {
|
for (i = 0; i < baseClasses.length; i++) {
|
||||||
if (isInheritanceFromTrait(baseClasses[i].$metadata$, trait)) {
|
if (isInheritanceFromInterface(baseClasses[i].$metadata$, iface)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -120,26 +115,23 @@ Kotlin.isType = function (object, klass) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var klassMetadata = klass.$metadata$;
|
||||||
|
|
||||||
// In WebKit (JavaScriptCore) for some interfaces from DOM typeof returns "object", nevertheless they can be used in RHS of instanceof
|
// In WebKit (JavaScriptCore) for some interfaces from DOM typeof returns "object", nevertheless they can be used in RHS of instanceof
|
||||||
if (isNativeClass(klass)) {
|
if (klassMetadata == null) {
|
||||||
return object instanceof klass;
|
return object instanceof klass;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isTrait(klass) && object.constructor != null) {
|
if (klassMetadata.type === Kotlin.TYPE.INTERFACE && object.constructor != null) {
|
||||||
metadata = object.constructor.$metadata$;
|
metadata = object.constructor.$metadata$;
|
||||||
if (metadata != null) {
|
if (metadata != null) {
|
||||||
return isInheritanceFromTrait(metadata, klass);
|
return isInheritanceFromInterface(metadata, klass);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
function isTrait(klass) {
|
|
||||||
var metadata = klass.$metadata$;
|
|
||||||
return metadata != null && metadata.type === Kotlin.TYPE.TRAIT;
|
|
||||||
}
|
|
||||||
|
|
||||||
Kotlin.isNumber = function (a) {
|
Kotlin.isNumber = function (a) {
|
||||||
return typeof a == "number" || a instanceof Kotlin.Long;
|
return typeof a == "number" || a instanceof Kotlin.Long;
|
||||||
};
|
};
|
||||||
|
|||||||
+1
-1
@@ -173,7 +173,7 @@ class ClassTranslator private constructor(
|
|||||||
private fun addMetadataType() {
|
private fun addMetadataType() {
|
||||||
val kotlinType = JsNameRef("TYPE", Namer.KOTLIN_NAME)
|
val kotlinType = JsNameRef("TYPE", Namer.KOTLIN_NAME)
|
||||||
val typeRef = when {
|
val typeRef = when {
|
||||||
DescriptorUtils.isInterface(descriptor) -> JsNameRef("TRAIT", kotlinType)
|
DescriptorUtils.isInterface(descriptor) -> JsNameRef("INTERFACE", kotlinType)
|
||||||
DescriptorUtils.isObject(descriptor) -> JsNameRef("OBJECT", kotlinType)
|
DescriptorUtils.isObject(descriptor) -> JsNameRef("OBJECT", kotlinType)
|
||||||
else -> JsNameRef("CLASS", kotlinType)
|
else -> JsNameRef("CLASS", kotlinType)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user