Improved error message for 'nested class should be qualified'
This commit is contained in:
@@ -102,14 +102,8 @@ public class DescriptorUtils {
|
||||
|
||||
@NotNull
|
||||
private static FqNameUnsafe getFqNameUnsafe(@NotNull DeclarationDescriptor descriptor) {
|
||||
DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration();
|
||||
|
||||
if (containingDeclaration instanceof ClassDescriptor && ((ClassDescriptor) containingDeclaration).getKind() == ClassKind.CLASS_OBJECT) {
|
||||
DeclarationDescriptor classOfClassObject = containingDeclaration.getContainingDeclaration();
|
||||
assert classOfClassObject != null;
|
||||
return getFqName(classOfClassObject).child(descriptor.getName());
|
||||
}
|
||||
|
||||
DeclarationDescriptor containingDeclaration = getContainingDeclarationSkippingClassObjects(descriptor);
|
||||
assert containingDeclaration != null : "Not package/module descriptor doesn't have containing declaration: " + descriptor;
|
||||
return getFqName(containingDeclaration).child(descriptor.getName());
|
||||
}
|
||||
|
||||
@@ -117,6 +111,22 @@ public class DescriptorUtils {
|
||||
return descriptor.getContainingDeclaration() instanceof PackageFragmentDescriptor;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static DeclarationDescriptor getContainingDeclarationSkippingClassObjects(@NotNull DeclarationDescriptor descriptor) {
|
||||
DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration();
|
||||
return isClassObject(containingDeclaration) ? containingDeclaration.getContainingDeclaration() : containingDeclaration;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static FqName getFqNameFromTopLevelClass(@NotNull DeclarationDescriptor descriptor) {
|
||||
DeclarationDescriptor containingDeclaration = getContainingDeclarationSkippingClassObjects(descriptor);
|
||||
Name name = descriptor.getName();
|
||||
if (!(containingDeclaration instanceof ClassDescriptor)) {
|
||||
return FqName.topLevel(name);
|
||||
}
|
||||
return getFqNameFromTopLevelClass(containingDeclaration).child(name);
|
||||
}
|
||||
|
||||
// WARNING! Don't use this method in JVM backend, use JvmCodegenUtil.isCallInsideSameModuleAsDeclared() instead.
|
||||
// The latter handles compilation against compiled part of our module correctly.
|
||||
public static boolean areInSameModule(@NotNull DeclarationDescriptor first, @NotNull DeclarationDescriptor second) {
|
||||
@@ -202,7 +212,7 @@ public class DescriptorUtils {
|
||||
return descriptor instanceof AnonymousFunctionDescriptor;
|
||||
}
|
||||
|
||||
public static boolean isClassObject(@NotNull DeclarationDescriptor descriptor) {
|
||||
public static boolean isClassObject(@Nullable DeclarationDescriptor descriptor) {
|
||||
return isKindOf(descriptor, ClassKind.CLASS_OBJECT);
|
||||
}
|
||||
|
||||
|
||||
@@ -20,6 +20,9 @@ import org.jetbrains.jet.lang.descriptors.ClassDescriptor
|
||||
import org.jetbrains.jet.lang.descriptors.ClassKind.ENUM_ENTRY
|
||||
import org.jetbrains.jet.lang.descriptors.ClassKind.ENUM_CLASS
|
||||
import org.jetbrains.jet.lang.descriptors.ClassKind.OBJECT
|
||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
|
||||
import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor
|
||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils
|
||||
|
||||
|
||||
public fun ClassDescriptor.getClassObjectReferenceTarget(): ClassDescriptor {
|
||||
@@ -27,4 +30,7 @@ public fun ClassDescriptor.getClassObjectReferenceTarget(): ClassDescriptor {
|
||||
return if (classObjectDescriptor == null || hasSyntheticClassObject()) this else classObjectDescriptor
|
||||
}
|
||||
|
||||
public fun ClassDescriptor.hasSyntheticClassObject(): Boolean = getKind() in setOf(ENUM_ENTRY, ENUM_CLASS, OBJECT)
|
||||
public fun ClassDescriptor.hasSyntheticClassObject(): Boolean = getKind() in setOf(ENUM_ENTRY, ENUM_CLASS, OBJECT)
|
||||
|
||||
public fun DeclarationDescriptor.getImportableDescriptor(): DeclarationDescriptor =
|
||||
if (this is ConstructorDescriptor || DescriptorUtils.isClassObject(this)) getContainingDeclaration()!! else this
|
||||
|
||||
Reference in New Issue
Block a user