diff --git a/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/resolve/KotlinClassifiersCache.kt b/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/resolve/KotlinClassifiersCache.kt index dbf128ce3d6..d9e23b02dd3 100644 --- a/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/resolve/KotlinClassifiersCache.kt +++ b/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/resolve/KotlinClassifiersCache.kt @@ -158,6 +158,8 @@ class MockKotlinClassifier(override val classId: ClassId, override val isAnnotationType get() = shouldNotBeCalled() override val isEnum get() = shouldNotBeCalled() override val isRecord get() = shouldNotBeCalled() + override val isSealed: Boolean get() = shouldNotBeCalled() + override val permittedTypes: Collection get() = shouldNotBeCalled() override val methods get() = shouldNotBeCalled() override val fields get() = shouldNotBeCalled() override val constructors get() = shouldNotBeCalled() diff --git a/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/wrappers/symbols/FakeSymbolBasedClass.kt b/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/wrappers/symbols/FakeSymbolBasedClass.kt index a1c37ddff5b..a59c094bfe7 100644 --- a/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/wrappers/symbols/FakeSymbolBasedClass.kt +++ b/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/wrappers/symbols/FakeSymbolBasedClass.kt @@ -68,6 +68,11 @@ class FakeSymbolBasedClass( override val isRecord: Boolean get() = false override val recordComponents: Collection get() = emptyList() + + override val isSealed: Boolean get() = false + + override val permittedTypes: Collection get() = emptyList() + override val lightClassOriginKind: LightClassOriginKind? get() = null override val methods: Collection get() = emptyList() diff --git a/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/wrappers/symbols/SymbolBasedClass.kt b/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/wrappers/symbols/SymbolBasedClass.kt index e731f775ec9..16dddafab71 100644 --- a/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/wrappers/symbols/SymbolBasedClass.kt +++ b/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/wrappers/symbols/SymbolBasedClass.kt @@ -107,6 +107,13 @@ class SymbolBasedClass( override val isEnum: Boolean get() = element.kind == ElementKind.ENUM + // TODO + override val isSealed: Boolean + get() = false + + override val permittedTypes: Collection + get() = emptyList() + override val lightClassOriginKind: LightClassOriginKind? get() = null diff --git a/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/wrappers/trees/TreeBasedClass.kt b/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/wrappers/trees/TreeBasedClass.kt index 686ba9f0201..cfb50104589 100644 --- a/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/wrappers/trees/TreeBasedClass.kt +++ b/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/wrappers/trees/TreeBasedClass.kt @@ -118,6 +118,13 @@ class TreeBasedClass( override val isRecord: Boolean get() = false + // TODO + override val isSealed: Boolean + get() = false + + override val permittedTypes: Collection + get() = emptyList() + override val lightClassOriginKind: LightClassOriginKind? get() = null diff --git a/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/JavaClassImpl.kt b/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/JavaClassImpl.kt index 359e4e5a2dc..96c8ca301f8 100644 --- a/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/JavaClassImpl.kt +++ b/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/JavaClassImpl.kt @@ -59,6 +59,12 @@ class JavaClassImpl(psiClass: PsiClass) : JavaClassifierImpl(psiClass) override val isEnum: Boolean get() = psi.isEnum + override val isSealed: Boolean + get() = JavaElementUtil.isSealed(this) + + override val permittedTypes: Collection + get() = classifierTypes(psi.permitsListTypes) + override val isRecord: Boolean get() = psi.isRecord diff --git a/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/JavaElementUtil.java b/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/JavaElementUtil.java index 173cbd51253..fde0178de4f 100644 --- a/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/JavaElementUtil.java +++ b/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/JavaElementUtil.java @@ -52,6 +52,10 @@ import static org.jetbrains.kotlin.load.java.structure.impl.JavaElementCollectio return owner.getPsi().hasModifierProperty(PsiModifier.FINAL); } + public static boolean isSealed(@NotNull JavaModifierListOwnerImpl owner) { + return owner.getPsi().hasModifierProperty(PsiModifier.SEALED); + } + @NotNull public static Visibility getVisibility(@NotNull JavaModifierListOwnerImpl owner) { PsiModifierListOwner psiOwner = owner.getPsi(); diff --git a/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaClass.kt b/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaClass.kt index 73e75d17baa..3dbf87805b9 100644 --- a/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaClass.kt +++ b/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaClass.kt @@ -70,6 +70,9 @@ class BinaryJavaClass( override val lightClassOriginKind: LightClassOriginKind? get() = null + override val isSealed: Boolean get() = permittedTypes.isNotEmpty() + override val permittedTypes = arrayListOf() + override fun isFromSourceCodeInScope(scope: SearchScope): Boolean = false override fun visitEnd() { @@ -233,4 +236,8 @@ class BinaryJavaClass( ) } } + + override fun visitPermittedSubtypeExperimental(permittedSubtype: String?) { + permittedTypes.addIfNotNull(permittedSubtype?.convertInternalNameToClassifierType()) + } } diff --git a/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/structure/javaElements.kt b/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/structure/javaElements.kt index 72700425946..15d34def2c8 100644 --- a/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/structure/javaElements.kt +++ b/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/structure/javaElements.kt @@ -86,6 +86,8 @@ interface JavaClass : JavaClassifier, JavaTypeParameterListOwner, JavaModifierLi val isAnnotationType: Boolean val isEnum: Boolean val isRecord: Boolean + val isSealed: Boolean + val permittedTypes: Collection val lightClassOriginKind: LightClassOriginKind? val methods: Collection diff --git a/core/descriptors.runtime/src/org/jetbrains/kotlin/descriptors/runtime/structure/ReflectJavaClass.kt b/core/descriptors.runtime/src/org/jetbrains/kotlin/descriptors/runtime/structure/ReflectJavaClass.kt index f98ca3118f9..a8606dfb2ac 100644 --- a/core/descriptors.runtime/src/org/jetbrains/kotlin/descriptors/runtime/structure/ReflectJavaClass.kt +++ b/core/descriptors.runtime/src/org/jetbrains/kotlin/descriptors/runtime/structure/ReflectJavaClass.kt @@ -122,6 +122,12 @@ class ReflectJavaClass( override val isRecord: Boolean get() = false + override val isSealed: Boolean + get() = false + + override val permittedTypes: Collection + get() = emptyList() + override fun equals(other: Any?) = other is ReflectJavaClass && klass == other.klass override fun hashCode() = klass.hashCode()