Introduce ClassDescriptor#getDefaultObjectDescriptor()
ClassDescriptor#getClassObjectDescriptor (with old semantics) is now a utility Process usages and replace with calls to a new method where appropriate
This commit is contained in:
@@ -1915,7 +1915,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> 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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -62,8 +62,8 @@ public class ClassContext extends FieldOwnerContext<ClassDescriptor> {
|
||||
|
||||
@Nullable
|
||||
public CodegenContext getClassObjectContext() {
|
||||
if (getContextDescriptor().getClassObjectDescriptor() != null) {
|
||||
return findChildContext(getContextDescriptor().getClassObjectDescriptor());
|
||||
if (getContextDescriptor().getDefaultObjectDescriptor() != null) {
|
||||
return findChildContext(getContextDescriptor().getDefaultObjectDescriptor());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
+1
-1
@@ -38,7 +38,7 @@ public interface ClassDescriptorWithResolutionScopes extends ClassDescriptor {
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
ClassDescriptorWithResolutionScopes getClassObjectDescriptor();
|
||||
ClassDescriptorWithResolutionScopes getDefaultObjectDescriptor();
|
||||
|
||||
@NotNull
|
||||
@ReadOnly
|
||||
|
||||
+1
-1
@@ -92,7 +92,7 @@ public class MutableClassDescriptor extends ClassDescriptorBase implements Class
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public MutableClassDescriptor getClassObjectDescriptor() {
|
||||
public MutableClassDescriptor getDefaultObjectDescriptor() {
|
||||
return classObjectDescriptor;
|
||||
}
|
||||
|
||||
|
||||
@@ -100,8 +100,8 @@ public class DeclarationResolver {
|
||||
|
||||
Collection<DeclarationDescriptor> allDescriptors = classDescriptor.getScopeForMemberLookup().getOwnDeclaredDescriptors();
|
||||
|
||||
ClassDescriptorWithResolutionScopes classObj = classDescriptor.getClassObjectDescriptor();
|
||||
if (classObj != null && DescriptorUtils.isClassObject(classObj)) {
|
||||
ClassDescriptorWithResolutionScopes classObj = classDescriptor.getDefaultObjectDescriptor();
|
||||
if (classObj != null) {
|
||||
Collection<DeclarationDescriptor> classObjDescriptors = classObj.getScopeForMemberLookup().getOwnDeclaredDescriptors();
|
||||
if (!classObjDescriptors.isEmpty()) {
|
||||
allDescriptors = Lists.newArrayList(allDescriptors);
|
||||
|
||||
@@ -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())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
+14
-27
@@ -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();
|
||||
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
-2
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user