[FIR] Make expect class members also expect
This commit is contained in:
+10
-9
@@ -458,7 +458,7 @@ class DeclarationsConverter(
|
||||
//parse properties
|
||||
properties += primaryConstructorWrapper.valueParameters
|
||||
.filter { it.hasValOrVar() }
|
||||
.map { it.toFirProperty(baseSession, callableIdForName(it.firValueParameter.name)) }
|
||||
.map { it.toFirProperty(baseSession, callableIdForName(it.firValueParameter.name), classWrapper.hasExpect()) }
|
||||
addDeclarations(properties)
|
||||
}
|
||||
|
||||
@@ -482,8 +482,8 @@ class DeclarationsConverter(
|
||||
}
|
||||
|
||||
if (modifiers.isEnum()) {
|
||||
generateValuesFunction(baseSession, context.packageFqName, context.className)
|
||||
generateValueOfFunction(baseSession, context.packageFqName, context.className)
|
||||
generateValuesFunction(baseSession, context.packageFqName, context.className, modifiers.hasExpect())
|
||||
generateValueOfFunction(baseSession, context.packageFqName, context.className, modifiers.hasExpect())
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -584,6 +584,7 @@ class DeclarationsConverter(
|
||||
symbol = FirVariableSymbol(CallableId(context.currentClassId, enumEntryName))
|
||||
status = FirDeclarationStatusImpl(Visibilities.PUBLIC, Modality.FINAL).apply {
|
||||
isStatic = true
|
||||
isExpect = classWrapper.hasExpect()
|
||||
}
|
||||
if (classWrapper.hasDefaultConstructor && enumEntry.getChildNodeByType(INITIALIZER_LIST) == null &&
|
||||
modifiers.annotations.isEmpty() && classBodyNode == null
|
||||
@@ -647,7 +648,7 @@ class DeclarationsConverter(
|
||||
when (node.tokenType) {
|
||||
ENUM_ENTRY -> container += convertEnumEntry(node, classWrapper)
|
||||
CLASS -> container += convertClass(node)
|
||||
FUN -> container += convertFunctionDeclaration(node)
|
||||
FUN -> container += convertFunctionDeclaration(node, classWrapper)
|
||||
PROPERTY -> container += convertPropertyDeclaration(node, classWrapper)
|
||||
TYPEALIAS -> container += convertTypeAlias(node)
|
||||
OBJECT_DECLARATION -> container += convertClass(node)
|
||||
@@ -688,7 +689,7 @@ class DeclarationsConverter(
|
||||
|
||||
val explicitVisibility = if (primaryConstructor != null) modifiers.getVisibility() else null
|
||||
val status = FirDeclarationStatusImpl(explicitVisibility ?: defaultVisibility, Modality.FINAL).apply {
|
||||
isExpect = modifiers.hasExpect()
|
||||
isExpect = modifiers.hasExpect() || classWrapper.hasExpect()
|
||||
isActual = modifiers.hasActual()
|
||||
isInner = classWrapper.isInner()
|
||||
isFromSealedClass = classWrapper.isSealed() && explicitVisibility !== Visibilities.PRIVATE
|
||||
@@ -753,7 +754,7 @@ class DeclarationsConverter(
|
||||
|
||||
val explicitVisibility = modifiers.getVisibility()
|
||||
val status = FirDeclarationStatusImpl(explicitVisibility, Modality.FINAL).apply {
|
||||
isExpect = modifiers.hasExpect()
|
||||
isExpect = modifiers.hasExpect() || classWrapper.hasExpect()
|
||||
isActual = modifiers.hasActual()
|
||||
isInner = classWrapper.isInner()
|
||||
isFromSealedClass = classWrapper.isSealed() && explicitVisibility !== Visibilities.PRIVATE
|
||||
@@ -955,7 +956,7 @@ class DeclarationsConverter(
|
||||
// Note that, depending on `var` or `val`, checking setter's modifiers should be careful: for `val`, setter doesn't
|
||||
// exist (null); for `var`, the retrieval of the specific modifier is supposed to be `true`
|
||||
status = FirDeclarationStatusImpl(propertyVisibility, modifiers.getModality()).apply {
|
||||
isExpect = modifiers.hasExpect()
|
||||
isExpect = modifiers.hasExpect() || classWrapper?.hasExpect() == true
|
||||
isActual = modifiers.hasActual()
|
||||
isOverride = modifiers.hasOverride()
|
||||
isConst = modifiers.isConst()
|
||||
@@ -1150,7 +1151,7 @@ class DeclarationsConverter(
|
||||
/**
|
||||
* @see org.jetbrains.kotlin.parsing.KotlinParsing.parseFunction
|
||||
*/
|
||||
fun convertFunctionDeclaration(functionDeclaration: LighterASTNode): FirDeclaration {
|
||||
fun convertFunctionDeclaration(functionDeclaration: LighterASTNode, classWrapper: ClassWrapper? = null): FirDeclaration {
|
||||
var modifiers = Modifier()
|
||||
var identifier: String? = null
|
||||
val firTypeParameters = mutableListOf<FirTypeParameter>()
|
||||
@@ -1208,7 +1209,7 @@ class DeclarationsConverter(
|
||||
if (isLocal) Visibilities.LOCAL else modifiers.getVisibility(),
|
||||
modifiers.getModality()
|
||||
).apply {
|
||||
isExpect = modifiers.hasExpect()
|
||||
isExpect = modifiers.hasExpect() || classWrapper?.hasExpect() == true
|
||||
isActual = modifiers.hasActual()
|
||||
isOverride = modifiers.hasOverride()
|
||||
isOperator = modifiers.hasOperator()
|
||||
|
||||
+4
-1
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirClassBuilder
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.Modifier
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.name.SpecialNames
|
||||
@@ -57,6 +56,10 @@ class ClassWrapper(
|
||||
return modifiers.isInner()
|
||||
}
|
||||
|
||||
fun hasExpect(): Boolean {
|
||||
return modifiers.hasExpect()
|
||||
}
|
||||
|
||||
// See DescriptorUtils#getDefaultConstructorVisibility in core.descriptors
|
||||
fun defaultConstructorVisibility(): Visibility {
|
||||
return when {
|
||||
|
||||
+2
-2
@@ -35,7 +35,7 @@ class ValueParameter(
|
||||
return isVal || isVar
|
||||
}
|
||||
|
||||
fun toFirProperty(session: FirSession, callableId: CallableId): FirProperty {
|
||||
fun toFirProperty(session: FirSession, callableId: CallableId, isExpect: Boolean): FirProperty {
|
||||
val name = this.firValueParameter.name
|
||||
var type = this.firValueParameter.returnTypeRef
|
||||
if (type is FirImplicitTypeRef) {
|
||||
@@ -58,7 +58,7 @@ class ValueParameter(
|
||||
symbol = FirPropertySymbol(callableId)
|
||||
isLocal = false
|
||||
status = FirDeclarationStatusImpl(modifiers.getVisibility(), modifiers.getModality()).apply {
|
||||
isExpect = modifiers.hasExpect()
|
||||
this.isExpect = isExpect
|
||||
isActual = modifiers.hasActual()
|
||||
isOverride = modifiers.hasOverride()
|
||||
isConst = false
|
||||
|
||||
+17
-11
@@ -38,6 +38,7 @@ import org.jetbrains.kotlin.lexer.KtTokens.*
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
||||
import org.jetbrains.kotlin.psi.psiUtil.hasActualModifier
|
||||
import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier
|
||||
@@ -348,11 +349,11 @@ class RawFirBuilder(
|
||||
}
|
||||
}
|
||||
|
||||
private fun KtParameter.toFirProperty(firParameter: FirValueParameter): FirProperty {
|
||||
private fun KtParameter.toFirProperty(firParameter: FirValueParameter, isExpect: Boolean): FirProperty {
|
||||
require(hasValOrVar())
|
||||
var type = typeReference.toFirOrErrorType()
|
||||
val type = typeReference.toFirOrErrorType()
|
||||
val status = FirDeclarationStatusImpl(visibility, modality).apply {
|
||||
isExpect = hasExpectModifier()
|
||||
this.isExpect = isExpect
|
||||
isActual = hasActualModifier()
|
||||
isOverride = hasModifier(OVERRIDE_KEYWORD)
|
||||
isConst = false
|
||||
@@ -554,8 +555,8 @@ class RawFirBuilder(
|
||||
|
||||
val explicitVisibility = this?.visibility
|
||||
val status = FirDeclarationStatusImpl(explicitVisibility ?: defaultVisibility(), Modality.FINAL).apply {
|
||||
isExpect = this@toFirConstructor?.hasExpectModifier() ?: false
|
||||
isActual = this@toFirConstructor?.hasActualModifier() ?: false
|
||||
isExpect = this@toFirConstructor?.hasExpectModifier() == true || owner.hasExpectModifier()
|
||||
isActual = this@toFirConstructor?.hasActualModifier() == true
|
||||
isInner = owner.hasModifier(INNER_KEYWORD)
|
||||
isFromSealedClass = owner.hasModifier(SEALED_KEYWORD) && explicitVisibility !== Visibilities.PRIVATE
|
||||
isFromEnumClass = owner.hasModifier(ENUM_KEYWORD)
|
||||
@@ -612,6 +613,7 @@ class RawFirBuilder(
|
||||
name = nameAsSafeName
|
||||
status = FirDeclarationStatusImpl(Visibilities.PUBLIC, Modality.FINAL).apply {
|
||||
isStatic = true
|
||||
isExpect = containingClassOrObject?.hasExpectModifier() == true
|
||||
}
|
||||
symbol = FirVariableSymbol(callableIdForName(nameAsSafeName))
|
||||
// NB: not sure should annotations be on enum entry itself, or on its corresponding object
|
||||
@@ -718,7 +720,7 @@ class RawFirBuilder(
|
||||
firPrimaryConstructor.valueParameters
|
||||
).forEach { (ktParameter, firParameter) ->
|
||||
if (ktParameter.hasValOrVar()) {
|
||||
addDeclaration(ktParameter.toFirProperty(firParameter))
|
||||
addDeclaration(ktParameter.toFirProperty(firParameter, classOrObject.hasExpectModifier()))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -751,8 +753,12 @@ class RawFirBuilder(
|
||||
}
|
||||
|
||||
if (classOrObject.hasModifier(ENUM_KEYWORD)) {
|
||||
generateValuesFunction(baseSession, context.packageFqName, context.className)
|
||||
generateValueOfFunction(baseSession, context.packageFqName, context.className)
|
||||
generateValuesFunction(
|
||||
baseSession, context.packageFqName, context.className, classOrObject.hasExpectModifier()
|
||||
)
|
||||
generateValueOfFunction(
|
||||
baseSession, context.packageFqName, context.className, classOrObject.hasExpectModifier()
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -843,7 +849,7 @@ class RawFirBuilder(
|
||||
if (function.isLocal) Visibilities.LOCAL else function.visibility,
|
||||
function.modality,
|
||||
).apply {
|
||||
isExpect = function.hasExpectModifier()
|
||||
isExpect = function.hasExpectModifier() || function.containingClassOrObject?.hasExpectModifier() == true
|
||||
isActual = function.hasActualModifier()
|
||||
isOverride = function.hasModifier(OVERRIDE_KEYWORD)
|
||||
isOperator = function.hasModifier(OPERATOR_KEYWORD)
|
||||
@@ -994,7 +1000,7 @@ class RawFirBuilder(
|
||||
returnTypeRef = delegatedSelfTypeRef
|
||||
val explicitVisibility = visibility
|
||||
status = FirDeclarationStatusImpl(explicitVisibility, Modality.FINAL).apply {
|
||||
isExpect = hasExpectModifier()
|
||||
isExpect = hasExpectModifier() || owner.hasExpectModifier()
|
||||
isActual = hasActualModifier()
|
||||
isInner = owner.hasModifier(INNER_KEYWORD)
|
||||
isFromSealedClass = owner.hasModifier(SEALED_KEYWORD) && explicitVisibility !== Visibilities.PRIVATE
|
||||
@@ -1098,7 +1104,7 @@ class RawFirBuilder(
|
||||
// Note that, depending on `var` or `val`, checking setter's modifiers should be careful: for `val`, setter doesn't
|
||||
// exist (null); for `var`, the retrieval of the specific modifier is supposed to be `true`
|
||||
status = FirDeclarationStatusImpl(visibility, modality).apply {
|
||||
isExpect = hasExpectModifier()
|
||||
isExpect = hasExpectModifier() || containingClassOrObject?.hasExpectModifier() == true
|
||||
isActual = hasActualModifier()
|
||||
isOverride = hasModifier(OVERRIDE_KEYWORD)
|
||||
isConst = hasModifier(CONST_KEYWORD)
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
FILE: expectActual.kt
|
||||
public? final? expect class MyClass : R|kotlin/Any| {
|
||||
public? constructor(): R|MyClass| {
|
||||
public? expect constructor(): R|MyClass| {
|
||||
super<R|kotlin/Any|>()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user