diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index 215852fa331..85f4a2c1ec7 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -1915,7 +1915,7 @@ public class ExpressionCodegen extends JetVisitor implem Type type = typeMapper.mapType((ClassDescriptor) enumClass); return StackValue.field(type, type, descriptor.getName().asString(), true, StackValue.none()); } - ClassDescriptor classObjectDescriptor = classDescriptor.getClassObjectDescriptor(); + ClassDescriptor classObjectDescriptor = classDescriptor.getDefaultObjectDescriptor(); if (classObjectDescriptor != null) { return StackValue.singleton(classObjectDescriptor, typeMapper); } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index 3a11a2f98a8..7ac19a1d67e 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -960,7 +960,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { private void generateFieldForSingleton() { if (isEnumEntry(descriptor) || isClassObject(descriptor)) return; - ClassDescriptor classObjectDescriptor = descriptor.getClassObjectDescriptor(); + ClassDescriptor classObjectDescriptor = descriptor.getDefaultObjectDescriptor(); ClassDescriptor fieldTypeDescriptor; JetClassOrObject original; if (isObject(descriptor)) { @@ -1022,7 +1022,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { private int putClassObjectInLocalVar(ExpressionCodegen codegen) { FrameMap frameMap = codegen.myFrameMap; - ClassDescriptor classObjectDescriptor = descriptor.getClassObjectDescriptor(); + ClassDescriptor classObjectDescriptor = descriptor.getDefaultObjectDescriptor(); int classObjectIndex = frameMap.getIndex(classObjectDescriptor); if (classObjectIndex == -1) { classObjectIndex = frameMap.enter(classObjectDescriptor, OBJECT_TYPE); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/ClassContext.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/ClassContext.java index 65571f6e690..f52126dc7df 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/ClassContext.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/ClassContext.java @@ -62,8 +62,8 @@ public class ClassContext extends FieldOwnerContext { @Nullable public CodegenContext getClassObjectContext() { - if (getContextDescriptor().getClassObjectDescriptor() != null) { - return findChildContext(getContextDescriptor().getClassObjectDescriptor()); + if (getContextDescriptor().getDefaultObjectDescriptor() != null) { + return findChildContext(getContextDescriptor().getDefaultObjectDescriptor()); } return null; } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/descriptors/ClassDescriptorWithResolutionScopes.java b/compiler/frontend/src/org/jetbrains/kotlin/descriptors/ClassDescriptorWithResolutionScopes.java index 7757e27cfe4..0602e762abd 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/descriptors/ClassDescriptorWithResolutionScopes.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/descriptors/ClassDescriptorWithResolutionScopes.java @@ -38,7 +38,7 @@ public interface ClassDescriptorWithResolutionScopes extends ClassDescriptor { @Nullable @Override - ClassDescriptorWithResolutionScopes getClassObjectDescriptor(); + ClassDescriptorWithResolutionScopes getDefaultObjectDescriptor(); @NotNull @ReadOnly diff --git a/compiler/frontend/src/org/jetbrains/kotlin/descriptors/impl/MutableClassDescriptor.java b/compiler/frontend/src/org/jetbrains/kotlin/descriptors/impl/MutableClassDescriptor.java index a66dfb3da07..0fea34a0573 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/descriptors/impl/MutableClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/descriptors/impl/MutableClassDescriptor.java @@ -92,7 +92,7 @@ public class MutableClassDescriptor extends ClassDescriptorBase implements Class @Nullable @Override - public MutableClassDescriptor getClassObjectDescriptor() { + public MutableClassDescriptor getDefaultObjectDescriptor() { return classObjectDescriptor; } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationResolver.java index 9ce9f5bbb2f..c0f4f1ee72e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationResolver.java @@ -100,8 +100,8 @@ public class DeclarationResolver { Collection allDescriptors = classDescriptor.getScopeForMemberLookup().getOwnDeclaredDescriptors(); - ClassDescriptorWithResolutionScopes classObj = classDescriptor.getClassObjectDescriptor(); - if (classObj != null && DescriptorUtils.isClassObject(classObj)) { + ClassDescriptorWithResolutionScopes classObj = classDescriptor.getDefaultObjectDescriptor(); + if (classObj != null) { Collection classObjDescriptors = classObj.getScopeForMemberLookup().getOwnDeclaredDescriptors(); if (!classObjDescriptors.isEmpty()) { allDescriptors = Lists.newArrayList(allDescriptors); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/Importer.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/Importer.kt index 36834ac0cb3..b5721da7ffc 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/Importer.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/Importer.kt @@ -38,8 +38,8 @@ public class Importer { allUnderImportScopes.add(descriptor.getStaticScope()) allUnderImportScopes.add(descriptor.getUnsubstitutedInnerClassesScope()) - val classObjectDescriptor = descriptor.getClassObjectDescriptor() - if (classObjectDescriptor != null && DescriptorUtils.isClassObject(classObjectDescriptor)) { + val classObjectDescriptor = descriptor.getDefaultObjectDescriptor() + if (classObjectDescriptor != null) { allUnderImportScopes.add(classObjectDescriptor.getUnsubstitutedInnerClassesScope()) } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolver.java index e3dd715ac80..9c947e3c3db 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolver.java @@ -276,8 +276,8 @@ public class QualifiedExpressionResolver { results.add(lookupSimpleNameReference(selector, descriptor.getStaticScope(), lookupMode, true)); - ClassDescriptor classObject = descriptor.getClassObjectDescriptor(); - if (classObject != null && !descriptor.getKind().isSingleton()) { + ClassDescriptor classObject = descriptor.getDefaultObjectDescriptor(); + if (classObject != null) { addResultsForClass(results, selector, lookupMode, classObject); } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java index 81d02caf936..15fff39e264 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java @@ -57,7 +57,6 @@ import java.util.*; import static org.jetbrains.kotlin.diagnostics.Errors.*; import static org.jetbrains.kotlin.resolve.BindingContext.TYPE; -import static org.jetbrains.kotlin.resolve.DescriptorUtils.isSyntheticClassObject; import static org.jetbrains.kotlin.resolve.ModifiersChecker.*; import static org.jetbrains.kotlin.resolve.source.SourcePackage.toSourceElement; @@ -130,9 +129,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes } boolean isLocal = classOrObject != null && JetPsiUtil.isLocal(classOrObject); - this.visibility = isSyntheticClassObject(this) - ? DescriptorUtils.getSyntheticClassObjectVisibility() - : isLocal ? Visibilities.LOCAL : resolveVisibilityFromModifiers(modifierList, getDefaultClassVisibility(this)); + this.visibility = isLocal ? Visibilities.LOCAL : resolveVisibilityFromModifiers(modifierList, getDefaultClassVisibility(this)); this.isInner = isInnerClass(modifierList) && !ModifiersChecker.isIllegalInner(this); StorageManager storageManager = c.getStorageManager(); @@ -269,8 +266,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes thisScope.setImplicitReceiver(this.getThisAsReceiverParameter()); thisScope.changeLockLevel(WritableScope.LockLevel.READING); - //TODO: - ClassDescriptor classObject = getClassObjectDescriptor(); + ClassDescriptor classObject = getDefaultObjectDescriptor(); JetScope classObjectAdapterScope = (classObject != null) ? new ClassObjectMixinScope(classObject) : JetScope.Empty.INSTANCE$; return new ChainedScope( @@ -350,7 +346,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes } @Override - public LazyClassDescriptor getClassObjectDescriptor() { + public LazyClassDescriptor getDefaultObjectDescriptor() { return classObjectDescriptor.invoke(); } @@ -381,26 +377,18 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes @Nullable private LazyClassDescriptor computeClassObjectDescriptor(@Nullable JetObjectDeclaration classObject) { JetClassLikeInfo classObjectInfo = getClassObjectInfo(classObject); - if (classObjectInfo instanceof JetClassOrObjectInfo) { - Name name = ((JetClassOrObjectInfo) classObjectInfo).getName(); - assert name != null; - ClassifierDescriptor classObjectDescriptor = getScopeForMemberLookup().getClassifier(name); - if (classObjectDescriptor instanceof LazyClassDescriptor) { - return (LazyClassDescriptor) classObjectDescriptor; - } - else { - return null; - } + if (!(classObjectInfo instanceof JetClassOrObjectInfo)) { + return null; } - if (getKind() == ClassKind.CLASS_OBJECT || getKind() == ClassKind.OBJECT) { - return this; + Name name = ((JetClassOrObjectInfo) classObjectInfo).getName(); + assert name != null; + ClassifierDescriptor classObjectDescriptor = getScopeForMemberLookup().getClassifier(name); + if (classObjectDescriptor instanceof LazyClassDescriptor) { + return (LazyClassDescriptor) classObjectDescriptor; } - if (getKind() == ClassKind.ENUM_ENTRY) { - DeclarationDescriptor containingDeclaration = getContainingDeclaration(); - assert containingDeclaration instanceof ClassDescriptor && ((ClassDescriptor) containingDeclaration).getKind() == ClassKind.ENUM_CLASS; - return (LazyClassDescriptor) containingDeclaration; + else { + return null; } - return null; } @Nullable @@ -473,8 +461,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes private void doForceResolveAllContents() { resolveMemberHeaders(); - //TODO: - ClassDescriptor classObjectDescriptor = getClassObjectDescriptor(); + ClassDescriptor classObjectDescriptor = getDefaultObjectDescriptor(); if (classObjectDescriptor != null) { ForceResolveUtil.forceResolveAllContents(classObjectDescriptor); } @@ -490,7 +477,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes ForceResolveUtil.forceResolveAllContents(getAnnotations()); ForceResolveUtil.forceResolveAllContents(getDanglingAnnotations()); - getClassObjectDescriptor(); + getDefaultObjectDescriptor(); getDescriptorsForExtraClassObjects(); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/Qualifier.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/Qualifier.kt index 2a3fcfda04f..16e5f62cace 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/Qualifier.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/Qualifier.kt @@ -34,6 +34,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.getClassObjectReferenceTarget import org.jetbrains.kotlin.psi.JetExpression import org.jetbrains.kotlin.resolve.bindingContextUtil.recordScopeAndDataFlowInfo import kotlin.properties.Delegates +import org.jetbrains.kotlin.resolve.descriptorUtil.classObjectDescriptor public trait Qualifier: ReceiverValue { @@ -81,8 +82,8 @@ class QualifierReceiver ( if (classifier is ClassDescriptor) { scopes.add(classifier.getStaticScope()) - val classObjectDescriptor = classifier.getClassObjectDescriptor() - if (classObjectDescriptor != null && DescriptorUtils.isClassObject(classObjectDescriptor)) { + val classObjectDescriptor = classifier.getDefaultObjectDescriptor() + if (classObjectDescriptor != null) { // non-static members are resolved through class object receiver scopes.add(DescriptorUtils.getStaticNestedClassesScope(classObjectDescriptor)) } @@ -145,7 +146,7 @@ private fun QualifierReceiver.resolveAsReceiverInQualifiedExpression(context: Ex if (classifier is TypeParameterDescriptor) { context.trace.report(TYPE_PARAMETER_ON_LHS_OF_DOT.on(referenceExpression, classifier as TypeParameterDescriptor)) } - else if (classifier is ClassDescriptor && classifier.getClassObjectDescriptor() != null) { + else if (classifier is ClassDescriptor && classifier.classObjectDescriptor != null) { context.trace.record(EXPRESSION_TYPE, referenceExpression, classifier.getClassObjectType()) } } @@ -173,7 +174,7 @@ private fun QualifierReceiver.resolveReferenceTarget(selector: DeclarationDescri if (classifier != null && containingDeclaration is ClassDescriptor && classifier == containingDeclaration) { return classifier } - if (classifier is ClassDescriptor && classifier.getClassObjectDescriptor() != null) { + if (classifier is ClassDescriptor && classifier.classObjectDescriptor != null) { return classifier.getClassObjectReferenceTarget() } diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.java index a949a6728b4..fa21943e785 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.java @@ -30,7 +30,6 @@ import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler; import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles; import org.jetbrains.kotlin.cli.jvm.compiler.JetCoreEnvironment; import org.jetbrains.kotlin.config.CompilerConfiguration; -import org.jetbrains.kotlin.descriptors.ClassDescriptor; import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; import org.jetbrains.kotlin.descriptors.PackageViewDescriptor; import org.jetbrains.kotlin.resolve.BindingContext; @@ -146,7 +145,6 @@ public class CompileKotlinAgainstCustomBinariesTest extends TestCaseWithTmpdir { for (DeclarationDescriptor descriptor : allDescriptors) { assertTrue("Wrong name: " + descriptor, descriptor.getName().asString().equals("Lol")); assertTrue("Should be an object: " + descriptor, isObject(descriptor)); - assertNotNull("Object should have a class object: " + descriptor, ((ClassDescriptor) descriptor).getClassObjectDescriptor()); } } diff --git a/compiler/tests/org/jetbrains/kotlin/resolve/annotation/AbstractAnnotationDescriptorResolveTest.java b/compiler/tests/org/jetbrains/kotlin/resolve/annotation/AbstractAnnotationDescriptorResolveTest.java index 82b44e9eab2..ecc3bfe8cfe 100644 --- a/compiler/tests/org/jetbrains/kotlin/resolve/annotation/AbstractAnnotationDescriptorResolveTest.java +++ b/compiler/tests/org/jetbrains/kotlin/resolve/annotation/AbstractAnnotationDescriptorResolveTest.java @@ -201,7 +201,7 @@ public abstract class AbstractAnnotationDescriptorResolveTest extends JetLiteFix @NotNull private static ClassDescriptor getClassObjectDescriptor(@NotNull ClassDescriptor classDescriptor) { - ClassDescriptor objectDescriptor = classDescriptor.getClassObjectDescriptor(); + ClassDescriptor objectDescriptor = classDescriptor.getDefaultObjectDescriptor(); assert objectDescriptor != null : "Cannot find class object for class " + classDescriptor.getName(); return objectDescriptor; } diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassDescriptor.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassDescriptor.kt index 7f69f55e95b..8b7f3fa55b0 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassDescriptor.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassDescriptor.kt @@ -85,8 +85,7 @@ class LazyJavaClassDescriptor( override fun getUnsubstitutedPrimaryConstructor(): ConstructorDescriptor? = null - override fun getClassObjectDescriptor(): ClassDescriptor? = null - override fun getClassObjectType(): JetType? = getClassObjectDescriptor()?.let { d -> d.getDefaultType() } + override fun getDefaultObjectDescriptor(): ClassDescriptor? = null override fun getConstructors() = scopeForMemberLookup.constructors() diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassDescriptor.java index 14f1ddcfb64..5c6e2a7019d 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassDescriptor.java @@ -60,8 +60,11 @@ public interface ClassDescriptor extends ClassifierDescriptor, MemberDescriptor, @Override JetType getClassObjectType(); + /** + * @return nested object declared as 'default' if one is present. + */ @Nullable - ClassDescriptor getClassObjectDescriptor(); + ClassDescriptor getDefaultObjectDescriptor(); @NotNull ClassKind getKind(); diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractClassDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractClassDescriptor.java index 982cf7125c1..dca8c29e865 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractClassDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractClassDescriptor.java @@ -21,6 +21,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.name.Name; +import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilPackage; import org.jetbrains.kotlin.resolve.scopes.InnerClassesScopeWrapper; import org.jetbrains.kotlin.resolve.scopes.JetScope; import org.jetbrains.kotlin.resolve.scopes.SubstitutingScope; @@ -31,8 +32,6 @@ import org.jetbrains.kotlin.types.*; import java.util.List; import java.util.Map; -import static org.jetbrains.kotlin.resolve.DescriptorUtils.isEnumClass; - public abstract class AbstractClassDescriptor implements ClassDescriptor { private final Name name; protected final NotNullLazyValue defaultType; @@ -79,7 +78,7 @@ public abstract class AbstractClassDescriptor implements ClassDescriptor { @Nullable @Override public JetType getClassObjectType() { - ClassDescriptor classObject = getClassObjectDescriptor(); + ClassDescriptor classObject = DescriptorUtilPackage.getClassObjectDescriptor(this); return classObject == null ? null : classObject.getDefaultType(); } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ClassDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ClassDescriptorImpl.java index 402e53b0067..9bc9bfad73d 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ClassDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ClassDescriptorImpl.java @@ -101,7 +101,7 @@ public class ClassDescriptorImpl extends ClassDescriptorBase { @Nullable @Override - public ClassDescriptor getClassObjectDescriptor() { + public ClassDescriptor getDefaultObjectDescriptor() { return null; } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/EnumEntrySyntheticClassDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/EnumEntrySyntheticClassDescriptor.java index 164e60a7b9d..834f019bdd8 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/EnumEntrySyntheticClassDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/EnumEntrySyntheticClassDescriptor.java @@ -47,7 +47,6 @@ public class EnumEntrySyntheticClassDescriptor extends ClassDescriptorBase { private final ConstructorDescriptor primaryConstructor; private final JetScope scope; private final JetScope staticScope = new StaticScopeForKotlinClass(this); - private final ClassDescriptor classObjectDescriptor; private final NotNullLazyValue> enumMemberNames; /** @@ -88,8 +87,6 @@ public class EnumEntrySyntheticClassDescriptor extends ClassDescriptorBase { ConstructorDescriptorImpl primaryConstructor = DescriptorFactory.createPrimaryConstructorForObject(this, source); primaryConstructor.setReturnType(getDefaultType()); this.primaryConstructor = primaryConstructor; - - this.classObjectDescriptor = containingClass; } @NotNull @@ -118,8 +115,8 @@ public class EnumEntrySyntheticClassDescriptor extends ClassDescriptorBase { @Nullable @Override - public ClassDescriptor getClassObjectDescriptor() { - return classObjectDescriptor; + public ClassDescriptor getDefaultObjectDescriptor() { + return null; } @NotNull diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazySubstitutingClassDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazySubstitutingClassDescriptor.java index a2963a1261f..e3bb4f4c01b 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazySubstitutingClassDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazySubstitutingClassDescriptor.java @@ -169,8 +169,8 @@ public class LazySubstitutingClassDescriptor implements ClassDescriptor { } @Override - public ClassDescriptor getClassObjectDescriptor() { - return original.getClassObjectDescriptor(); + public ClassDescriptor getDefaultObjectDescriptor() { + return original.getDefaultObjectDescriptor(); } @NotNull diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.java b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.java index 6e920492aa2..f5552ad97e1 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.java +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.java @@ -320,10 +320,6 @@ public class DescriptorUtils { return superClassDescriptor.equals(KotlinBuiltIns.getInstance().getAny()); } - public static boolean isSyntheticClassObject(@NotNull DeclarationDescriptor descriptor) { - return isClassObject(descriptor) && isSingleton(descriptor.getContainingDeclaration()); - } - @NotNull public static Visibility getDefaultConstructorVisibility(@NotNull ClassDescriptor classDescriptor) { ClassKind classKind = classDescriptor.getKind(); @@ -337,11 +333,6 @@ public class DescriptorUtils { return Visibilities.PUBLIC; } - @NotNull - public static Visibility getSyntheticClassObjectVisibility() { - return Visibilities.PUBLIC; - } - @Nullable public static ClassDescriptor getInnerClassByName(@NotNull ClassDescriptor classDescriptor, @NotNull String innerClassName) { ClassifierDescriptor classifier = classDescriptor.getDefaultType().getMemberScope().getClassifier(Name.identifier(innerClassName)); diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt index 6e57db0391a..520ebb956be 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt @@ -22,12 +22,7 @@ import org.jetbrains.kotlin.descriptors.ClassKind.* import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.ClassId -public fun ClassDescriptor.getClassObjectReferenceTarget(): ClassDescriptor { - val classObjectDescriptor = getClassObjectDescriptor() - return if (classObjectDescriptor == null || hasSyntheticClassObject()) this else classObjectDescriptor -} - -public fun ClassDescriptor.hasSyntheticClassObject(): Boolean = getKind() in setOf(ENUM_ENTRY, OBJECT) +public fun ClassDescriptor.getClassObjectReferenceTarget(): ClassDescriptor = getDefaultObjectDescriptor() ?: this public fun DeclarationDescriptor.getImportableDescriptor(): DeclarationDescriptor { return when { @@ -59,4 +54,18 @@ public val ClassDescriptor.classId: ClassId return owner.classId.createNestedClassId(getName()) } throw IllegalStateException("Illegal container: $owner") + } + +/** If a literal of this class can be used as a value returns the class which represents the type of this value */ +public val ClassDescriptor.classObjectDescriptor: ClassDescriptor? + get() { + return when (this.getKind()) { + CLASS_OBJECT, OBJECT -> this + ENUM_ENTRY -> { + val container = this.getContainingDeclaration() + assert(container is ClassDescriptor && container.getKind() == ENUM_CLASS) + container as ClassDescriptor + } + else -> getDefaultObjectDescriptor() + } } \ No newline at end of file diff --git a/core/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.java b/core/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.java index b051525f132..76546a31abc 100644 --- a/core/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.java +++ b/core/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.java @@ -130,8 +130,8 @@ public class DescriptorSerializer { } } - ClassDescriptor classObject = classDescriptor.getClassObjectDescriptor(); - if (classObject != null && isClassObject(classObject)) { + ClassDescriptor classObject = classDescriptor.getDefaultObjectDescriptor(); + if (classObject != null) { builder.setClassObjectName(stringTable.getSimpleNameIndex(classObject.getName())); } diff --git a/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt b/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt index eb77bd54eb7..0b2e044bbca 100644 --- a/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt +++ b/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt @@ -110,16 +110,13 @@ public class DeserializedClassDescriptor( } private fun computeClassObjectDescriptor(): ClassDescriptor? { - if (getKind() == ClassKind.OBJECT || getKind() == ClassKind.CLASS_OBJECT) { - return this - } if (!classProto.hasClassObjectName()) return null val classObjectName = c.nameResolver.getName(classProto.getClassObjectName()) return memberScope.getClassifier(classObjectName) as? ClassDescriptor } - override fun getClassObjectDescriptor(): ClassDescriptor? = classObjectDescriptor() + override fun getDefaultObjectDescriptor(): ClassDescriptor? = classObjectDescriptor() private fun computeSuperTypes(): Collection { val supertypes = ArrayList(classProto.getSupertypeCount()) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/DecompiledTextFactory.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/DecompiledTextFactory.kt index ac1c3790b8f..85f2444f958 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/DecompiledTextFactory.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/DecompiledTextFactory.kt @@ -25,7 +25,6 @@ import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.renderer.DescriptorRendererBuilder import java.util.* import org.jetbrains.kotlin.resolve.DescriptorUtils.isEnumEntry -import org.jetbrains.kotlin.resolve.DescriptorUtils.isSyntheticClassObject import org.jetbrains.kotlin.types.error.MissingDependencyErrorClass import org.jetbrains.kotlin.resolve.dataClassUtils.isComponentLike import org.jetbrains.kotlin.types.isFlexible @@ -147,8 +146,8 @@ private fun buildDecompiledText(packageFqName: FqName, descriptors: List