[FE] Allow declare sealed class inheritors in different files in one module

#KT-13495
This commit is contained in:
Dmitriy Novozhilov
2020-11-16 11:27:04 +03:00
committed by TeamCityServer
parent 1a377069dd
commit f5f1984a60
20 changed files with 222 additions and 13 deletions
@@ -35,10 +35,14 @@ import static org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt.getB
public class DescriptorFactory {
private static class DefaultClassConstructorDescriptor extends ClassConstructorDescriptorImpl {
public DefaultClassConstructorDescriptor(@NotNull ClassDescriptor containingClass, @NotNull SourceElement source) {
public DefaultClassConstructorDescriptor(
@NotNull ClassDescriptor containingClass,
@NotNull SourceElement source,
boolean freedomForSealedInterfacesSupported
) {
super(containingClass, null, Annotations.Companion.getEMPTY(), true, Kind.DECLARATION, source);
initialize(Collections.<ValueParameterDescriptor>emptyList(),
getDefaultConstructorVisibility(containingClass));
getDefaultConstructorVisibility(containingClass, freedomForSealedInterfacesSupported));
}
}
@@ -130,7 +134,11 @@ public class DescriptorFactory {
@NotNull ClassDescriptor containingClass,
@NotNull SourceElement source
) {
return new DefaultClassConstructorDescriptor(containingClass, source);
/*
* Language version settings are needed here only for computing default visibility of constructors of sealed classes
* Since object can not be sealed class it's OK to pass default settings here
*/
return new DefaultClassConstructorDescriptor(containingClass, source, false);
}
@NotNull
@@ -380,11 +380,21 @@ public class DescriptorUtils {
}
@NotNull
public static DescriptorVisibility getDefaultConstructorVisibility(@NotNull ClassDescriptor classDescriptor) {
public static DescriptorVisibility getDefaultConstructorVisibility(
@NotNull ClassDescriptor classDescriptor,
boolean freedomForSealedInterfacesSupported
) {
ClassKind classKind = classDescriptor.getKind();
if (classKind == ClassKind.ENUM_CLASS || classKind.isSingleton() || isSealedClass(classDescriptor)) {
if (classKind == ClassKind.ENUM_CLASS || classKind.isSingleton()) {
return DescriptorVisibilities.PRIVATE;
}
if (isSealedClass(classDescriptor)) {
if (freedomForSealedInterfacesSupported) {
return DescriptorVisibilities.INTERNAL;
} else {
return DescriptorVisibilities.PRIVATE;
}
}
if (isAnonymousObject(classDescriptor)) {
return DescriptorVisibilities.DEFAULT_VISIBILITY;
}