From 304129f9c90aa3cbf4a1aa0716c0c19014ab9a40 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 4 Feb 2014 19:39:16 +0400 Subject: [PATCH] Check if the class is special by FQ name This is needed because our built-ins can be loaded with two different mechanisms (deserialization and lazy resolve) and, when that happens, corresponding descriptors aren't equal to each other, so one of two resolved descriptors for Any (or the same with Nothing) was never considered to be a "special class" with no supertypes --- compiler/builtins-serializer/src/BuiltInsSerializer.kt | 8 +++----- .../jet/lang/resolve/lazy/ResolveSession.java | 10 ---------- .../resolve/lazy/descriptors/LazyClassDescriptor.java | 2 +- .../jetbrains/jet/test/util/DescriptorValidator.java | 3 +-- .../jetbrains/jet/lang/types/lang/KotlinBuiltIns.java | 7 +++++++ 5 files changed, 12 insertions(+), 18 deletions(-) diff --git a/compiler/builtins-serializer/src/BuiltInsSerializer.kt b/compiler/builtins-serializer/src/BuiltInsSerializer.kt index 642dfd3456f..f4b1aec38b5 100644 --- a/compiler/builtins-serializer/src/BuiltInsSerializer.kt +++ b/compiler/builtins-serializer/src/BuiltInsSerializer.kt @@ -43,6 +43,7 @@ import org.jetbrains.jet.di.InjectorForJavaDescriptorResolverUtil import org.jetbrains.jet.lang.descriptors.ModuleDescriptor import org.jetbrains.jet.lang.resolve.name.FqName import com.intellij.util.containers.ContainerUtil +import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns public class BuiltInsSerializer(val out: PrintStream?) { private var totalSize = 0 @@ -96,11 +97,8 @@ public class BuiltInsSerializer(val out: PrintStream?) { // DescriptorValidator.validate(packageView) val serializer = DescriptorSerializer(object : SerializerExtension() { - private val set = setOf("Any", "Nothing") - - override fun hasSupertypes(descriptor: ClassDescriptor): Boolean { - return descriptor.getName().asString() !in set - } + override fun hasSupertypes(descriptor: ClassDescriptor): Boolean = + !KotlinBuiltIns.isSpecialClassWithNoSupertypes(descriptor) }) val classNames = ArrayList() diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSession.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSession.java index 352fbc001e9..d5bf2ed7ef8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSession.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSession.java @@ -16,8 +16,6 @@ package org.jetbrains.jet.lang.resolve.lazy; -import com.google.common.base.Predicate; -import com.google.common.base.Predicates; import com.google.common.collect.Lists; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; @@ -37,7 +35,6 @@ import org.jetbrains.jet.lang.resolve.lazy.declarations.PackageMemberDeclaration import org.jetbrains.jet.lang.resolve.lazy.descriptors.LazyClassDescriptor; import org.jetbrains.jet.lang.resolve.lazy.descriptors.LazyPackageDescriptor; import org.jetbrains.jet.lang.resolve.name.FqName; -import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.SpecialNames; import org.jetbrains.jet.lang.resolve.scopes.JetScope; @@ -70,8 +67,6 @@ public class ResolveSession implements KotlinCodeAnalyzer { private final BindingTrace trace; private final DeclarationProviderFactory declarationProviderFactory; - private final Predicate specialClasses; - private final Function classifierAliases; private final MemoizedFunctionToNullable packages; @@ -131,7 +126,6 @@ public class ResolveSession implements KotlinCodeAnalyzer { this.module = rootDescriptor; this.classifierAliases = NO_ALIASES; - this.specialClasses = Predicates.alwaysFalse(); this.packages = storageManager.createMemoizedFunctionWithNullableValues(new MemoizedFunctionToNullable() { @Nullable @@ -187,10 +181,6 @@ public class ResolveSession implements KotlinCodeAnalyzer { return new LazyPackageDescriptor(module, fqName, this, provider); } - public boolean isClassSpecial(@NotNull FqNameUnsafe fqName) { - return specialClasses.apply(fqName); - } - @Override public ModuleDescriptor getModuleDescriptor() { return module; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassDescriptor.java index dfb15ae442a..f94107a7b79 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassDescriptor.java @@ -364,7 +364,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyEnti new Function0>() { @Override public Collection invoke() { - if (resolveSession.isClassSpecial(DescriptorUtils.getFqName(LazyClassDescriptor.this))) { + if (KotlinBuiltIns.isSpecialClassWithNoSupertypes(LazyClassDescriptor.this)) { return Collections.emptyList(); } diff --git a/compiler/tests/org/jetbrains/jet/test/util/DescriptorValidator.java b/compiler/tests/org/jetbrains/jet/test/util/DescriptorValidator.java index bec35a77670..0af2eeccb25 100644 --- a/compiler/tests/org/jetbrains/jet/test/util/DescriptorValidator.java +++ b/compiler/tests/org/jetbrains/jet/test/util/DescriptorValidator.java @@ -235,8 +235,7 @@ public class DescriptorValidator { Collection supertypes = descriptor.getTypeConstructor().getSupertypes(); if (supertypes.isEmpty() && descriptor.getKind() != ClassKind.TRAIT - && KotlinBuiltIns.getInstance().getAny() != descriptor - && KotlinBuiltIns.getInstance().getNothing() != descriptor) { + && !KotlinBuiltIns.isSpecialClassWithNoSupertypes(descriptor)) { report(collector, descriptor, "No supertypes for non-trait"); } validateTypes(descriptor, collector, supertypes); diff --git a/core/descriptors/src/org/jetbrains/jet/lang/types/lang/KotlinBuiltIns.java b/core/descriptors/src/org/jetbrains/jet/lang/types/lang/KotlinBuiltIns.java index 39f7516e540..a72af73e1f5 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/types/lang/KotlinBuiltIns.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/types/lang/KotlinBuiltIns.java @@ -27,6 +27,7 @@ import org.jetbrains.jet.lang.descriptors.impl.ValueParameterDescriptorImpl; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.ImportPath; import org.jetbrains.jet.lang.resolve.name.FqName; +import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.types.*; @@ -893,6 +894,12 @@ public class KotlinBuiltIns { // Recognized & special + public static boolean isSpecialClassWithNoSupertypes(@NotNull ClassDescriptor descriptor) { + FqNameUnsafe fqName = DescriptorUtils.getFqName(descriptor); + return BUILT_INS_PACKAGE_FQ_NAME.child(Name.identifier("Any")).toUnsafe().equals(fqName) || + BUILT_INS_PACKAGE_FQ_NAME.child(Name.identifier("Nothing")).toUnsafe().equals(fqName); + } + public boolean isNothing(@NotNull JetType type) { return isNothingOrNullableNothing(type) && !type.isNullable();