FIR: add 'isInner' parameter to constructors

This is helpful because inner class constructors are resolved in a bit
different way (like non-static vs static)
This commit is contained in:
Mikhail Glukhikh
2019-10-04 15:39:51 +03:00
parent aad9cbbf01
commit 26e8202771
10 changed files with 27 additions and 3 deletions
@@ -229,7 +229,8 @@ class JavaSymbolProvider(
val firJavaConstructor = FirJavaConstructor(
this@JavaSymbolProvider.session, psi,
constructorSymbol, visibility, isPrimary,
FirResolvedTypeRefImpl(
isInner = !javaClass.isStatic,
delegatedSelfTypeRef = FirResolvedTypeRefImpl(
null,
firSymbol.constructType(
classTypeParameters.map { ConeTypeParameterTypeImpl(it.symbol.toLookupTag(), false) }.toTypedArray(),
@@ -17,7 +17,6 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirConstructorImpl.Companion.N
import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.references.FirEmptyControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
import org.jetbrains.kotlin.fir.transformInplace
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -29,6 +28,7 @@ class FirJavaConstructor(
override val symbol: FirConstructorSymbol,
visibility: Visibility,
override val isPrimary: Boolean,
override val isInner: Boolean,
delegatedSelfTypeRef: FirTypeRef
) : FirAbstractCallableMember<FirConstructor>(
session,
@@ -190,6 +190,7 @@ class JavaClassEnhancementScope(
firMethod.visibility,
isExpect = false,
isActual = false,
isInner = firMethod.isInner,
delegatedSelfTypeRef = newReturnTypeRef,
delegatedConstructor = null
)
@@ -589,6 +589,7 @@ class DeclarationsConverter(
if (primaryConstructor != null) modifiers.getVisibility() else defaultVisibility,
modifiers.hasExpect(),
modifiers.hasActual(),
classWrapper.isInner(),
classWrapper.delegatedSelfTypeRef,
firDelegatedCall
).apply {
@@ -647,6 +648,7 @@ class DeclarationsConverter(
modifiers.getVisibility(),
modifiers.hasExpect(),
modifiers.hasActual(),
classWrapper.isInner(),
delegatedSelfTypeRef,
constructorDelegationCall
)
@@ -48,6 +48,10 @@ class ClassWrapper(
return classKind == ClassKind.INTERFACE
}
fun isInner(): Boolean {
return modifiers.isInner()
}
fun defaultConstructorVisibility(): Visibility {
return if (isObject() || isSealed() || isEnum())
Visibilities.PRIVATE
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.impl.*
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.lexer.KtTokens.*
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.*
@@ -386,6 +387,7 @@ class RawFirBuilder(session: FirSession, val stubMode: Boolean) : BaseFirBuilder
this?.visibility ?: defaultVisibility(),
this?.hasExpectModifier() ?: false,
this?.hasActualModifier() ?: false,
owner.hasModifier(INNER_KEYWORD),
delegatedSelfTypeRef,
firDelegatedCall
)
@@ -644,6 +646,7 @@ class RawFirBuilder(session: FirSession, val stubMode: Boolean) : BaseFirBuilder
visibility,
hasExpectModifier(),
hasActualModifier(),
owner.hasModifier(INNER_KEYWORD),
delegatedSelfTypeRef,
getDelegationCall().convert(delegatedSuperTypeRef, delegatedSelfTypeRef, hasPrimaryConstructor)
)
@@ -252,6 +252,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
ProtoEnumFlags.visibility(Flags.VISIBILITY.get(flags)),
Flags.IS_EXPECT_FUNCTION.get(flags),
false,
klass.isInner,
delegatedSelfType,
null
)
@@ -263,6 +264,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
ProtoEnumFlags.visibility(Flags.VISIBILITY.get(flags)),
Flags.IS_EXPECT_FUNCTION.get(flags),
false,
klass.isInner,
delegatedSelfType,
null
)
@@ -17,6 +17,8 @@ interface FirConstructor : @VisitedSupertype FirMemberFunction<FirConstructor> {
override val isOverride: Boolean get() = status.isOverride
val isInner: Boolean
val delegatedConstructor: FirDelegatedConstructorCall?
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
@@ -30,6 +30,12 @@ open class FirConstructorImpl : FirAbstractCallableMember<FirConstructor>, FirCo
final override var delegatedConstructor: FirDelegatedConstructorCall? = null
final override var isInner: Boolean
get() = status.isInner
set(isInner) {
status.isInner = isInner
}
constructor(
session: FirSession,
psi: PsiElement?,
@@ -37,6 +43,7 @@ open class FirConstructorImpl : FirAbstractCallableMember<FirConstructor>, FirCo
visibility: Visibility,
isExpect: Boolean,
isActual: Boolean,
isInner: Boolean,
delegatedSelfTypeRef: FirTypeRef,
delegatedConstructor: FirDelegatedConstructorCall?
) : super(
@@ -44,6 +51,7 @@ open class FirConstructorImpl : FirAbstractCallableMember<FirConstructor>, FirCo
isExpect, isActual, isOverride = false, receiverTypeRef = null, returnTypeRef = delegatedSelfTypeRef
) {
this.symbol = symbol
this.isInner = isInner
this.delegatedConstructor = delegatedConstructor
symbol.bind(this)
}
@@ -19,9 +19,10 @@ class FirPrimaryConstructorImpl(
visibility: Visibility,
isExpect: Boolean,
isActual: Boolean,
isInner: Boolean,
delegatedSelfTypeRef: FirTypeRef,
delegatedConstructor: FirDelegatedConstructorCall?
) : FirConstructorImpl(session, psi, symbol, visibility, isExpect, isActual, delegatedSelfTypeRef, delegatedConstructor) {
) : FirConstructorImpl(session, psi, symbol, visibility, isExpect, isActual, isInner, delegatedSelfTypeRef, delegatedConstructor) {
override val isPrimary: Boolean
get() = true
}