Use FQ names instead of descriptor equality in RangeCodegenUtil

This is safer in cases when descriptors for the same declaration can come from
different package fragment providers
This commit is contained in:
Alexander Udalov
2016-10-19 11:41:36 +03:00
parent ccd480236a
commit 9ce211fe87
2 changed files with 21 additions and 26 deletions
@@ -31,7 +31,6 @@ import org.jetbrains.kotlin.resolve.BindingContext;
import org.jetbrains.kotlin.resolve.DescriptorUtils;
import org.jetbrains.kotlin.resolve.calls.callUtil.CallUtilKt;
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt;
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver;
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue;
import org.jetbrains.kotlin.types.KotlinType;
@@ -220,19 +219,17 @@ public class RangeCodegenUtil {
@NotNull KtExpression rangeExpression,
@NotNull BindingContext bindingContext
) {
if (rangeExpression instanceof KtBinaryExpression) {
KtBinaryExpression binaryExpression = (KtBinaryExpression) rangeExpression;
if (binaryExpression.getOperationReference().getReferencedNameElementType() == KtTokens.RANGE) {
KotlinType kotlinType = bindingContext.getType(rangeExpression);
assert kotlinType != null;
DeclarationDescriptor descriptor = kotlinType.getConstructor().getDeclarationDescriptor();
// noinspection ConstantConditions
if (DescriptorUtilsKt.getBuiltIns(descriptor).getIntegralRanges().contains(descriptor)) {
if ("LongRange".equals(descriptor.getName().asString())) {
return argumentType == Type.LONG_TYPE;
}
if (rangeExpression instanceof KtBinaryExpression &&
((KtBinaryExpression) rangeExpression).getOperationReference().getReferencedNameElementType() == KtTokens.RANGE) {
KotlinType kotlinType = bindingContext.getType(rangeExpression);
assert kotlinType != null;
DeclarationDescriptor descriptor = kotlinType.getConstructor().getDeclarationDescriptor();
if (descriptor != null) {
FqNameUnsafe fqName = DescriptorUtils.getFqName(descriptor);
if (fqName.equals(KotlinBuiltIns.FQ_NAMES.longRange)) {
return argumentType == Type.LONG_TYPE;
}
if (fqName.equals(KotlinBuiltIns.FQ_NAMES.charRange) || fqName.equals(KotlinBuiltIns.FQ_NAMES.intRange)) {
return AsmUtil.isIntPrimitive(argumentType);
}
}
@@ -16,7 +16,6 @@
package org.jetbrains.kotlin.builtins;
import kotlin.collections.SetsKt;
import kotlin.jvm.functions.Function1;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -68,7 +67,6 @@ public abstract class KotlinBuiltIns {
private final ModuleDescriptorImpl builtInsModule;
private final PackageFragmentDescriptor builtInsPackageFragment;
private final PackageFragmentDescriptor collectionsPackageFragment;
private final PackageFragmentDescriptor rangesPackageFragment;
private final PackageFragmentDescriptor annotationPackageFragment;
private final Set<PackageFragmentDescriptor> builtInsPackageFragments;
@@ -106,7 +104,7 @@ public abstract class KotlinBuiltIns {
builtInsPackageFragment = createPackage(packageFragmentProvider, packageNameToPackageFragment, BUILT_INS_PACKAGE_FQ_NAME);
collectionsPackageFragment = createPackage(packageFragmentProvider, packageNameToPackageFragment, COLLECTIONS_PACKAGE_FQ_NAME);
rangesPackageFragment = createPackage(packageFragmentProvider, packageNameToPackageFragment, RANGES_PACKAGE_FQ_NAME);
createPackage(packageFragmentProvider, packageNameToPackageFragment, RANGES_PACKAGE_FQ_NAME);
annotationPackageFragment = createPackage(packageFragmentProvider, packageNameToPackageFragment, ANNOTATION_PACKAGE_FQ_NAME);
createPackage(packageFragmentProvider, packageNameToPackageFragment, COROUTINES_PACKAGE_FQ_NAME);
@@ -189,6 +187,10 @@ public abstract class KotlinBuiltIns {
public final FqName throwable = fqName("Throwable");
public final FqName comparable = fqName("Comparable");
public final FqNameUnsafe charRange = rangesFqName("CharRange");
public final FqNameUnsafe intRange = rangesFqName("IntRange");
public final FqNameUnsafe longRange = rangesFqName("LongRange");
public final FqName deprecated = fqName("Deprecated");
public final FqName deprecationLevel = fqName("DeprecationLevel");
public final FqName extensionFunctionType = fqName("ExtensionFunctionType");
@@ -255,6 +257,11 @@ public abstract class KotlinBuiltIns {
return COLLECTIONS_PACKAGE_FQ_NAME.child(Name.identifier(simpleName));
}
@NotNull
private static FqNameUnsafe rangesFqName(@NotNull String simpleName) {
return RANGES_PACKAGE_FQ_NAME.child(Name.identifier(simpleName)).toUnsafe();
}
@NotNull
private static FqNameUnsafe reflect(@NotNull String simpleName) {
return ReflectionTypesKt.getKOTLIN_REFLECT_FQ_NAME().child(Name.identifier(simpleName)).toUnsafe();
@@ -400,15 +407,6 @@ public abstract class KotlinBuiltIns {
return getPrimitiveClassDescriptor(BOOLEAN);
}
@NotNull
public Set<DeclarationDescriptor> getIntegralRanges() {
return SetsKt.<DeclarationDescriptor>setOf(
getBuiltInClassByName("CharRange", rangesPackageFragment),
getBuiltInClassByName("IntRange", rangesPackageFragment),
getBuiltInClassByName("LongRange", rangesPackageFragment)
);
}
@NotNull
public ClassDescriptor getArray() {
return getBuiltInClassByName("Array");