From cd9898fc431b960879841078bd06589a8ae1bdde Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 13 Feb 2015 22:52:29 +0300 Subject: [PATCH] Minor, rename and invert meaning of ClassId.isTopLevelClass Also use a simpler constructor and simplify ClassDeserializer.ClassKey --- .../kotlin/load/java/JvmAnnotationNames.java | 3 +-- .../src/org/jetbrains/kotlin/name/ClassId.java | 4 ++-- .../org/jetbrains/kotlin/types/flexibleTypes.kt | 4 +--- .../deserialization/ClassDeserializer.kt | 15 +++++++-------- .../decompiler/stubBuilder/ClassClsStubBuilder.kt | 4 ++-- 5 files changed, 13 insertions(+), 17 deletions(-) diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/JvmAnnotationNames.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/JvmAnnotationNames.java index f22e6aefcd9..d1fe4ad456f 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/JvmAnnotationNames.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/JvmAnnotationNames.java @@ -20,7 +20,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.FqName; -import org.jetbrains.kotlin.name.FqNameUnsafe; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.resolve.jvm.JvmClassName; @@ -47,7 +46,7 @@ public final class JvmAnnotationNames { public static class KotlinSyntheticClass { public static final JvmClassName CLASS_NAME = JvmClassName.byInternalName("kotlin/jvm/internal/KotlinSyntheticClass"); public static final ClassId KIND_CLASS_ID = - new ClassId(new FqName("kotlin.jvm.internal"), new FqNameUnsafe("KotlinSyntheticClass.Kind")); + ClassId.topLevel(CLASS_NAME.getFqNameForClassNameWithoutDollars()).createNestedClassId(Name.identifier("Kind")); public static final String KIND_INTERNAL_NAME = JvmClassName.byClassId(KIND_CLASS_ID).getInternalName(); public static final Name KIND_FIELD_NAME = Name.identifier("kind"); diff --git a/core/descriptors/src/org/jetbrains/kotlin/name/ClassId.java b/core/descriptors/src/org/jetbrains/kotlin/name/ClassId.java index f0adea53235..1d1f7bf13b1 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/name/ClassId.java +++ b/core/descriptors/src/org/jetbrains/kotlin/name/ClassId.java @@ -57,8 +57,8 @@ public final class ClassId { return new ClassId(getPackageFqName(), relativeClassName.parent()); } - public boolean isTopLevelClass() { - return relativeClassName.parent().isRoot(); + public boolean isNestedClass() { + return !relativeClassName.parent().isRoot(); } @NotNull diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/flexibleTypes.kt b/core/descriptors/src/org/jetbrains/kotlin/types/flexibleTypes.kt index 6e05077a5fb..4e10c7c353b 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/flexibleTypes.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/flexibleTypes.kt @@ -21,8 +21,6 @@ import org.jetbrains.kotlin.types.Approximation.DataFlowExtras import org.jetbrains.kotlin.name.FqName import kotlin.platform.platformStatic import org.jetbrains.kotlin.name.ClassId -import org.jetbrains.kotlin.name.FqNameUnsafe -import org.jetbrains.kotlin.name.Name public trait FlexibleTypeCapabilities { fun getCapability(capabilityClass: Class, jetType: JetType, flexibility: Flexibility): T? @@ -40,7 +38,7 @@ public trait Flexibility : TypeCapability, SubtypingRepresentatives { // it creates a flexible type, e.g. (Foo..Foo?). // This is used in tests and Evaluate Expression to have flexible types in the code, // but normal users should not be referencing this classifier - public val FLEXIBLE_TYPE_CLASSIFIER: ClassId = ClassId(FqName("kotlin.internal.flexible"), FqNameUnsafe.topLevel(Name.identifier("ft"))) + public val FLEXIBLE_TYPE_CLASSIFIER: ClassId = ClassId.topLevel(FqName("kotlin.internal.flexible.ft")) } // lowerBound is a subtype of upperBound diff --git a/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDeserializer.kt b/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDeserializer.kt index 6092be3cb46..edec8bfe9bb 100644 --- a/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDeserializer.kt +++ b/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDeserializer.kt @@ -31,21 +31,20 @@ public class ClassDeserializer(private val components: DeserializationComponents private fun createClass(key: ClassKey): DeserializedClassDescriptor? { val classId = key.classId val classData = key.classData ?: components.classDataFinder.findClassData(classId) ?: return null - val outerContext = if (classId.isTopLevelClass()) { + val outerContext = if (classId.isNestedClass()) { + deserializeClass(classId.getOuterClassId())?.c ?: return null + } + else { val fragments = components.packageFragmentProvider.getPackageFragments(classId.getPackageFqName()) assert(fragments.size() == 1) { "There should be exactly one package: $fragments, class id is $classId" } components.createContext(fragments.single(), classData.getNameResolver()) } - else { - deserializeClass(classId.getOuterClassId())?.c ?: return null - } return DeserializedClassDescriptor(outerContext, classData.getClassProto(), classData.getNameResolver()) } - private inner class ClassKey(val classId: ClassId, val classData: ClassData?) { - override fun equals(other: Any?): Boolean = other is ClassKey && classId == other.classId - override fun hashCode(): Int = classId.hashCode() - override fun toString(): String = classId.toString() + private data class ClassKey(val classId: ClassId, classData: ClassData?) { + // This property is not declared in the constructor because it shouldn't participate in equals/hashCode + val classData: ClassData? = classData } } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClassClsStubBuilder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClassClsStubBuilder.kt index bc03a69920c..165304fbfe1 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClassClsStubBuilder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClassClsStubBuilder.kt @@ -111,7 +111,7 @@ private class ClassClsStubBuilder( ProtoBuf.Class.Kind.OBJECT, ProtoBuf.Class.Kind.CLASS_OBJECT -> { KotlinObjectStubImpl( parentStub, shortName, fqName, superTypeRefs, - isTopLevel = classId.isTopLevelClass(), + isTopLevel = !classId.isNestedClass(), isClassObject = isClassObject, isLocal = false, isObjectLiteral = false @@ -127,7 +127,7 @@ private class ClassClsStubBuilder( isTrait = classKind == ProtoBuf.Class.Kind.TRAIT, isEnumEntry = classKind == ProtoBuf.Class.Kind.ENUM_ENTRY, isLocal = false, - isTopLevel = classId.isTopLevelClass() + isTopLevel = !classId.isNestedClass() ) } }