Add KotlinBuiltIns#isBuiltIn, use it instead of other utilities

This commit is contained in:
Alexander Udalov
2016-10-19 11:46:46 +03:00
parent 4effe42f1d
commit 484b0e36fb
12 changed files with 57 additions and 76 deletions
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.codegen package org.jetbrains.kotlin.codegen
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DECLARATION import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DECLARATION
@@ -24,7 +25,6 @@ import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature.getSpecialSignatureInfo import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature.getSpecialSignatureInfo
import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature.isBuiltinWithSpecialDescriptorInJvm import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature.isBuiltinWithSpecialDescriptorInJvm
import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor
import org.jetbrains.kotlin.load.java.isFromBuiltins
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.platform.JavaToKotlinClassMap import org.jetbrains.kotlin.platform.JavaToKotlinClassMap
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
@@ -191,7 +191,7 @@ class CollectionStubMethodGenerator(
private fun isDefaultInJdk(method: FunctionDescriptor) = private fun isDefaultInJdk(method: FunctionDescriptor) =
method.modality != Modality.ABSTRACT && method.modality != Modality.ABSTRACT &&
method.original.overriddenTreeUniqueAsSequence(useOriginal = true).all { method.original.overriddenTreeUniqueAsSequence(useOriginal = true).all {
it.kind == FAKE_OVERRIDE || it.isFromBuiltins() it.kind == FAKE_OVERRIDE || KotlinBuiltIns.isBuiltIn(it)
} }
private data class CollectionClassPair( private data class CollectionClassPair(
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.resolve.jvm.checkers package org.jetbrains.kotlin.resolve.jvm.checkers
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
@@ -25,7 +26,6 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticSink
import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor
import org.jetbrains.kotlin.load.java.isFromBuiltins
import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.checkers.DeclarationChecker import org.jetbrains.kotlin.resolve.checkers.DeclarationChecker
@@ -53,10 +53,9 @@ private fun reportErrorIfAdditionalBuiltinDescriptor(
diagnosticHolder: DiagnosticSink, diagnosticHolder: DiagnosticSink,
reportOn: PsiElement reportOn: PsiElement
) { ) {
@Suppress("UNCHECKED_CAST") val overriddenTree = descriptor.overriddenTreeUniqueAsSequence(useOriginal = true)
val overriddenTree = descriptor.overriddenTreeUniqueAsSequence(useOriginal = true) as Sequence<CallableMemberDescriptor>
if (overriddenTree.any { it.isFromBuiltins() && it is JavaCallableMemberDescriptor }) { if (overriddenTree.any { KotlinBuiltIns.isBuiltIn(it) && it is JavaCallableMemberDescriptor }) {
diagnosticHolder.report(Errors.UNSUPPORTED_FEATURE.on(reportOn, LanguageFeature.AdditionalBuiltInsMembers)) diagnosticHolder.report(Errors.UNSUPPORTED_FEATURE.on(reportOn, LanguageFeature.AdditionalBuiltInsMembers))
} }
} }
@@ -60,7 +60,8 @@ class JavaIncompatibilityRulesOverridabilityCondition : ExternalOverridabilityCo
subDescriptor: CallableDescriptor, subDescriptor: CallableDescriptor,
subClassDescriptor: ClassDescriptor? subClassDescriptor: ClassDescriptor?
): Boolean { ): Boolean {
if (superDescriptor !is CallableMemberDescriptor || subDescriptor !is FunctionDescriptor || subDescriptor.isFromBuiltins()) { if (superDescriptor !is CallableMemberDescriptor || subDescriptor !is FunctionDescriptor ||
KotlinBuiltIns.isBuiltIn(subDescriptor)) {
return false return false
} }
@@ -31,7 +31,10 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.FqNameUnsafe import org.jetbrains.kotlin.name.FqNameUnsafe
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.descriptorUtil.* import org.jetbrains.kotlin.resolve.descriptorUtil.firstOverridden
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
import org.jetbrains.kotlin.resolve.descriptorUtil.propertyIfAccessor
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
import org.jetbrains.kotlin.types.checker.TypeCheckingProcedure import org.jetbrains.kotlin.types.checker.TypeCheckingProcedure
import org.jetbrains.kotlin.builtins.KotlinBuiltIns.FQ_NAMES as BUILTIN_NAMES import org.jetbrains.kotlin.builtins.KotlinBuiltIns.FQ_NAMES as BUILTIN_NAMES
@@ -74,7 +77,7 @@ object BuiltinSpecialProperties {
private fun CallableMemberDescriptor.hasBuiltinSpecialPropertyFqNameImpl(): Boolean { private fun CallableMemberDescriptor.hasBuiltinSpecialPropertyFqNameImpl(): Boolean {
if (fqNameOrNull() in SPECIAL_FQ_NAMES && valueParameters.isEmpty()) return true if (fqNameOrNull() in SPECIAL_FQ_NAMES && valueParameters.isEmpty()) return true
if (!isFromBuiltins()) return false if (!KotlinBuiltIns.isBuiltIn(this)) return false
return overriddenDescriptors.any { hasBuiltinSpecialPropertyFqName(it) } return overriddenDescriptors.any { hasBuiltinSpecialPropertyFqName(it) }
} }
@@ -83,7 +86,7 @@ object BuiltinSpecialProperties {
GETTER_JVM_NAME_TO_PROPERTIES_SHORT_NAME_MAP[name1] ?: emptyList() GETTER_JVM_NAME_TO_PROPERTIES_SHORT_NAME_MAP[name1] ?: emptyList()
fun CallableMemberDescriptor.getBuiltinSpecialPropertyGetterName(): String? { fun CallableMemberDescriptor.getBuiltinSpecialPropertyGetterName(): String? {
assert(isFromBuiltins()) { "This method is defined only for builtin members, but $this found" } assert(KotlinBuiltIns.isBuiltIn(this)) { "This method is defined only for builtin members, but $this found" }
val descriptor = propertyIfAccessor.firstOverridden { hasBuiltinSpecialPropertyFqName(it) } ?: return null val descriptor = propertyIfAccessor.firstOverridden { hasBuiltinSpecialPropertyFqName(it) } ?: return null
return PROPERTY_FQ_NAME_TO_JVM_GETTER_NAME_MAP[descriptor.fqNameSafe]?.asString() return PROPERTY_FQ_NAME_TO_JVM_GETTER_NAME_MAP[descriptor.fqNameSafe]?.asString()
@@ -178,7 +181,7 @@ object BuiltinMethodsWithSpecialGenericSignature {
} }
fun CallableMemberDescriptor.isBuiltinWithSpecialDescriptorInJvm(): Boolean { fun CallableMemberDescriptor.isBuiltinWithSpecialDescriptorInJvm(): Boolean {
if (!isFromBuiltins()) return false if (!KotlinBuiltIns.isBuiltIn(this)) return false
return getSpecialSignatureInfo()?.isObjectReplacedWithTypeParameter ?: false || doesOverrideBuiltinWithDifferentJvmName() return getSpecialSignatureInfo()?.isObjectReplacedWithTypeParameter ?: false || doesOverrideBuiltinWithDifferentJvmName()
} }
@@ -240,8 +243,7 @@ object BuiltinMethodsWithDifferentJvmName {
} }
fun isBuiltinFunctionWithDifferentNameInJvm(functionDescriptor: SimpleFunctionDescriptor): Boolean { fun isBuiltinFunctionWithDifferentNameInJvm(functionDescriptor: SimpleFunctionDescriptor): Boolean {
if (!functionDescriptor.isFromBuiltins()) return false return KotlinBuiltIns.isBuiltIn(functionDescriptor) && functionDescriptor.firstOverridden {
return functionDescriptor.firstOverridden {
SIGNATURE_TO_JVM_REPRESENTATION_NAME.containsKey(functionDescriptor.computeJvmSignature()) SIGNATURE_TO_JVM_REPRESENTATION_NAME.containsKey(functionDescriptor.computeJvmSignature())
} != null } != null
} }
@@ -279,7 +281,7 @@ fun <T : CallableMemberDescriptor> T.getOverriddenSpecialBuiltin(): T? {
if (!name.sameAsBuiltinMethodWithErasedValueParameters) return null if (!name.sameAsBuiltinMethodWithErasedValueParameters) return null
return firstOverridden { return firstOverridden {
it.isFromBuiltins() && it.getSpecialSignatureInfo() != null KotlinBuiltIns.isBuiltIn(it) && it.getSpecialSignatureInfo() != null
} as T? } as T?
} }
@@ -295,7 +297,7 @@ fun <T : CallableMemberDescriptor> T.getOverriddenBuiltinReflectingJvmDescriptor
if (!name.sameAsBuiltinMethodWithErasedValueParameters) return null if (!name.sameAsBuiltinMethodWithErasedValueParameters) return null
return firstOverridden { return firstOverridden {
it.isFromBuiltins() && it.getSpecialSignatureInfo()?.isObjectReplacedWithTypeParameter ?: false KotlinBuiltIns.isBuiltIn(it) && it.getSpecialSignatureInfo()?.isObjectReplacedWithTypeParameter ?: false
}?.original as T? }?.original as T?
} }
@@ -311,13 +313,9 @@ fun getJvmMethodNameIfSpecial(callableMemberDescriptor: CallableMemberDescriptor
private fun getOverriddenBuiltinThatAffectsJvmName( private fun getOverriddenBuiltinThatAffectsJvmName(
callableMemberDescriptor: CallableMemberDescriptor callableMemberDescriptor: CallableMemberDescriptor
): CallableMemberDescriptor? { ): CallableMemberDescriptor? =
val overriddenBuiltin = callableMemberDescriptor.getOverriddenBuiltinWithDifferentJvmName() ?: return null if (KotlinBuiltIns.isBuiltIn(callableMemberDescriptor)) callableMemberDescriptor.getOverriddenBuiltinWithDifferentJvmName()
else null
if (callableMemberDescriptor.isFromBuiltins()) return overriddenBuiltin
return null
}
fun ClassDescriptor.hasRealKotlinSuperClassWithOverrideOf( fun ClassDescriptor.hasRealKotlinSuperClassWithOverrideOf(
specialCallableDescriptor: CallableDescriptor specialCallableDescriptor: CallableDescriptor
@@ -334,9 +332,7 @@ fun ClassDescriptor.hasRealKotlinSuperClassWithOverrideOf(
TypeCheckingProcedure.findCorrespondingSupertype(superClassDescriptor.defaultType, builtinContainerDefaultType) != null TypeCheckingProcedure.findCorrespondingSupertype(superClassDescriptor.defaultType, builtinContainerDefaultType) != null
if (doesOverrideBuiltinDeclaration) { if (doesOverrideBuiltinDeclaration) {
val containingPackageFragment = DescriptorUtils.getParentOfType(superClassDescriptor, PackageFragmentDescriptor::class.java) return !KotlinBuiltIns.isBuiltIn(superClassDescriptor)
if (superClassDescriptor.builtIns.isBuiltInPackageFragment(containingPackageFragment)) return false
return true
} }
} }
@@ -348,12 +344,8 @@ fun ClassDescriptor.hasRealKotlinSuperClassWithOverrideOf(
// Util methods // Util methods
val CallableMemberDescriptor.isFromJava: Boolean val CallableMemberDescriptor.isFromJava: Boolean
get() = propertyIfAccessor is JavaCallableMemberDescriptor && propertyIfAccessor.containingDeclaration is JavaClassDescriptor get() = propertyIfAccessor.let { descriptor ->
(descriptor as? JavaCallableMemberDescriptor)?.containingDeclaration is JavaClassDescriptor
}
fun CallableMemberDescriptor.isFromBuiltins(): Boolean { fun CallableMemberDescriptor.isFromJavaOrBuiltins() = isFromJava || KotlinBuiltIns.isBuiltIn(this)
val fqNameUnsafe = propertyIfAccessor.fqNameUnsafe
return fqNameUnsafe.startsWith(KotlinBuiltIns.BUILT_INS_PACKAGE_NAME) &&
this.module == this.builtIns.builtInsModule
}
fun CallableMemberDescriptor.isFromJavaOrBuiltins() = isFromJava || isFromBuiltins()
@@ -288,8 +288,8 @@ public abstract class KotlinBuiltIns {
return builtInsPackageFragment; return builtInsPackageFragment;
} }
public boolean isBuiltInPackageFragment(@Nullable PackageFragmentDescriptor packageFragment) { public static boolean isBuiltIn(@NotNull DeclarationDescriptor descriptor) {
return packageFragment != null && packageFragment.getContainingDeclaration() == getBuiltInsModule(); return DescriptorUtils.getParentOfType(descriptor, BuiltInsPackageFragment.class, false) != null;
} }
@NotNull @NotNull
@@ -17,23 +17,16 @@
package org.jetbrains.kotlin.js.descriptorUtils package org.jetbrains.kotlin.js.descriptorUtils
import com.intellij.openapi.util.text.StringUtil import com.intellij.openapi.util.text.StringUtil
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.utils.addToStdlib.check import org.jetbrains.kotlin.utils.addToStdlib.check
val KotlinType.nameIfStandardType: Name? val KotlinType.nameIfStandardType: Name?
get() { get() = constructor.declarationDescriptor?.check(KotlinBuiltIns::isBuiltIn)?.name
return constructor.declarationDescriptor
?.check { descriptor ->
descriptor.builtIns.isBuiltInPackageFragment(descriptor.containingDeclaration as? PackageFragmentDescriptor)
}
?.name
}
fun KotlinType.getJetTypeFqName(printTypeArguments: Boolean): String { fun KotlinType.getJetTypeFqName(printTypeArguments: Boolean): String {
val declaration = requireNotNull(constructor.declarationDescriptor) val declaration = requireNotNull(constructor.declarationDescriptor)
@@ -47,8 +40,9 @@ fun KotlinType.getJetTypeFqName(printTypeArguments: Boolean): String {
if (printTypeArguments && !typeArguments.isEmpty()) { if (printTypeArguments && !typeArguments.isEmpty()) {
val joinedTypeArguments = StringUtil.join(typeArguments, { projection -> projection.type.getJetTypeFqName(false) }, ", ") val joinedTypeArguments = StringUtil.join(typeArguments, { projection -> projection.type.getJetTypeFqName(false) }, ", ")
typeArgumentsAsString = "<" + joinedTypeArguments + ">" typeArgumentsAsString = "<$joinedTypeArguments>"
} else { }
else {
typeArgumentsAsString = "" typeArgumentsAsString = ""
} }
@@ -24,6 +24,7 @@ import com.google.dart.compiler.backend.js.ast.JsBinaryOperator;
import com.google.dart.compiler.backend.js.ast.JsExpression; import com.google.dart.compiler.backend.js.ast.JsExpression;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
import org.jetbrains.kotlin.descriptors.FunctionDescriptor; import org.jetbrains.kotlin.descriptors.FunctionDescriptor;
import org.jetbrains.kotlin.js.patterns.DescriptorPredicate; import org.jetbrains.kotlin.js.patterns.DescriptorPredicate;
import org.jetbrains.kotlin.js.patterns.NamePredicate; import org.jetbrains.kotlin.js.patterns.NamePredicate;
@@ -31,7 +32,6 @@ import org.jetbrains.kotlin.js.translate.context.TranslationContext;
import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntrinsic; import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntrinsic;
import org.jetbrains.kotlin.js.translate.operation.OperatorTable; import org.jetbrains.kotlin.js.translate.operation.OperatorTable;
import org.jetbrains.kotlin.js.translate.utils.JsAstUtils; import org.jetbrains.kotlin.js.translate.utils.JsAstUtils;
import org.jetbrains.kotlin.js.translate.utils.JsDescriptorUtils;
import org.jetbrains.kotlin.lexer.KtToken; import org.jetbrains.kotlin.lexer.KtToken;
import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.types.expressions.OperatorConventions; import org.jetbrains.kotlin.types.expressions.OperatorConventions;
@@ -144,7 +144,7 @@ public enum PrimitiveBinaryOperationFIF implements FunctionIntrinsicFactory {
} }
if (JsDescriptorUtils.isBuiltin(descriptor) && descriptor.getName().equals(OperatorNameConventions.COMPARE_TO)) { if (KotlinBuiltIns.isBuiltIn(descriptor) && descriptor.getName().equals(OperatorNameConventions.COMPARE_TO)) {
return BUILTINS_COMPARE_TO_INTRINSIC; return BUILTINS_COMPARE_TO_INTRINSIC;
} }
@@ -16,19 +16,19 @@
package org.jetbrains.kotlin.js.translate.intrinsic.operation package org.jetbrains.kotlin.js.translate.intrinsic.operation
import com.google.common.collect.ImmutableSet import com.google.dart.compiler.backend.js.ast.JsBinaryOperation
import com.google.dart.compiler.backend.js.ast.* import com.google.dart.compiler.backend.js.ast.JsExpression
import com.google.dart.compiler.backend.js.ast.JsNumberLiteral
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.psi.KtBinaryExpression
import org.jetbrains.kotlin.types.expressions.OperatorConventions
import org.jetbrains.kotlin.lexer.KtToken
import org.jetbrains.kotlin.js.patterns.PatternBuilder.pattern import org.jetbrains.kotlin.js.patterns.PatternBuilder.pattern
import org.jetbrains.kotlin.js.translate.context.TranslationContext import org.jetbrains.kotlin.js.translate.context.TranslationContext
import org.jetbrains.kotlin.js.translate.operation.OperatorTable import org.jetbrains.kotlin.js.translate.operation.OperatorTable
import org.jetbrains.kotlin.js.translate.utils.JsAstUtils import org.jetbrains.kotlin.js.translate.utils.JsAstUtils
import org.jetbrains.kotlin.js.translate.utils.JsDescriptorUtils
import org.jetbrains.kotlin.js.translate.utils.PsiUtils.getOperationToken import org.jetbrains.kotlin.js.translate.utils.PsiUtils.getOperationToken
import org.jetbrains.kotlin.psi.KtBinaryExpression
import org.jetbrains.kotlin.resolve.calls.tasks.isDynamic import org.jetbrains.kotlin.resolve.calls.tasks.isDynamic
import org.jetbrains.kotlin.types.expressions.OperatorConventions
object CompareToBOIF : BinaryOperationIntrinsicFactory { object CompareToBOIF : BinaryOperationIntrinsicFactory {
val COMPARE_TO_CHAR = pattern("Int|Short|Byte|Double|Float.compareTo(Char)") val COMPARE_TO_CHAR = pattern("Int|Short|Byte|Double|Float.compareTo(Char)")
@@ -69,7 +69,7 @@ object CompareToBOIF : BinaryOperationIntrinsicFactory {
override fun getIntrinsic(descriptor: FunctionDescriptor): BinaryOperationIntrinsic? { override fun getIntrinsic(descriptor: FunctionDescriptor): BinaryOperationIntrinsic? {
if (descriptor.isDynamic()) return CompareToIntrinsic if (descriptor.isDynamic()) return CompareToIntrinsic
if (!JsDescriptorUtils.isBuiltin(descriptor)) return null if (!KotlinBuiltIns.isBuiltIn(descriptor)) return null
return when { return when {
COMPARE_TO_CHAR.apply(descriptor) -> COMPARE_TO_CHAR.apply(descriptor) ->
@@ -20,9 +20,9 @@ import com.google.dart.compiler.backend.js.ast.JsBinaryOperation
import com.google.dart.compiler.backend.js.ast.JsBinaryOperator import com.google.dart.compiler.backend.js.ast.JsBinaryOperator
import com.google.dart.compiler.backend.js.ast.JsExpression import com.google.dart.compiler.backend.js.ast.JsExpression
import com.google.dart.compiler.backend.js.ast.JsLiteral import com.google.dart.compiler.backend.js.ast.JsLiteral
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.js.patterns.NamePredicate import org.jetbrains.kotlin.js.patterns.NamePredicate
import org.jetbrains.kotlin.js.patterns.PatternBuilder.pattern
import org.jetbrains.kotlin.js.translate.context.TranslationContext import org.jetbrains.kotlin.js.translate.context.TranslationContext
import org.jetbrains.kotlin.js.translate.intrinsic.functions.factories.TopLevelFIF import org.jetbrains.kotlin.js.translate.intrinsic.functions.factories.TopLevelFIF
import org.jetbrains.kotlin.js.translate.utils.JsAstUtils import org.jetbrains.kotlin.js.translate.utils.JsAstUtils
@@ -35,7 +35,7 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
import org.jetbrains.kotlin.types.expressions.OperatorConventions import org.jetbrains.kotlin.types.expressions.OperatorConventions
import org.jetbrains.kotlin.types.isDynamic import org.jetbrains.kotlin.types.isDynamic
import java.util.Arrays import java.util.*
object EqualsBOIF : BinaryOperationIntrinsicFactory { object EqualsBOIF : BinaryOperationIntrinsicFactory {
@@ -86,7 +86,7 @@ object EqualsBOIF : BinaryOperationIntrinsicFactory {
when { when {
DescriptorUtils.isEnumClass(descriptor.containingDeclaration) -> EnumEqualsIntrinsic DescriptorUtils.isEnumClass(descriptor.containingDeclaration) -> EnumEqualsIntrinsic
JsDescriptorUtils.isBuiltin(descriptor) || KotlinBuiltIns.isBuiltIn(descriptor) ||
TopLevelFIF.EQUALS_IN_ANY.apply(descriptor) -> EqualsIntrinsic TopLevelFIF.EQUALS_IN_ANY.apply(descriptor) -> EqualsIntrinsic
else -> null else -> null
@@ -19,16 +19,13 @@ package org.jetbrains.kotlin.js.translate.intrinsic.operation
import com.google.dart.compiler.backend.js.ast.JsBinaryOperation import com.google.dart.compiler.backend.js.ast.JsBinaryOperation
import com.google.dart.compiler.backend.js.ast.JsExpression import com.google.dart.compiler.backend.js.ast.JsExpression
import com.google.dart.compiler.backend.js.ast.JsNumberLiteral import com.google.dart.compiler.backend.js.ast.JsNumberLiteral
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.js.patterns.PatternBuilder.pattern import org.jetbrains.kotlin.js.patterns.PatternBuilder.pattern
import org.jetbrains.kotlin.js.translate.context.Namer import org.jetbrains.kotlin.js.translate.context.Namer
import org.jetbrains.kotlin.js.translate.context.TranslationContext import org.jetbrains.kotlin.js.translate.context.TranslationContext
import org.jetbrains.kotlin.js.translate.operation.OperatorTable import org.jetbrains.kotlin.js.translate.operation.OperatorTable
import org.jetbrains.kotlin.js.translate.utils.JsAstUtils.charToInt import org.jetbrains.kotlin.js.translate.utils.JsAstUtils.*
import org.jetbrains.kotlin.js.translate.utils.JsAstUtils.compareForObject
import org.jetbrains.kotlin.js.translate.utils.JsAstUtils.invokeMethod
import org.jetbrains.kotlin.js.translate.utils.JsAstUtils.longFromInt
import org.jetbrains.kotlin.js.translate.utils.JsDescriptorUtils
import org.jetbrains.kotlin.js.translate.utils.PsiUtils.getOperationToken import org.jetbrains.kotlin.js.translate.utils.PsiUtils.getOperationToken
import org.jetbrains.kotlin.psi.KtBinaryExpression import org.jetbrains.kotlin.psi.KtBinaryExpression
import org.jetbrains.kotlin.types.expressions.OperatorConventions import org.jetbrains.kotlin.types.expressions.OperatorConventions
@@ -75,7 +72,7 @@ object LongCompareToBOIF : BinaryOperationIntrinsicFactory {
override fun getSupportTokens() = OperatorConventions.COMPARISON_OPERATIONS override fun getSupportTokens() = OperatorConventions.COMPARISON_OPERATIONS
override fun getIntrinsic(descriptor: FunctionDescriptor): BinaryOperationIntrinsic? { override fun getIntrinsic(descriptor: FunctionDescriptor): BinaryOperationIntrinsic? {
if (JsDescriptorUtils.isBuiltin(descriptor)) { if (KotlinBuiltIns.isBuiltIn(descriptor)) {
return when { return when {
FLOATING_POINT_COMPARE_TO_LONG_PATTERN.apply(descriptor) -> FLOATING_POINT_COMPARE_TO_LONG FLOATING_POINT_COMPARE_TO_LONG_PATTERN.apply(descriptor) -> FLOATING_POINT_COMPARE_TO_LONG
LONG_COMPARE_TO_FLOATING_POINT_PATTERN.apply(descriptor) -> LONG_COMPARE_TO_FLOATING_POINT LONG_COMPARE_TO_FLOATING_POINT_PATTERN.apply(descriptor) -> LONG_COMPARE_TO_FLOATING_POINT
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.js.translate.reference
import com.google.dart.compiler.backend.js.ast.JsExpression import com.google.dart.compiler.backend.js.ast.JsExpression
import com.google.dart.compiler.backend.js.ast.JsInvocation import com.google.dart.compiler.backend.js.ast.JsInvocation
import com.google.dart.compiler.backend.js.ast.JsLiteral import com.google.dart.compiler.backend.js.ast.JsLiteral
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.js.resolve.diagnostics.ErrorsJs import org.jetbrains.kotlin.js.resolve.diagnostics.ErrorsJs
import org.jetbrains.kotlin.js.translate.context.TranslationContext import org.jetbrains.kotlin.js.translate.context.TranslationContext
@@ -27,7 +28,9 @@ import org.jetbrains.kotlin.js.translate.utils.BindingUtils
import org.jetbrains.kotlin.js.translate.utils.JsDescriptorUtils import org.jetbrains.kotlin.js.translate.utils.JsDescriptorUtils
import org.jetbrains.kotlin.psi.KtCallableReferenceExpression import org.jetbrains.kotlin.psi.KtCallableReferenceExpression
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
import java.util.ArrayList import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
import org.jetbrains.kotlin.resolve.descriptorUtil.module
import java.util.*
object CallableReferenceTranslator { object CallableReferenceTranslator {
@@ -50,8 +53,8 @@ object CallableReferenceTranslator {
private fun translateForFunction(descriptor: FunctionDescriptor, context: TranslationContext, expression: KtCallableReferenceExpression): JsExpression { private fun translateForFunction(descriptor: FunctionDescriptor, context: TranslationContext, expression: KtCallableReferenceExpression): JsExpression {
return when { return when {
// TODO Support for callable reference to builtin functions and members // TODO Support for callable reference to builtin functions and members
JsDescriptorUtils.isBuiltin(descriptor) -> KotlinBuiltIns.isBuiltIn(descriptor) ->
reportNotSupported(context, expression) reportNotSupported(context, expression)
isConstructor(descriptor) -> isConstructor(descriptor) ->
translateForConstructor(descriptor, context) translateForConstructor(descriptor, context)
@@ -66,8 +69,8 @@ object CallableReferenceTranslator {
private fun translateForProperty(descriptor: PropertyDescriptor, context: TranslationContext, expression: KtCallableReferenceExpression): JsExpression { private fun translateForProperty(descriptor: PropertyDescriptor, context: TranslationContext, expression: KtCallableReferenceExpression): JsExpression {
return when { return when {
// TODO Support for callable reference to builtin properties // TODO Support for callable reference to builtin properties
JsDescriptorUtils.isBuiltin(descriptor) -> KotlinBuiltIns.isBuiltIn(descriptor) ->
reportNotSupported(context, expression) reportNotSupported(context, expression)
isExtension(descriptor) -> isExtension(descriptor) ->
translateForExtensionProperty(descriptor, context) translateForExtensionProperty(descriptor, context)
@@ -30,8 +30,8 @@ import org.jetbrains.kotlin.js.translate.context.TranslationContext;
import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.psi.KtExpression; import org.jetbrains.kotlin.psi.KtExpression;
import org.jetbrains.kotlin.resolve.DescriptorUtils; import org.jetbrains.kotlin.resolve.DescriptorUtils;
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue;
import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver; import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver;
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue;
import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.kotlin.types.KotlinType;
import org.jetbrains.kotlin.util.OperatorNameConventions; import org.jetbrains.kotlin.util.OperatorNameConventions;
@@ -154,11 +154,6 @@ public final class JsDescriptorUtils {
!ModalityKt.isOverridableOrOverrides(propertyDescriptor); !ModalityKt.isOverridableOrOverrides(propertyDescriptor);
} }
public static boolean isBuiltin(@NotNull DeclarationDescriptor descriptor) {
PackageFragmentDescriptor containingPackageFragment = DescriptorUtils.getParentOfType(descriptor, PackageFragmentDescriptor.class);
return org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt.getBuiltIns(descriptor).isBuiltInPackageFragment(containingPackageFragment);
}
@Nullable @Nullable
public static Name getNameIfStandardType(@NotNull KtExpression expression, @NotNull TranslationContext context) { public static Name getNameIfStandardType(@NotNull KtExpression expression, @NotNull TranslationContext context) {
KotlinType type = context.bindingContext().getType(expression); KotlinType type = context.bindingContext().getType(expression);
@@ -175,7 +170,7 @@ public final class JsDescriptorUtils {
@Nullable @Nullable
public static String getExternalModuleName(@NotNull DeclarationDescriptor descriptor) { public static String getExternalModuleName(@NotNull DeclarationDescriptor descriptor) {
if (isBuiltin(descriptor)) return Namer.KOTLIN_LOWER_NAME; if (KotlinBuiltIns.isBuiltIn(descriptor)) return Namer.KOTLIN_LOWER_NAME;
PsiElement element = descriptorToDeclaration(descriptor); PsiElement element = descriptorToDeclaration(descriptor);
if (element == null && descriptor instanceof PropertyAccessorDescriptor) { if (element == null && descriptor instanceof PropertyAccessorDescriptor) {