[FIR] Handle explicitly private sealed class constructors properly
#KT-36850 Fixed
This commit is contained in:
+6
-8
@@ -6,7 +6,6 @@
|
|||||||
package org.jetbrains.kotlin.fir.lightTree.converter
|
package org.jetbrains.kotlin.fir.lightTree.converter
|
||||||
|
|
||||||
import com.intellij.lang.LighterASTNode
|
import com.intellij.lang.LighterASTNode
|
||||||
import com.intellij.lang.LighterASTTokenNode
|
|
||||||
import com.intellij.psi.TokenType
|
import com.intellij.psi.TokenType
|
||||||
import com.intellij.util.diff.FlyweightCapableTreeStructure
|
import com.intellij.util.diff.FlyweightCapableTreeStructure
|
||||||
import org.jetbrains.kotlin.KtNodeTypes.*
|
import org.jetbrains.kotlin.KtNodeTypes.*
|
||||||
@@ -638,14 +637,12 @@ class DeclarationsConverter(
|
|||||||
extractArgumentsFrom(classWrapper.superTypeCallEntry, stubMode)
|
extractArgumentsFrom(classWrapper.superTypeCallEntry, stubMode)
|
||||||
}
|
}
|
||||||
|
|
||||||
val status = FirDeclarationStatusImpl(
|
val explicitVisibility = if (primaryConstructor != null) modifiers.getVisibility() else null
|
||||||
if (primaryConstructor != null) modifiers.getVisibility() else defaultVisibility,
|
val status = FirDeclarationStatusImpl(explicitVisibility ?: defaultVisibility, Modality.FINAL).apply {
|
||||||
Modality.FINAL
|
|
||||||
).apply {
|
|
||||||
isExpect = modifiers.hasExpect()
|
isExpect = modifiers.hasExpect()
|
||||||
isActual = modifiers.hasActual()
|
isActual = modifiers.hasActual()
|
||||||
isInner = classWrapper.isInner()
|
isInner = classWrapper.isInner()
|
||||||
isFromSealedClass = classWrapper.isSealed()
|
isFromSealedClass = classWrapper.isSealed() && explicitVisibility !== Visibilities.PRIVATE
|
||||||
isFromEnumClass = classWrapper.isEnum()
|
isFromEnumClass = classWrapper.isEnum()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -711,11 +708,12 @@ class DeclarationsConverter(
|
|||||||
}
|
}
|
||||||
else classWrapper.delegatedSelfTypeRef
|
else classWrapper.delegatedSelfTypeRef
|
||||||
|
|
||||||
val status = FirDeclarationStatusImpl(modifiers.getVisibility(), Modality.FINAL).apply {
|
val explicitVisibility = modifiers.getVisibility()
|
||||||
|
val status = FirDeclarationStatusImpl(explicitVisibility, Modality.FINAL).apply {
|
||||||
isExpect = modifiers.hasExpect()
|
isExpect = modifiers.hasExpect()
|
||||||
isActual = modifiers.hasActual()
|
isActual = modifiers.hasActual()
|
||||||
isInner = classWrapper.isInner()
|
isInner = classWrapper.isInner()
|
||||||
isFromSealedClass = classWrapper.isSealed()
|
isFromSealedClass = classWrapper.isSealed() && explicitVisibility !== Visibilities.PRIVATE
|
||||||
isFromEnumClass = classWrapper.isEnum()
|
isFromEnumClass = classWrapper.isEnum()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -472,11 +472,12 @@ class RawFirBuilder(
|
|||||||
else -> Visibilities.UNKNOWN
|
else -> Visibilities.UNKNOWN
|
||||||
}
|
}
|
||||||
|
|
||||||
val status = FirDeclarationStatusImpl(this?.visibility ?: defaultVisibility(), Modality.FINAL).apply {
|
val explicitVisibility = this?.visibility
|
||||||
|
val status = FirDeclarationStatusImpl(explicitVisibility ?: defaultVisibility(), Modality.FINAL).apply {
|
||||||
isExpect = this@toFirConstructor?.hasExpectModifier() ?: false
|
isExpect = this@toFirConstructor?.hasExpectModifier() ?: false
|
||||||
isActual = this@toFirConstructor?.hasActualModifier() ?: false
|
isActual = this@toFirConstructor?.hasActualModifier() ?: false
|
||||||
isInner = owner.hasModifier(INNER_KEYWORD)
|
isInner = owner.hasModifier(INNER_KEYWORD)
|
||||||
isFromSealedClass = owner.hasModifier(SEALED_KEYWORD)
|
isFromSealedClass = owner.hasModifier(SEALED_KEYWORD) && explicitVisibility !== Visibilities.PRIVATE
|
||||||
isFromEnumClass = owner.hasModifier(ENUM_KEYWORD)
|
isFromEnumClass = owner.hasModifier(ENUM_KEYWORD)
|
||||||
}
|
}
|
||||||
return buildPrimaryConstructor {
|
return buildPrimaryConstructor {
|
||||||
@@ -846,11 +847,12 @@ class RawFirBuilder(
|
|||||||
source = this@toFirConstructor.toFirSourceElement()
|
source = this@toFirConstructor.toFirSourceElement()
|
||||||
session = baseSession
|
session = baseSession
|
||||||
returnTypeRef = delegatedSelfTypeRef
|
returnTypeRef = delegatedSelfTypeRef
|
||||||
status = FirDeclarationStatusImpl(visibility, Modality.FINAL).apply {
|
val explicitVisibility = visibility
|
||||||
|
status = FirDeclarationStatusImpl(explicitVisibility, Modality.FINAL).apply {
|
||||||
isExpect = hasExpectModifier()
|
isExpect = hasExpectModifier()
|
||||||
isActual = hasActualModifier()
|
isActual = hasActualModifier()
|
||||||
isInner = owner.hasModifier(INNER_KEYWORD)
|
isInner = owner.hasModifier(INNER_KEYWORD)
|
||||||
isFromSealedClass = owner.hasModifier(SEALED_KEYWORD)
|
isFromSealedClass = owner.hasModifier(SEALED_KEYWORD) && explicitVisibility !== Visibilities.PRIVATE
|
||||||
isFromEnumClass = owner.hasModifier(ENUM_KEYWORD)
|
isFromEnumClass = owner.hasModifier(ENUM_KEYWORD)
|
||||||
}
|
}
|
||||||
symbol = FirConstructorSymbol(callableIdForClassConstructor())
|
symbol = FirConstructorSymbol(callableIdForClassConstructor())
|
||||||
|
|||||||
@@ -1,3 +1,10 @@
|
|||||||
sealed class Foo(val value: String)
|
sealed class Foo(val value: String)
|
||||||
|
|
||||||
class Bar : Foo("OK")
|
class Bar : Foo("OK")
|
||||||
|
|
||||||
|
sealed class WithPrivateConstructor private constructor(val x: Int) {
|
||||||
|
private constructor() : this(42)
|
||||||
|
}
|
||||||
|
|
||||||
|
object First : <!INAPPLICABLE_CANDIDATE!>WithPrivateConstructor<!>() // error
|
||||||
|
object Second : <!INAPPLICABLE_CANDIDATE!>WithPrivateConstructor<!>(0) // error
|
||||||
@@ -14,3 +14,28 @@ FILE: sealedClass.kt
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
public sealed class WithPrivateConstructor : R|kotlin/Any| {
|
||||||
|
private constructor(x: R|kotlin/Int|): R|WithPrivateConstructor| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final val x: R|kotlin/Int| = R|<local>/x|
|
||||||
|
public get(): R|kotlin/Int|
|
||||||
|
|
||||||
|
private constructor(): R|WithPrivateConstructor| {
|
||||||
|
this<R|WithPrivateConstructor|>(Int(42))
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public final object First : R|WithPrivateConstructor| {
|
||||||
|
private constructor(): R|First| {
|
||||||
|
super<R|WithPrivateConstructor|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public final object Second : R|WithPrivateConstructor| {
|
||||||
|
private constructor(): R|Second| {
|
||||||
|
super<R|WithPrivateConstructor|>(IntegerLiteral(0))
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user