From 0f6a6a3ba433695fbf31692017f90b955e5bf574 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Thu, 28 Apr 2016 17:15:54 +0300 Subject: [PATCH] JS/RTTI. Fix runtime checking against kotlin.CharSequence --- .../kotlin/js/patterns/typePredicates/typePredicates.kt | 2 +- .../org/jetbrains/kotlin/js/translate/context/Namer.java | 6 ++++++ .../kotlin/js/translate/expression/PatternTranslator.java | 2 ++ js/js.translator/testData/kotlin_lib.js | 8 +++++++- 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/patterns/typePredicates/typePredicates.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/patterns/typePredicates/typePredicates.kt index f438d1ceab3..2f0316ff4a3 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/patterns/typePredicates/typePredicates.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/patterns/typePredicates/typePredicates.kt @@ -20,7 +20,7 @@ import com.google.common.base.Predicate import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.types.KotlinType -interface TypePredicate : Predicate { +public interface TypePredicate : Predicate { override fun apply(type: KotlinType?): Boolean } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java index 6ed3a4a8f33..bf4bbdf899a 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java @@ -61,6 +61,7 @@ public final class Namer { public static final String PRIMITIVE_COMPARE_TO = "primitiveCompareTo"; public static final String IS_CHAR = "isChar"; public static final String IS_NUMBER = "isNumber"; + public static final String IS_CHAR_SEQUENCE = "isCharSequence"; public static final String CALLEE_NAME = "$fun"; @@ -412,6 +413,11 @@ public final class Namer { return kotlin("isComparable"); } + @NotNull + public JsExpression isCharSequence() { + return kotlin(IS_CHAR_SEQUENCE); + } + @NotNull private JsExpression invokeFunctionAndSetTypeCheckMetadata( @NotNull String functionName, diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/PatternTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/PatternTranslator.java index c8b553affef..032b16af7fb 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/PatternTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/PatternTranslator.java @@ -163,6 +163,8 @@ public final class PatternTranslator extends AbstractTranslator { if (isArray(type)) return Namer.IS_ARRAY_FUN_REF; + if (TypePredicatesKt.getCHAR_SEQUENCE().apply(type)) return namer().isCharSequence(); + if (TypePredicatesKt.getCOMPARABLE().apply(type)) return namer().isComparable(); return null; diff --git a/js/js.translator/testData/kotlin_lib.js b/js/js.translator/testData/kotlin_lib.js index f673c0b4578..d2a332043b0 100644 --- a/js/js.translator/testData/kotlin_lib.js +++ b/js/js.translator/testData/kotlin_lib.js @@ -17,6 +17,8 @@ (function (Kotlin) { "use strict"; + Kotlin.CharSequence = Kotlin.createTraitNow(null); + // Shims for String if (typeof String.prototype.startsWith === "undefined") { String.prototype.startsWith = function(searchString, position) { @@ -134,6 +136,10 @@ Kotlin.isNumber(value) || Kotlin.isType(value, Kotlin.Comparable); }; + + Kotlin.isCharSequence = function (value) { + return typeof value === "string" || Kotlin.isType(value, Kotlin.CharSequence); + }; Kotlin.charInc = function (value) { return String.fromCharCode(value.charCodeAt(0)+1); @@ -1140,7 +1146,7 @@ }; - Kotlin.StringBuilder = Kotlin.createClassNow(null, + Kotlin.StringBuilder = Kotlin.createClassNow([Kotlin.CharSequence], function (content) { this.string = typeof(content) == "string" ? content : ""; }, {