Change modifiers parsing and some minor changes in fir conversion

This commit is contained in:
Ivan Cilcic
2019-07-04 12:54:47 +03:00
committed by Mikhail Glukhikh
parent 05a2b2fac8
commit b5d617492a
8 changed files with 550 additions and 242 deletions
@@ -22,9 +22,10 @@ import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.* import org.jetbrains.kotlin.fir.types.impl.*
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.lexer.KtTokens.* import org.jetbrains.kotlin.lexer.KtTokens.*
import org.jetbrains.kotlin.KtNodeTypes.* import org.jetbrains.kotlin.KtNodeTypes.*
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.* import org.jetbrains.kotlin.fir.lightTree.fir.modifier.*
import org.jetbrains.kotlin.fir.lightTree.ConverterUtil.nameAsSafeName import org.jetbrains.kotlin.fir.lightTree.ConverterUtil.nameAsSafeName
import org.jetbrains.kotlin.fir.lightTree.ConverterUtil.toDelegatedSelfType import org.jetbrains.kotlin.fir.lightTree.ConverterUtil.toDelegatedSelfType
@@ -34,10 +35,12 @@ import org.jetbrains.kotlin.fir.lightTree.ConverterUtil.joinTypeParameters
import org.jetbrains.kotlin.fir.lightTree.ConverterUtil.extractArgumentsFrom import org.jetbrains.kotlin.fir.lightTree.ConverterUtil.extractArgumentsFrom
import org.jetbrains.kotlin.fir.lightTree.ConverterUtil.fillEnumEntryConstructor import org.jetbrains.kotlin.fir.lightTree.ConverterUtil.fillEnumEntryConstructor
import org.jetbrains.kotlin.fir.lightTree.ConverterUtil.fillConstructors import org.jetbrains.kotlin.fir.lightTree.ConverterUtil.fillConstructors
import org.jetbrains.kotlin.fir.lightTree.ConverterUtil.toFirUserType
import org.jetbrains.kotlin.fir.lightTree.DataClassUtil.generateComponentFunctions
import org.jetbrains.kotlin.fir.lightTree.DataClassUtil.generateCopyFunction
import org.jetbrains.kotlin.fir.lightTree.FunctionUtil.removeLast import org.jetbrains.kotlin.fir.lightTree.FunctionUtil.removeLast
import org.jetbrains.kotlin.fir.lightTree.fir.TypeConstraint import org.jetbrains.kotlin.fir.lightTree.fir.TypeConstraint
import org.jetbrains.kotlin.fir.lightTree.fir.ValueParameter import org.jetbrains.kotlin.fir.lightTree.fir.ValueParameter
import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.psi.stubs.elements.KtConstantExpressionElementType import org.jetbrains.kotlin.psi.stubs.elements.KtConstantExpressionElementType
import org.jetbrains.kotlin.psi.stubs.elements.KtDotQualifiedExpressionElementType import org.jetbrains.kotlin.psi.stubs.elements.KtDotQualifiedExpressionElementType
import org.jetbrains.kotlin.psi.stubs.elements.KtStringTemplateExpressionElementType import org.jetbrains.kotlin.psi.stubs.elements.KtStringTemplateExpressionElementType
@@ -48,19 +51,6 @@ class Converter(
val stubMode: Boolean, val stubMode: Boolean,
private val tree: FlyweightCapableTreeStructure<LighterASTNode> private val tree: FlyweightCapableTreeStructure<LighterASTNode>
) { ) {
private val CLASS_MODIFIER = TokenSet.create(ENUM_KEYWORD, ANNOTATION_KEYWORD, DATA_KEYWORD, INNER_KEYWORD, COMPANION_KEYWORD)
private val MEMBER_MODIFIER = TokenSet.create(OVERRIDE_KEYWORD, LATEINIT_KEYWORD)
private val VISIBILITY_MODIFIER = TokenSet.create(PUBLIC_KEYWORD, PRIVATE_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD)
private val VARIANCE_MODIFIER = TokenSet.create(IN_KEYWORD, OUT_KEYWORD)
private val FUNCTION_MODIFIER =
TokenSet.create(TAILREC_KEYWORD, OPERATOR_KEYWORD, INFIX_KEYWORD, INLINE_KEYWORD, EXTERNAL_KEYWORD, SUSPEND_KEYWORD)
private val PROPERTY_MODIFIER = TokenSet.create(CONST_KEYWORD)
private val INHERITANCE_MODIFIER = TokenSet.create(ABSTRACT_KEYWORD, FINAL_KEYWORD, OPEN_KEYWORD, SEALED_KEYWORD)
private val PARAMETER_MODIFIER = TokenSet.create(VARARG_KEYWORD, NOINLINE_KEYWORD, CROSSINLINE_KEYWORD)
private val REIFICATION_MODIFIER = TokenSet.create(REIFIED_KEYWORD)
private val PLATFORM_MODIFIER = TokenSet.create(EXPECT_KEYWORD, ACTUAL_KEYWORD)
private val implicitUnitType = FirImplicitUnitTypeRef(session, null) private val implicitUnitType = FirImplicitUnitTypeRef(session, null)
private val implicitAnyType = FirImplicitAnyTypeRef(session, null) private val implicitAnyType = FirImplicitAnyTypeRef(session, null)
private val implicitEnumType = FirImplicitEnumTypeRef(session, null) private val implicitEnumType = FirImplicitEnumTypeRef(session, null)
@@ -245,20 +235,19 @@ class Converter(
} }
} }
classKind = when (modifiers.classModifier) { classKind = when {
ClassModifier.ENUM -> ClassKind.ENUM_CLASS modifiers.isEnum() -> ClassKind.ENUM_CLASS
ClassModifier.ANNOTATION -> ClassKind.ANNOTATION_CLASS modifiers.isAnnotation() -> ClassKind.ANNOTATION_CLASS
else -> classKind else -> classKind
} }
val hasSecondaryConstructor = classBody.hasSecondaryConstructor(classBody.getChildrenAsArray()) val hasSecondaryConstructor = classBody.hasSecondaryConstructor(classBody.getChildrenAsArray())
val className = identifier.nameAsSafeName(if (modifiers.classModifier == ClassModifier.COMPANION) "Companion" else "") val className = identifier.nameAsSafeName(if (modifiers.isCompanion()) "Companion" else "")
val defaultDelegatedSuperTypeRef = when (classKind) { val defaultDelegatedSuperTypeRef = when (classKind) {
ClassKind.ENUM_CLASS -> implicitEnumType ClassKind.ENUM_CLASS -> implicitEnumType
ClassKind.ANNOTATION_CLASS -> implicitAnnotationType ClassKind.ANNOTATION_CLASS -> implicitAnnotationType
else -> implicitAnyType else -> implicitAnyType
} }
val delegatedSelfTypeRef = className.toDelegatedSelfType(session)
delegatedSuperTypeRef = delegatedSuperTypeRef ?: defaultDelegatedSuperTypeRef delegatedSuperTypeRef = delegatedSuperTypeRef ?: defaultDelegatedSuperTypeRef
return ClassNameUtil.withChildClassName(className) { return ClassNameUtil.withChildClassName(className) {
@@ -267,43 +256,47 @@ class Converter(
null, null,
FirClassSymbol(ClassNameUtil.currentClassId), FirClassSymbol(ClassNameUtil.currentClassId),
className, className,
modifiers.visibilityModifier.toVisibility(), if (FunctionUtil.firFunctions.isNotEmpty()) Visibilities.LOCAL else modifiers.getVisibility(),
modifiers.inheritanceModifier?.toModality(), modifiers.getModality(),
modifiers.platformModifier == PlatformModifier.EXPECT, modifiers.hasExpect(),
modifiers.platformModifier == PlatformModifier.ACTUAL, modifiers.hasActual(),
classKind, classKind,
isInner = modifiers.classModifier == ClassModifier.INNER, isInner = modifiers.isInner(),
isCompanion = modifiers.classModifier == ClassModifier.COMPANION, isCompanion = modifiers.isCompanion(),
isData = modifiers.classModifier == ClassModifier.DATA, isData = modifiers.isDataClass(),
isInline = modifiers.functionModifier == FunctionModifier.INLINE isInline = modifiers.hasInline()
) )
firClass.annotations += modifiers.annotations firClass.annotations += modifiers.annotations
firClass.typeParameters += firTypeParameters firClass.typeParameters += firTypeParameters
firClass.joinTypeParameters(typeConstraints) firClass.joinTypeParameters(typeConstraints)
firClass.superTypeRefs += superTypeRefs firClass.superTypeRefs += superTypeRefs
if (firClass.superTypeRefs.isEmpty()) {
firClass.superTypeRefs += defaultDelegatedSuperTypeRef
}
var firPrimaryConstructor: FirConstructor? = null val delegatedSelfTypeRef = toDelegatedSelfType(firClass)
if (classKind != ClassKind.INTERFACE && !(primaryConstructor == null && hasSecondaryConstructor)) { val firPrimaryConstructor: FirConstructor? = convertPrimaryConstructor(
val firDelegatedConstructorCall = convertConstructorDelegationCall(null) primaryConstructor,
.extractArgumentsFrom(superTypeCallEntry, stubMode) classKind,
firPrimaryConstructor = convertPrimaryConstructor(primaryConstructor) modifiers,
.apply { hasSecondaryConstructor,
this.returnTypeRef = delegatedSelfTypeRef delegatedSelfTypeRef,
this.delegatedConstructor = firDelegatedConstructorCall delegatedSuperTypeRef!!,
firClass.declarations += this superTypeCallEntry
} )?.apply {
} firClass.declarations += this
getValueParameters(primaryConstructor).forEach {
if (it.hasValOrVar()) {
firClass.declarations += it.toFirProperty()
}
} }
val properties = getValueParameters(primaryConstructor)
.filter { it.hasValOrVar() }
.map { it.toFirProperty() }
firClass.declarations += properties
classBody?.let { classBody?.let {
if (classKind == ClassKind.ENUM_CLASS) { if (classKind == ClassKind.ENUM_CLASS) {
// separate converter only for enum entries // separate converter only for enum entries
val firEnumEntries = convertEnumClassBody(it) //return enum entries list val firEnumEntries = convertEnumClassBody(it) //return enum entries list
firEnumEntries.fillEnumEntryConstructor(firPrimaryConstructor!!, stubMode) firEnumEntries.fillEnumEntryConstructor(firPrimaryConstructor!!, className.identifier.toFirUserType(session), stubMode)
firClass.declarations += firEnumEntries firClass.declarations += firEnumEntries
} }
firClass.declarations += convertClassBody(it) firClass.declarations += convertClassBody(it)
@@ -314,6 +307,12 @@ class Converter(
.collect(Collectors.toList()) .collect(Collectors.toList())
.fillConstructors(primaryConstructor != null, delegatedSelfTypeRef, delegatedSuperTypeRef!!) .fillConstructors(primaryConstructor != null, delegatedSelfTypeRef, delegatedSuperTypeRef!!)
if (modifiers.isDataClass() && firPrimaryConstructor != null) {
generateComponentFunctions(session, firClass, properties)
generateCopyFunction(session, firClass, firPrimaryConstructor, properties)
// TODO: equals, hashCode, toString
}
return@withChildClassName firClass return@withChildClassName firClass
} }
} }
@@ -333,8 +332,17 @@ class Converter(
* @see org.jetbrains.kotlin.parsing.KotlinParsing.parseClassOrObject * @see org.jetbrains.kotlin.parsing.KotlinParsing.parseClassOrObject
* primaryConstructor branch * primaryConstructor branch
*/ */
private fun convertPrimaryConstructor(primaryConstructor: LighterASTNode?): FirConstructorImpl { private fun convertPrimaryConstructor(
//if (primaryConstructor == null && hasSecondaryConstructor) return null primaryConstructor: LighterASTNode?,
classKind: ClassKind,
classModifiers: Modifier,
hasSecondaryConstructor: Boolean,
delegatedSelfTypeRef: FirTypeRef,
delegatedSuperTypeRef: FirTypeRef,
superTypeCallEntry: List<FirExpression>
): FirConstructorImpl? {
if (primaryConstructor == null && hasSecondaryConstructor) return null
if (classKind == ClassKind.INTERFACE) return null
var modifiers = Modifier(session) var modifiers = Modifier(session)
val valueParameters = mutableListOf<ValueParameter>() val valueParameters = mutableListOf<ValueParameter>()
@@ -345,17 +353,34 @@ class Converter(
} }
} }
val defaultVisibility =
if (classKind == ClassKind.OBJECT ||
classModifiers.getModality() == Modality.SEALED ||
classModifiers.isEnum()
)
Visibilities.PRIVATE
else
Visibilities.UNKNOWN
val firDelegatedCall = FirDelegatedConstructorCallImpl(
session,
null,
delegatedSuperTypeRef,
isThis = false
).extractArgumentsFrom(superTypeCallEntry, stubMode)
return FirPrimaryConstructorImpl( return FirPrimaryConstructorImpl(
session, session,
null, null,
FirFunctionSymbol(ClassNameUtil.callableIdForClassConstructor()), FirFunctionSymbol(ClassNameUtil.callableIdForClassConstructor()),
modifiers.visibilityModifier.toVisibility(), if (primaryConstructor != null) modifiers.getVisibility() else defaultVisibility,
modifiers.platformModifier == PlatformModifier.EXPECT, modifiers.hasExpect(),
modifiers.platformModifier == PlatformModifier.ACTUAL, modifiers.hasActual(),
implicitType, //must be initialized with "delegatedSelfTypeRef" outside of this method delegatedSelfTypeRef,
null //must be initialized outside of this method firDelegatedCall
).apply { ).apply {
annotations += modifiers.annotations annotations += modifiers.annotations
//this.typeParameters += typeParametersFromSelfType(delegatedSelfTypeRef)
this.valueParameters += valueParameters.map { it.firValueParameter } this.valueParameters += valueParameters.map { it.firValueParameter }
} }
} }
@@ -388,6 +413,8 @@ class Converter(
VAR_KEYWORD -> isVar = true VAR_KEYWORD -> isVar = true
IDENTIFIER -> identifier = it.toString() IDENTIFIER -> identifier = it.toString()
TYPE_REFERENCE -> firType = convertType(it) TYPE_REFERENCE -> firType = convertType(it)
DOT_QUALIFIED_EXPRESSION,
REFERENCE_EXPRESSION,
is KtNodeType, is KtNodeType,
is KtConstantExpressionElementType, is KtConstantExpressionElementType,
is KtDotQualifiedExpressionElementType, is KtDotQualifiedExpressionElementType,
@@ -398,12 +425,12 @@ class Converter(
val firValueParameter = FirValueParameterImpl( val firValueParameter = FirValueParameterImpl(
session, session,
null, null,
Name.identifier(identifier), identifier.nameAsSafeName(),
firType, firType,
firExpression, firExpression,
isCrossinline = modifiers.parameterModifier == ParameterModifier.CROSSINLINE, isCrossinline = modifiers.hasCrossinline(),
isNoinline = modifiers.parameterModifier == ParameterModifier.NOINLINE, isNoinline = modifiers.hasNoinline(),
isVararg = modifiers.parameterModifier == ParameterModifier.VARARG isVararg = modifiers.hasVararg()
).apply { annotations += modifiers.annotations } ).apply { annotations += modifiers.annotations }
return ValueParameter(isVal, isVar, modifiers, firValueParameter) return ValueParameter(isVal, isVar, modifiers, firValueParameter)
} }
@@ -466,6 +493,8 @@ class Converter(
explicitDelegation.forEachChildren { explicitDelegation.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
TYPE_REFERENCE -> firTypeRef = convertType(it) TYPE_REFERENCE -> firTypeRef = convertType(it)
DOT_QUALIFIED_EXPRESSION,
REFERENCE_EXPRESSION,
is KtNodeType, is KtNodeType,
is KtConstantExpressionElementType, is KtConstantExpressionElementType,
is KtDotQualifiedExpressionElementType, is KtDotQualifiedExpressionElementType,
@@ -575,9 +604,9 @@ class Converter(
session, session,
null, null,
FirFunctionSymbol(ClassNameUtil.callableIdForClassConstructor()), FirFunctionSymbol(ClassNameUtil.callableIdForClassConstructor()),
modifiers.visibilityModifier.toVisibility(), modifiers.getVisibility(),
modifiers.platformModifier == PlatformModifier.EXPECT, modifiers.hasExpect(),
modifiers.platformModifier == PlatformModifier.ACTUAL, modifiers.hasActual(),
implicitType, //must be initialized with "delegatedSelfTypeRef" outside of this method implicitType, //must be initialized with "delegatedSelfTypeRef" outside of this method
constructorDelegationCall constructorDelegationCall
) )
@@ -606,7 +635,7 @@ class Converter(
} }
} }
val enumEntryName = Name.identifier(identifier) val enumEntryName = identifier.nameAsSafeName()
return ClassNameUtil.withChildClassName(enumEntryName) { return ClassNameUtil.withChildClassName(enumEntryName) {
return@withChildClassName FirEnumEntryImpl( return@withChildClassName FirEnumEntryImpl(
session, session,
@@ -644,11 +673,12 @@ class Converter(
TYPE_REFERENCE -> if (isReturnType) returnType = convertType(it) else receiverType = convertType(it) TYPE_REFERENCE -> if (isReturnType) returnType = convertType(it) else receiverType = convertType(it)
TYPE_CONSTRAINT_LIST -> typeConstraints += convertTypeConstraints(it) TYPE_CONSTRAINT_LIST -> typeConstraints += convertTypeConstraints(it)
BLOCK -> firBlock = visitBlock(it) BLOCK -> firBlock = visitBlock(it)
DOT_QUALIFIED_EXPRESSION,
REFERENCE_EXPRESSION,
is KtNodeType, is KtNodeType,
is KtConstantExpressionElementType, is KtConstantExpressionElementType,
is KtDotQualifiedExpressionElementType, is KtDotQualifiedExpressionElementType,
is KtStringTemplateExpressionElementType, is KtStringTemplateExpressionElementType -> firExpression = visitExpression(it) //TODO implement
REFERENCE_EXPRESSION -> firExpression = visitExpression(it) //TODO implement
} }
} }
@@ -658,23 +688,24 @@ class Converter(
else implicitType else implicitType
} }
val functionName = Name.identifier(identifier) val functionName = identifier.nameAsSafeName()
val isLocal = FunctionUtil.firFunctions.isNotEmpty()
val firFunction = FirMemberFunctionImpl( val firFunction = FirMemberFunctionImpl(
session, session,
null, null,
FirFunctionSymbol(ClassNameUtil.callableIdForName(functionName)), FirFunctionSymbol(ClassNameUtil.callableIdForName(functionName, isLocal)),
functionName, functionName,
modifiers.visibilityModifier.toVisibility(), modifiers.getVisibility(),
modifiers.inheritanceModifier?.toModality(), modifiers.getModality(),
modifiers.platformModifier == PlatformModifier.EXPECT, modifiers.hasExpect(),
modifiers.platformModifier == PlatformModifier.ACTUAL, modifiers.hasActual(),
modifiers.memberModifier == MemberModifier.OVERRIDE, modifiers.hasOverride(),
modifiers.functionModifier == FunctionModifier.OPERATOR, modifiers.hasOperator(),
modifiers.functionModifier == FunctionModifier.INFIX, modifiers.hasInfix(),
modifiers.functionModifier == FunctionModifier.INLINE, modifiers.hasInline(),
modifiers.functionModifier == FunctionModifier.TAILREC, modifiers.hasTailrec(),
modifiers.functionModifier == FunctionModifier.EXTERNAL, modifiers.hasExternal(),
modifiers.functionModifier == FunctionModifier.SUSPEND, modifiers.hasSuspend(),
receiverType, receiverType,
returnType!! returnType!!
) )
@@ -715,23 +746,24 @@ class Converter(
MODIFIER_LIST -> modifiers = convertModifiers(it) MODIFIER_LIST -> modifiers = convertModifiers(it)
IDENTIFIER -> identifier = it.toString() IDENTIFIER -> identifier = it.toString()
TYPE_REFERENCE -> firType = convertType(it) TYPE_REFERENCE -> firType = convertType(it)
DOT_QUALIFIED_EXPRESSION,
REFERENCE_EXPRESSION,
is KtNodeType, is KtNodeType,
is KtConstantExpressionElementType, is KtConstantExpressionElementType,
is KtDotQualifiedExpressionElementType, is KtDotQualifiedExpressionElementType,
is KtStringTemplateExpressionElementType, is KtStringTemplateExpressionElementType -> firExpression = visitExpression(it) //TODO implement
REFERENCE_EXPRESSION -> firExpression = visitExpression(it) //TODO implement
} }
} }
return FirValueParameterImpl( return FirValueParameterImpl(
session, session,
null, null,
Name.identifier(identifier), identifier.nameAsSafeName(),
firType, firType,
firExpression, firExpression,
isCrossinline = modifiers.parameterModifier == ParameterModifier.CROSSINLINE, isCrossinline = modifiers.hasCrossinline(),
isNoinline = modifiers.parameterModifier == ParameterModifier.NOINLINE, isNoinline = modifiers.hasNoinline(),
isVararg = modifiers.parameterModifier == ParameterModifier.VARARG isVararg = modifiers.hasVararg()
).apply { annotations += modifiers.annotations } ).apply { annotations += modifiers.annotations }
} }
@@ -752,7 +784,7 @@ class Converter(
return FirValueParameterImpl( return FirValueParameterImpl(
session, session,
null, null,
identifier?.let { Name.identifier(it) } ?: SpecialNames.NO_NAME_PROVIDED, identifier.nameAsSafeName(),
firType ?: implicitType, firType ?: implicitType,
null, null,
isCrossinline = false, isCrossinline = false,
@@ -783,9 +815,9 @@ class Converter(
firValueParameter.name, firValueParameter.name,
if (firValueParameter.returnTypeRef == implicitType) propertyTypeRef else firValueParameter.returnTypeRef, if (firValueParameter.returnTypeRef == implicitType) propertyTypeRef else firValueParameter.returnTypeRef,
null,//TODO implement null,//TODO implement
isCrossinline = modifiers.parameterModifier == ParameterModifier.CROSSINLINE, isCrossinline = modifiers.hasCrossinline(),
isNoinline = modifiers.parameterModifier == ParameterModifier.NOINLINE, isNoinline = modifiers.hasNoinline(),
isVararg = modifiers.parameterModifier == ParameterModifier.VARARG isVararg = modifiers.hasVararg()
).apply { ).apply {
annotations += modifiers.annotations annotations += modifiers.annotations
} }
@@ -843,15 +875,16 @@ class Converter(
getter = convertGetter(it, returnType) getter = convertGetter(it, returnType)
else else
setter = convertSetter(it, returnType) setter = convertSetter(it, returnType)
DOT_QUALIFIED_EXPRESSION,
REFERENCE_EXPRESSION,
is KtNodeType, is KtNodeType,
is KtConstantExpressionElementType, is KtConstantExpressionElementType,
is KtDotQualifiedExpressionElementType, is KtDotQualifiedExpressionElementType,
is KtStringTemplateExpressionElementType, is KtStringTemplateExpressionElementType -> firExpression = visitExpression(it) //TODO implement
REFERENCE_EXPRESSION -> firExpression = visitExpression(it) //TODO implement
} }
} }
val propertyName = Name.identifier(identifier) val propertyName = identifier.nameAsSafeName()
return if (FunctionUtil.firFunctions.isNotEmpty()) { return if (FunctionUtil.firFunctions.isNotEmpty()) {
FirVariableImpl( FirVariableImpl(
@@ -873,19 +906,19 @@ class Converter(
null, null,
FirPropertySymbol(ClassNameUtil.callableIdForName(propertyName)), FirPropertySymbol(ClassNameUtil.callableIdForName(propertyName)),
propertyName, propertyName,
modifiers.visibilityModifier.toVisibility(), modifiers.getVisibility(),
modifiers.inheritanceModifier?.toModality(), modifiers.getModality(),
modifiers.platformModifier == PlatformModifier.EXPECT, modifiers.hasExpect(),
modifiers.platformModifier == PlatformModifier.ACTUAL, modifiers.hasActual(),
modifiers.memberModifier == MemberModifier.OVERRIDE, modifiers.hasOverride(),
modifiers.propertyModifier == PropertyModifier.CONST, modifiers.isConst(),
modifiers.memberModifier == MemberModifier.LATEINIT, modifiers.hasLateinit(),
receiverType, receiverType,
returnType, returnType,
isVar, isVar,
firExpression, firExpression,
getter ?: FirDefaultPropertyGetter(session, null, returnType, modifiers.visibilityModifier.toVisibility()), getter ?: FirDefaultPropertyGetter(session, null, returnType, modifiers.getVisibility()),
setter ?: FirDefaultPropertySetter(session, null, returnType, modifiers.visibilityModifier.toVisibility()), setter ?: FirDefaultPropertySetter(session, null, returnType, modifiers.getVisibility()),
if (isDelegate) { if (isDelegate) {
FirExpressionStub(session, null) FirExpressionStub(session, null)
//TODO("not implemented") //TODO("not implemented")
@@ -913,11 +946,12 @@ class Converter(
MODIFIER_LIST -> modifiers = convertModifiers(it) MODIFIER_LIST -> modifiers = convertModifiers(it)
TYPE_REFERENCE -> returnType = convertType(it) TYPE_REFERENCE -> returnType = convertType(it)
BLOCK -> firBlock = visitBlock(it) BLOCK -> firBlock = visitBlock(it)
DOT_QUALIFIED_EXPRESSION,
REFERENCE_EXPRESSION,
is KtNodeType, is KtNodeType,
is KtConstantExpressionElementType, is KtConstantExpressionElementType,
is KtDotQualifiedExpressionElementType, is KtDotQualifiedExpressionElementType,
is KtStringTemplateExpressionElementType, is KtStringTemplateExpressionElementType -> firExpression = visitExpression(it) //TODO implement
REFERENCE_EXPRESSION -> firExpression = visitExpression(it) //TODO implement
} }
} }
@@ -925,7 +959,7 @@ class Converter(
session, session,
null, null,
true, true,
modifiers.visibilityModifier.toVisibility(), modifiers.getVisibility(),
returnType ?: propertyTypeRef returnType ?: propertyTypeRef
) )
FunctionUtil.firFunctions += firAccessor FunctionUtil.firFunctions += firAccessor
@@ -952,11 +986,12 @@ class Converter(
TYPE_REFERENCE -> returnType = convertType(it) TYPE_REFERENCE -> returnType = convertType(it)
VALUE_PARAMETER_LIST -> firValueParameters += convertSetterParameter(it, propertyTypeRef) VALUE_PARAMETER_LIST -> firValueParameters += convertSetterParameter(it, propertyTypeRef)
BLOCK -> firBlock = visitBlock(it) BLOCK -> firBlock = visitBlock(it)
DOT_QUALIFIED_EXPRESSION,
REFERENCE_EXPRESSION,
is KtNodeType, is KtNodeType,
is KtConstantExpressionElementType, is KtConstantExpressionElementType,
is KtDotQualifiedExpressionElementType, is KtDotQualifiedExpressionElementType,
is KtStringTemplateExpressionElementType, is KtStringTemplateExpressionElementType -> firExpression = visitExpression(it) //TODO implement
REFERENCE_EXPRESSION -> firExpression = visitExpression(it) //TODO implement
} }
} }
@@ -964,7 +999,7 @@ class Converter(
session, session,
null, null,
false, false,
modifiers.visibilityModifier.toVisibility(), modifiers.getVisibility(),
returnType ?: implicitUnitType returnType ?: implicitUnitType
) )
FunctionUtil.firFunctions += firAccessor FunctionUtil.firFunctions += firAccessor
@@ -1002,16 +1037,16 @@ class Converter(
} }
} }
val typeAliasName = Name.identifier(identifier) val typeAliasName = identifier.nameAsSafeName()
return ClassNameUtil.withChildClassName(typeAliasName) { return ClassNameUtil.withChildClassName(typeAliasName) {
return@withChildClassName FirTypeAliasImpl( return@withChildClassName FirTypeAliasImpl(
session, session,
null, null,
FirTypeAliasSymbol(ClassNameUtil.currentClassId), FirTypeAliasSymbol(ClassNameUtil.currentClassId),
typeAliasName, typeAliasName,
modifiers.visibilityModifier.toVisibility(), modifiers.getVisibility(),
modifiers.platformModifier == PlatformModifier.EXPECT, modifiers.hasExpect(),
modifiers.platformModifier == PlatformModifier.ACTUAL, modifiers.hasActual(),
firType firType
).apply { ).apply {
annotations += modifiers.annotations annotations += modifiers.annotations
@@ -1051,8 +1086,8 @@ class Converter(
null, null,
FirTypeParameterSymbol(), FirTypeParameterSymbol(),
identifier.nameAsSafeName(), identifier.nameAsSafeName(),
typeParameterModifiers.varianceModifier.toVariance(), typeParameterModifiers.getVariance(),
typeParameterModifiers.reificationModifier != null typeParameterModifiers.hasReified()
) )
firTypeParameter.annotations += typeParameterModifiers.annotations firTypeParameter.annotations += typeParameterModifiers.annotations
firType?.let { firTypeParameter.bounds += it } firType?.let { firTypeParameter.bounds += it }
@@ -1066,12 +1101,10 @@ class Converter(
private fun convertTypeParameterModifiers(typeParameterModifiers: LighterASTNode): TypeParameterModifier { private fun convertTypeParameterModifiers(typeParameterModifiers: LighterASTNode): TypeParameterModifier {
val modifier = TypeParameterModifier(session) val modifier = TypeParameterModifier(session)
typeParameterModifiers.forEachChildren { typeParameterModifiers.forEachChildren {
val tokenType = it.tokenType when (it.tokenType) {
when { ANNOTATION -> modifier.annotations += convertAnnotation(it)
VARIANCE_MODIFIER.contains(tokenType) -> modifier.varianceModifier = convertVarianceModifier(it) ANNOTATION_ENTRY -> modifier.annotations += convertUnescapedAnnotation(it, null)
REIFICATION_MODIFIER.contains(tokenType) -> modifier.reificationModifier = convertReificationModifier(it) else -> modifier.addModifier(it)
tokenType == ANNOTATION -> modifier.annotations += convertAnnotation(it)
tokenType == ANNOTATION_ENTRY -> modifier.annotations += convertUnescapedAnnotation(it, null)
} }
} }
return modifier return modifier
@@ -1103,11 +1136,10 @@ class Converter(
private fun convertTypeModifiers(typeModifiers: LighterASTNode): TypeModifier { private fun convertTypeModifiers(typeModifiers: LighterASTNode): TypeModifier {
val modifier = TypeModifier(session) val modifier = TypeModifier(session)
typeModifiers.forEachChildren { typeModifiers.forEachChildren {
val tokenType = it.tokenType when (it.tokenType) {
when { ANNOTATION -> modifier.annotations += convertAnnotation(it)
it.toString() == SUSPEND_KEYWORD.value -> modifier.suspendModifier = SuspendModifier.SUSPEND ANNOTATION_ENTRY -> modifier.annotations += convertUnescapedAnnotation(it, null)
tokenType == ANNOTATION -> modifier.annotations += convertAnnotation(it) else -> modifier.addModifier(it)
tokenType == ANNOTATION_ENTRY -> modifier.annotations += convertUnescapedAnnotation(it, null)
} }
} }
return modifier return modifier
@@ -1120,7 +1152,7 @@ class Converter(
lateinit var firType: FirTypeRef lateinit var firType: FirTypeRef
nullableType.forEachChildren { nullableType.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
USER_TYPE -> firType = convertUserType(it, true) USER_TYPE -> firType = convertUserType(it, true).also { firUserType -> (firUserType as FirUserTypeRefImpl).qualifier.reverse() }
FUNCTION_TYPE -> firType = convertFunctionType(it, true) FUNCTION_TYPE -> firType = convertFunctionType(it, true)
NULLABLE_TYPE -> firType = convertNullableType(it) NULLABLE_TYPE -> firType = convertNullableType(it)
DYNAMIC_TYPE -> firType = FirDynamicTypeRefImpl(session, null, true) DYNAMIC_TYPE -> firType = FirDynamicTypeRefImpl(session, null, true)
@@ -1184,7 +1216,7 @@ class Converter(
} }
val qualifier = FirQualifierPartImpl( val qualifier = FirQualifierPartImpl(
Name.identifier(identifier) identifier.nameAsSafeName()
).apply { typeArguments += firTypeArguments } ).apply { typeArguments += firTypeArguments }
return FirUserTypeRefImpl( return FirUserTypeRefImpl(
@@ -1281,7 +1313,7 @@ class Converter(
else FirTypeProjectionWithVarianceImpl( else FirTypeProjectionWithVarianceImpl(
session, session,
null, null,
modifiers.varianceModifier.toVariance(), modifiers.getVariance(),
firType firType
) )
} }
@@ -1292,11 +1324,10 @@ class Converter(
private fun convertTypeProjectionModifiers(modifiers: LighterASTNode): TypeProjectionModifier { private fun convertTypeProjectionModifiers(modifiers: LighterASTNode): TypeProjectionModifier {
val modifier = TypeProjectionModifier(session) val modifier = TypeProjectionModifier(session)
modifiers.forEachChildren { modifiers.forEachChildren {
val tokenType = it.tokenType when (it.tokenType) {
when { ANNOTATION -> modifier.annotations += convertAnnotation(it)
VARIANCE_MODIFIER.contains(tokenType) -> modifier.varianceModifier = convertVarianceModifier(it) ANNOTATION_ENTRY -> modifier.annotations += convertUnescapedAnnotation(it, null)
tokenType == ANNOTATION -> modifier.annotations += convertAnnotation(it) else -> modifier.addModifier(it)
tokenType == ANNOTATION_ENTRY -> modifier.annotations += convertUnescapedAnnotation(it, null)
} }
} }
return modifier return modifier
@@ -1327,63 +1358,15 @@ class Converter(
private fun convertModifiers(modifiers: LighterASTNode): Modifier { private fun convertModifiers(modifiers: LighterASTNode): Modifier {
val modifier = Modifier(session) val modifier = Modifier(session)
modifiers.forEachChildren { modifiers.forEachChildren {
val tokenType = it.tokenType when (it.tokenType) {
when { ANNOTATION -> modifier.annotations += convertAnnotation(it)
CLASS_MODIFIER.contains(tokenType) -> modifier.classModifier = convertClassModifier(it) ANNOTATION_ENTRY -> modifier.annotations += convertUnescapedAnnotation(it, null)
MEMBER_MODIFIER.contains(tokenType) -> modifier.memberModifier = convertMemberModifier(it) else -> modifier.addModifier(it)
VISIBILITY_MODIFIER.contains(tokenType) -> modifier.visibilityModifier = convertVisibilityModifier(it)
FUNCTION_MODIFIER.contains(tokenType) -> modifier.functionModifier = convertFunctionModifier(it)
PROPERTY_MODIFIER.contains(tokenType) -> modifier.propertyModifier = convertPropertyModifier(it)
INHERITANCE_MODIFIER.contains(tokenType) -> modifier.inheritanceModifier = convertInheritanceModifier(it)
PARAMETER_MODIFIER.contains(tokenType) -> modifier.parameterModifier = convertParameterModifier(it)
PLATFORM_MODIFIER.contains(tokenType) -> modifier.platformModifier = convertPlatformModifier(it)
tokenType == ANNOTATION -> modifier.annotations += convertAnnotation(it)
tokenType == ANNOTATION_ENTRY -> modifier.annotations += convertUnescapedAnnotation(it, null)
} }
} }
return modifier return modifier
} }
private fun convertClassModifier(classModifier: LighterASTNode): ClassModifier {
return ClassModifier.valueOf(classModifier.toString().toUpperCase())
}
private fun convertMemberModifier(memberModifier: LighterASTNode): MemberModifier {
return MemberModifier.valueOf(memberModifier.toString().toUpperCase())
}
private fun convertVisibilityModifier(visibilityModifier: LighterASTNode): VisibilityModifier {
return VisibilityModifier.valueOf(visibilityModifier.toString().toUpperCase())
}
private fun convertVarianceModifier(varianceModifier: LighterASTNode): VarianceModifier {
return VarianceModifier.valueOf(varianceModifier.toString().toUpperCase())
}
private fun convertFunctionModifier(functionModifier: LighterASTNode): FunctionModifier {
return FunctionModifier.valueOf(functionModifier.toString().toUpperCase())
}
private fun convertPropertyModifier(propertyModifier: LighterASTNode): PropertyModifier {
return PropertyModifier.valueOf(propertyModifier.toString().toUpperCase())
}
private fun convertInheritanceModifier(inheritanceModifier: LighterASTNode): InheritanceModifier {
return InheritanceModifier.valueOf(inheritanceModifier.toString().toUpperCase())
}
private fun convertParameterModifier(parameterModifier: LighterASTNode): ParameterModifier {
return ParameterModifier.valueOf(parameterModifier.toString().toUpperCase())
}
private fun convertReificationModifier(reificationModifier: LighterASTNode): ReificationModifier {
return ReificationModifier.valueOf(reificationModifier.toString().toUpperCase())
}
private fun convertPlatformModifier(platformModifier: LighterASTNode): PlatformModifier {
return PlatformModifier.valueOf(platformModifier.toString().toUpperCase())
}
private fun convertAnnotation(annotationNode: LighterASTNode): List<FirAnnotationCall> { private fun convertAnnotation(annotationNode: LighterASTNode): List<FirAnnotationCall> {
var annotationTarget: AnnotationUseSiteTarget? = null var annotationTarget: AnnotationUseSiteTarget? = null
return annotationNode.forEachChildrenReturnList { node, container -> return annotationNode.forEachChildrenReturnList { node, container ->
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.lightTree
import com.intellij.lang.LighterASTNode import com.intellij.lang.LighterASTNode
import org.jetbrains.kotlin.KtNodeTypes import org.jetbrains.kotlin.KtNodeTypes
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.FirFunctionTarget import org.jetbrains.kotlin.fir.FirFunctionTarget
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
@@ -16,34 +17,58 @@ import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirReturnExpression import org.jetbrains.kotlin.fir.expressions.FirReturnExpression
import org.jetbrains.kotlin.fir.expressions.impl.* import org.jetbrains.kotlin.fir.expressions.impl.*
import org.jetbrains.kotlin.fir.lightTree.fir.TypeConstraint import org.jetbrains.kotlin.fir.lightTree.fir.TypeConstraint
import org.jetbrains.kotlin.fir.lightTree.fir.ValueParameter
import org.jetbrains.kotlin.fir.references.FirResolvedCallableReferenceImpl
import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
import org.jetbrains.kotlin.fir.types.impl.FirImplicitAnyTypeRef import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.FirQualifierPartImpl import org.jetbrains.kotlin.fir.types.impl.*
import org.jetbrains.kotlin.fir.types.impl.FirUserTypeRefImpl
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.types.Variance
object ConverterUtil { object ConverterUtil {
fun String?.nameAsSafeName(defaultName: String = ""): Name { fun String?.nameAsSafeName(defaultName: String = ""): Name {
return when { return when {
this != null -> Name.identifier(this) this != null -> Name.identifier(this.replace("`", ""))
defaultName.isNotEmpty() -> Name.identifier(defaultName) defaultName.isNotEmpty() -> Name.identifier(defaultName)
else -> SpecialNames.NO_NAME_PROVIDED else -> SpecialNames.NO_NAME_PROVIDED
} }
} }
fun Name?.toDelegatedSelfType(session: FirSession): FirTypeRef = fun String.toFirUserType(session: FirSession): FirUserTypeRef {
FirUserTypeRefImpl(session, null, isMarkedNullable = false).apply { val qualifier = FirQualifierPartImpl(
qualifier.add( Name.identifier(this)
FirQualifierPartImpl( )
this@toDelegatedSelfType ?: SpecialNames.NO_NAME_PROVIDED
) return FirUserTypeRefImpl(
) session,
null,
false
).apply {
this.qualifier.add(qualifier)
} }
}
fun toDelegatedSelfType(firClass: FirRegularClass): FirTypeRef {
val typeParameters = firClass.typeParameters.map {
FirTypeParameterImpl(firClass.session, it.psi, FirTypeParameterSymbol(), it.name, Variance.INVARIANT, false).apply {
this.bounds += it.bounds
}
}
return FirResolvedTypeRefImpl(
firClass.session,
null,
ConeClassTypeImpl(
firClass.symbol.toLookupTag(),
typeParameters.map { ConeTypeParameterTypeImpl(it.symbol.toLookupTag(), false) }.toTypedArray(),
false
)
)
}
fun LighterASTNode?.hasSecondaryConstructor(kidsArray: Array<LighterASTNode?>): Boolean { fun LighterASTNode?.hasSecondaryConstructor(kidsArray: Array<LighterASTNode?>): Boolean {
if (this == null) return false if (this == null) return false
@@ -105,6 +130,13 @@ object ConverterUtil {
} }
} }
fun typeParametersFromSelfType(delegatedSelfTypeRef: FirTypeRef): List<FirTypeParameter> {
return delegatedSelfTypeRef.coneTypeSafe<ConeKotlinType>()
?.typeArguments
?.map { ((it as ConeTypeParameterType).lookupTag.symbol as FirTypeParameterSymbol).fir }
?: emptyList()
}
fun <T : FirCallWithArgumentList> T.extractArgumentsFrom(container: List<FirExpression>, stubMode: Boolean): T { fun <T : FirCallWithArgumentList> T.extractArgumentsFrom(container: List<FirExpression>, stubMode: Boolean): T {
if (!stubMode) { if (!stubMode) {
//TODO("not implemented") //TODO("not implemented")
@@ -115,20 +147,21 @@ object ConverterUtil {
fun List<FirEnumEntryImpl>.fillEnumEntryConstructor( fun List<FirEnumEntryImpl>.fillEnumEntryConstructor(
firPrimaryConstructor: FirConstructor, firPrimaryConstructor: FirConstructor,
enumType: FirUserTypeRef,
stubMode: Boolean stubMode: Boolean
) { ) {
this.forEach { firEnumEntry -> this.forEach { firEnumEntry ->
val enumDelegatedSelfTypeRef = firPrimaryConstructor.returnTypeRef val enumDelegatedSelfTypeRef = toDelegatedSelfType(firEnumEntry)
var enumDelegatedSuperTypeRef: FirTypeRef = FirImplicitAnyTypeRef(firEnumEntry.session, null) var enumDelegatedSuperTypeRef: FirTypeRef = FirImplicitAnyTypeRef(firEnumEntry.session, null)
val enumSuperTypeCallEntry = mutableListOf<FirExpression>() val enumSuperTypeCallEntry = mutableListOf<FirExpression>()
if (firPrimaryConstructor.valueParameters.isNotEmpty()) { if (firPrimaryConstructor.valueParameters.isNotEmpty()) {
enumDelegatedSuperTypeRef = enumDelegatedSelfTypeRef enumDelegatedSuperTypeRef = enumType//enumDelegatedSelfTypeRef
firEnumEntry.superTypeRefs += enumDelegatedSuperTypeRef
enumSuperTypeCallEntry += firPrimaryConstructor.valueParameters.map { firValueParameter -> enumSuperTypeCallEntry += firPrimaryConstructor.valueParameters.map { firValueParameter ->
firValueParameter.toFirExpression(stubMode) firValueParameter.toFirExpression(stubMode)
} }
} }
firEnumEntry.superTypeRefs += enumDelegatedSuperTypeRef
val firDelegatedConstructorCall = FirDelegatedConstructorCallImpl( val firDelegatedConstructorCall = FirDelegatedConstructorCallImpl(
firEnumEntry.session, firEnumEntry.session,
@@ -147,6 +180,7 @@ object ConverterUtil {
enumDelegatedSelfTypeRef, enumDelegatedSelfTypeRef,
firDelegatedConstructorCall firDelegatedConstructorCall
) )
firEnumPrimaryConstructor.typeParameters += typeParametersFromSelfType(enumDelegatedSelfTypeRef)
firEnumEntry.declarations.add(0, firEnumPrimaryConstructor) firEnumEntry.declarations.add(0, firEnumPrimaryConstructor)
} }
} }
@@ -157,7 +191,9 @@ object ConverterUtil {
delegatedSuperTypeRef: FirTypeRef delegatedSuperTypeRef: FirTypeRef
) { ) {
this.forEach { constructor -> this.forEach { constructor ->
(constructor as FirConstructorImpl).returnTypeRef = delegatedSelfTypeRef (constructor as FirConstructorImpl).typeParameters += typeParametersFromSelfType(delegatedSelfTypeRef)
constructor.returnTypeRef = delegatedSelfTypeRef
val constructorDelegationCall = constructor.delegatedConstructor as? FirDelegatedConstructorCallImpl val constructorDelegationCall = constructor.delegatedConstructor as? FirDelegatedConstructorCallImpl
val isThis = val isThis =
(constructorDelegationCall == null && hasPrimaryConstructor) || constructorDelegationCall?.isThis == true (constructorDelegationCall == null && hasPrimaryConstructor) || constructorDelegationCall?.isThis == true
@@ -188,9 +224,12 @@ object ClassNameUtil {
val currentClassId val currentClassId
get() = ClassId(packageFqName, className, false) get() = ClassId(packageFqName, className, false)
fun callableIdForName(name: Name) = fun callableIdForName(name: Name, local: Boolean = false) =
if (className == FqName.ROOT) CallableId(packageFqName, name) when {
else CallableId(packageFqName, className, name) local -> CallableId(name)
className == FqName.ROOT -> CallableId(packageFqName, name)
else -> CallableId(packageFqName, className, name)
}
fun callableIdForClassConstructor() = fun callableIdForClassConstructor() =
if (className == FqName.ROOT) CallableId(packageFqName, Name.special("<anonymous-init>")) if (className == FqName.ROOT) CallableId(packageFqName, Name.special("<anonymous-init>"))
@@ -215,4 +254,90 @@ object FunctionUtil {
} }
} }
object DataClassUtil {
fun generateComponentFunctions(
session: FirSession, firClass: FirClassImpl, properties: List<FirProperty>
) {
var componentIndex = 1
for (property in properties) {
if (!property.isVal && !property.isVar) continue
val name = Name.identifier("component$componentIndex")
componentIndex++
val symbol = FirFunctionSymbol(
CallableId(
ClassNameUtil.packageFqName,
ClassNameUtil.className,
name
)
)
firClass.addDeclaration(
FirMemberFunctionImpl(
session, null, symbol, name,
Visibilities.PUBLIC, Modality.FINAL,
isExpect = false, isActual = false,
isOverride = false, isOperator = false,
isInfix = false, isInline = false,
isTailRec = false, isExternal = false,
isSuspend = false, receiverTypeRef = null,
returnTypeRef = FirImplicitTypeRefImpl(session, null)
).apply {
val componentFunction = this
body = FirSingleExpressionBlock(
session,
FirReturnExpressionImpl(
session, null,
FirQualifiedAccessExpressionImpl(session, null).apply {
val parameterName = property.name
calleeReference = FirResolvedCallableReferenceImpl(
session, null,
parameterName, property.symbol
)
}
).apply {
target = FirFunctionTarget(null)
target.bind(componentFunction)
}
)
}
)
}
}
private val copyName = Name.identifier("copy")
fun generateCopyFunction(
session: FirSession, firClass: FirClassImpl,
firPrimaryConstructor: FirConstructor,
properties: List<FirProperty>
) {
val symbol = FirFunctionSymbol(CallableId(ClassNameUtil.packageFqName, ClassNameUtil.className, copyName))
firClass.addDeclaration(
FirMemberFunctionImpl(
session, null, symbol, copyName,
Visibilities.PUBLIC, Modality.FINAL,
isExpect = false, isActual = false,
isOverride = false, isOperator = false,
isInfix = false, isInline = false,
isTailRec = false, isExternal = false,
isSuspend = false, receiverTypeRef = null,
returnTypeRef = firPrimaryConstructor.returnTypeRef//FirImplicitTypeRefImpl(session, this)
).apply {
val copyFunction = this
for (property in properties) {
val name = property.name
valueParameters += FirValueParameterImpl(
session, null, name,
property.returnTypeRef,
FirQualifiedAccessExpressionImpl(session, null).apply {
calleeReference = FirResolvedCallableReferenceImpl(session, null, name, property.symbol)
},
isCrossinline = false, isNoinline = false, isVararg = false
)
}
body = FirEmptyExpressionBlock(session)
}
)
}
}
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter
import org.jetbrains.kotlin.fir.declarations.impl.FirMemberPropertyImpl import org.jetbrains.kotlin.fir.declarations.impl.FirMemberPropertyImpl
import org.jetbrains.kotlin.fir.expressions.impl.FirQualifiedAccessExpressionImpl import org.jetbrains.kotlin.fir.expressions.impl.FirQualifiedAccessExpressionImpl
import org.jetbrains.kotlin.fir.lightTree.ClassNameUtil import org.jetbrains.kotlin.fir.lightTree.ClassNameUtil
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.MemberModifier
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.Modifier import org.jetbrains.kotlin.fir.lightTree.fir.modifier.Modifier
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.PlatformModifier import org.jetbrains.kotlin.fir.lightTree.fir.modifier.PlatformModifier
import org.jetbrains.kotlin.fir.references.FirPropertyFromParameterCallableReference import org.jetbrains.kotlin.fir.references.FirPropertyFromParameterCallableReference
@@ -21,7 +20,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
class ValueParameter( class ValueParameter(
private val isVal: Boolean, private val isVal: Boolean,
private val isVar: Boolean, private val isVar: Boolean,
private val modifier: Modifier, private val modifiers: Modifier,
val firValueParameter: FirValueParameter val firValueParameter: FirValueParameter
) { ) {
fun hasValOrVar(): Boolean { fun hasValOrVar(): Boolean {
@@ -37,11 +36,11 @@ class ValueParameter(
null, null,
FirPropertySymbol(ClassNameUtil.callableIdForName(name)), FirPropertySymbol(ClassNameUtil.callableIdForName(name)),
name, name,
modifier.visibilityModifier.toVisibility(), modifiers.getVisibility(),
modifier.inheritanceModifier?.toModality(), modifiers.getModality(),
modifier.platformModifier == PlatformModifier.EXPECT, modifiers.hasExpect(),
modifier.platformModifier == PlatformModifier.ACTUAL, modifiers.hasActual(),
isOverride = modifier.memberModifier == MemberModifier.OVERRIDE, isOverride = modifiers.hasOverride(),
isConst = false, isConst = false,
isLateInit = false, isLateInit = false,
receiverTypeRef = null, receiverTypeRef = null,
@@ -52,12 +51,12 @@ class ValueParameter(
this@ValueParameter.firValueParameter.session, null, name, this@ValueParameter.firValueParameter.symbol this@ValueParameter.firValueParameter.session, null, name, this@ValueParameter.firValueParameter.symbol
) )
}, },
getter = FirDefaultPropertyGetter(this.firValueParameter.session, null, type, modifier.visibilityModifier.toVisibility()), getter = FirDefaultPropertyGetter(this.firValueParameter.session, null, type, modifiers.getVisibility()),
setter = if (this.isVar) FirDefaultPropertySetter( setter = if (this.isVar) FirDefaultPropertySetter(
this.firValueParameter.session, this.firValueParameter.session,
null, null,
type, type,
modifier.visibilityModifier.toVisibility() modifiers.getVisibility()
) else null, ) else null,
delegate = null delegate = null
).apply { annotations += this@ValueParameter.firValueParameter.annotations } ).apply { annotations += this@ValueParameter.firValueParameter.annotations }
@@ -5,28 +5,137 @@
package org.jetbrains.kotlin.fir.lightTree.fir.modifier package org.jetbrains.kotlin.fir.lightTree.fir.modifier
import com.intellij.lang.LighterASTNode
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.impl.FirAbstractAnnotatedElement import org.jetbrains.kotlin.fir.expressions.impl.FirAbstractAnnotatedElement
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.CLASS_MODIFIER
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.FUNCTION_MODIFIER
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.INHERITANCE_MODIFIER
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.MEMBER_MODIFIER
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.PARAMETER_MODIFIER
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.PLATFORM_MODIFIER
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.PROPERTY_MODIFIER
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.VISIBILITY_MODIFIER
class Modifier( class Modifier(
session: FirSession, session: FirSession,
psi: PsiElement? = null, psi: PsiElement? = null,
var classModifier: ClassModifier? = null, private var classModifier: ClassModifier? = null,
var memberModifier: MemberModifier? = null, private val memberModifiers: MutableList<MemberModifier> = mutableListOf(),
var visibilityModifier: VisibilityModifier = VisibilityModifier.UNKNOWN, private var visibilityModifier: VisibilityModifier = VisibilityModifier.UNKNOWN,
var functionModifier: FunctionModifier? = null, private val functionModifiers: MutableList<FunctionModifier> = mutableListOf(),
var propertyModifier: PropertyModifier? = null, private var propertyModifier: PropertyModifier? = null,
var inheritanceModifier: InheritanceModifier? = null, private var inheritanceModifier: InheritanceModifier? = null,
var parameterModifier: ParameterModifier? = null, private var parameterModifier: ParameterModifier? = null,
var platformModifier: PlatformModifier? = null private var platformModifier: PlatformModifier? = null
) : FirAbstractAnnotatedElement(session, psi) ) : FirAbstractAnnotatedElement(session, psi) {
fun addModifier(modifier: LighterASTNode) {
val tokenType = modifier.tokenType
when {
CLASS_MODIFIER.contains(tokenType) -> this.classModifier = ClassModifier.valueOf(modifier.toString().toUpperCase())
MEMBER_MODIFIER.contains(tokenType) -> this.memberModifiers += MemberModifier.valueOf(modifier.toString().toUpperCase())
VISIBILITY_MODIFIER.contains(tokenType) -> this.visibilityModifier =
VisibilityModifier.valueOf(modifier.toString().toUpperCase())
FUNCTION_MODIFIER.contains(tokenType) -> this.functionModifiers += FunctionModifier.valueOf(modifier.toString().toUpperCase())
PROPERTY_MODIFIER.contains(tokenType) -> this.propertyModifier = PropertyModifier.valueOf(modifier.toString().toUpperCase())
INHERITANCE_MODIFIER.contains(tokenType) -> this.inheritanceModifier =
InheritanceModifier.valueOf(modifier.toString().toUpperCase())
PARAMETER_MODIFIER.contains(tokenType) -> this.parameterModifier = ParameterModifier.valueOf(modifier.toString().toUpperCase())
PLATFORM_MODIFIER.contains(tokenType) -> this.platformModifier = PlatformModifier.valueOf(modifier.toString().toUpperCase())
}
}
enum class ClassModifier{ fun isEnum(): Boolean {
return classModifier == ClassModifier.ENUM
}
fun isAnnotation(): Boolean {
return classModifier == ClassModifier.ANNOTATION
}
fun isDataClass(): Boolean {
return classModifier == ClassModifier.DATA
}
fun isInner(): Boolean {
return classModifier == ClassModifier.INNER
}
fun isCompanion(): Boolean {
return classModifier == ClassModifier.COMPANION
}
fun hasOverride(): Boolean {
return memberModifiers.contains(MemberModifier.OVERRIDE)
}
fun hasLateinit(): Boolean {
return memberModifiers.contains(MemberModifier.LATEINIT)
}
fun getVisibility(): Visibility {
return visibilityModifier.toVisibility()
}
fun hasTailrec(): Boolean {
return functionModifiers.contains(FunctionModifier.TAILREC)
}
fun hasOperator(): Boolean {
return functionModifiers.contains(FunctionModifier.OPERATOR)
}
fun hasInfix(): Boolean {
return functionModifiers.contains(FunctionModifier.INFIX)
}
fun hasInline(): Boolean {
return functionModifiers.contains(FunctionModifier.INLINE)
}
fun hasExternal(): Boolean {
return functionModifiers.contains(FunctionModifier.EXTERNAL)
}
fun hasSuspend(): Boolean {
return functionModifiers.contains(FunctionModifier.SUSPEND)
}
fun isConst(): Boolean {
return propertyModifier == PropertyModifier.CONST
}
fun getModality(): Modality? {
return inheritanceModifier?.toModality()
}
fun hasVararg(): Boolean {
return parameterModifier == ParameterModifier.VARARG
}
fun hasNoinline(): Boolean {
return parameterModifier == ParameterModifier.NOINLINE
}
fun hasCrossinline(): Boolean {
return parameterModifier == ParameterModifier.CROSSINLINE
}
fun hasExpect(): Boolean {
return platformModifier == PlatformModifier.EXPECT
}
fun hasActual(): Boolean {
return platformModifier == PlatformModifier.ACTUAL
}
}
enum class ClassModifier {
ENUM, ENUM,
ANNOTATION, ANNOTATION,
DATA, DATA,
@@ -34,33 +143,33 @@ enum class ClassModifier{
COMPANION COMPANION
} }
enum class MemberModifier{ enum class MemberModifier {
OVERRIDE, OVERRIDE,
LATEINIT LATEINIT
} }
enum class VisibilityModifier{ enum class VisibilityModifier {
PUBLIC{ PUBLIC {
override fun toVisibility(): Visibility { override fun toVisibility(): Visibility {
return Visibilities.PUBLIC return Visibilities.PUBLIC
} }
}, },
PRIVATE{ PRIVATE {
override fun toVisibility(): Visibility { override fun toVisibility(): Visibility {
return Visibilities.PRIVATE return Visibilities.PRIVATE
} }
}, },
INTERNAL{ INTERNAL {
override fun toVisibility(): Visibility { override fun toVisibility(): Visibility {
return Visibilities.INTERNAL return Visibilities.INTERNAL
} }
}, },
PROTECTED{ PROTECTED {
override fun toVisibility(): Visibility { override fun toVisibility(): Visibility {
return Visibilities.PROTECTED return Visibilities.PROTECTED
} }
}, },
UNKNOWN{ UNKNOWN {
override fun toVisibility(): Visibility { override fun toVisibility(): Visibility {
return Visibilities.UNKNOWN return Visibilities.UNKNOWN
} }
@@ -69,7 +178,7 @@ enum class VisibilityModifier{
abstract fun toVisibility(): Visibility abstract fun toVisibility(): Visibility
} }
enum class FunctionModifier{ enum class FunctionModifier {
TAILREC, TAILREC,
OPERATOR, OPERATOR,
INFIX, INFIX,
@@ -78,27 +187,27 @@ enum class FunctionModifier{
SUSPEND SUSPEND
} }
enum class PropertyModifier{ enum class PropertyModifier {
CONST CONST
} }
enum class InheritanceModifier{ enum class InheritanceModifier {
ABSTRACT{ ABSTRACT {
override fun toModality(): Modality { override fun toModality(): Modality {
return Modality.ABSTRACT return Modality.ABSTRACT
} }
}, },
FINAL{ FINAL {
override fun toModality(): Modality { override fun toModality(): Modality {
return Modality.FINAL return Modality.FINAL
} }
}, },
OPEN{ OPEN {
override fun toModality(): Modality { override fun toModality(): Modality {
return Modality.OPEN return Modality.OPEN
} }
}, },
SEALED{ SEALED {
override fun toModality(): Modality { override fun toModality(): Modality {
return Modality.SEALED return Modality.SEALED
} }
@@ -113,7 +222,7 @@ enum class ParameterModifier {
CROSSINLINE CROSSINLINE
} }
enum class PlatformModifier{ enum class PlatformModifier {
EXPECT, EXPECT,
ACTUAL ACTUAL
} }
@@ -0,0 +1,47 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.lightTree.fir.modifier
import com.intellij.psi.tree.TokenSet
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.lexer.KtTokens.*
object ModifierSets {
val CLASS_MODIFIER = TokenSet.create(
ENUM_KEYWORD,
ANNOTATION_KEYWORD,
DATA_KEYWORD,
INNER_KEYWORD,
COMPANION_KEYWORD
)
val MEMBER_MODIFIER = TokenSet.create(OVERRIDE_KEYWORD, LATEINIT_KEYWORD)
val VISIBILITY_MODIFIER = TokenSet.create(
PUBLIC_KEYWORD,
PRIVATE_KEYWORD,
INTERNAL_KEYWORD,
PROTECTED_KEYWORD
)
val FUNCTION_MODIFIER =
TokenSet.create(
TAILREC_KEYWORD,
OPERATOR_KEYWORD,
INFIX_KEYWORD,
INLINE_KEYWORD,
EXTERNAL_KEYWORD,
SUSPEND_KEYWORD
)
val PROPERTY_MODIFIER = TokenSet.create(CONST_KEYWORD)
val INHERITANCE_MODIFIER = TokenSet.create(
ABSTRACT_KEYWORD,
FINAL_KEYWORD,
OPEN_KEYWORD,
SEALED_KEYWORD
)
val PARAMETER_MODIFIER = TokenSet.create(VARARG_KEYWORD, NOINLINE_KEYWORD, CROSSINLINE_KEYWORD)
val PLATFORM_MODIFIER = TokenSet.create(EXPECT_KEYWORD, ACTUAL_KEYWORD)
val VARIANCE_MODIFIER = TokenSet.create(IN_KEYWORD, OUT_KEYWORD)
val REIFICATION_MODIFIER = TokenSet.create(REIFIED_KEYWORD)
}
@@ -5,17 +5,29 @@
package org.jetbrains.kotlin.fir.lightTree.fir.modifier package org.jetbrains.kotlin.fir.lightTree.fir.modifier
import com.intellij.lang.LighterASTNode
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.impl.FirAbstractAnnotatedElement import org.jetbrains.kotlin.fir.expressions.impl.FirAbstractAnnotatedElement
import org.jetbrains.kotlin.lexer.KtTokens
class TypeModifier( class TypeModifier(
session: FirSession, session: FirSession,
psi: PsiElement? = null, psi: PsiElement? = null,
var suspendModifier: SuspendModifier? = null private var suspendModifier: SuspendModifier? = null
) : FirAbstractAnnotatedElement(session, psi) ) : FirAbstractAnnotatedElement(session, psi) {
fun addModifier(modifier: LighterASTNode) {
if (modifier.toString() == KtTokens.SUSPEND_KEYWORD.value) {
this.suspendModifier = SuspendModifier.SUSPEND
}
}
enum class SuspendModifier{ fun hasSuspend(): Boolean {
return suspendModifier == SuspendModifier.SUSPEND
}
}
enum class SuspendModifier {
SUSPEND SUSPEND
} }
@@ -5,20 +5,39 @@
package org.jetbrains.kotlin.fir.lightTree.fir.modifier package org.jetbrains.kotlin.fir.lightTree.fir.modifier
import com.intellij.lang.LighterASTNode
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.impl.FirAbstractAnnotatedElement import org.jetbrains.kotlin.fir.expressions.impl.FirAbstractAnnotatedElement
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.REIFICATION_MODIFIER
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.VARIANCE_MODIFIER
import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.Variance
class TypeParameterModifier( class TypeParameterModifier(
session: FirSession, session: FirSession,
psi: PsiElement? = null, psi: PsiElement? = null,
var varianceModifier: VarianceModifier = VarianceModifier.INVARIANT, private var varianceModifier: VarianceModifier = VarianceModifier.INVARIANT,
var reificationModifier: ReificationModifier? = null private var reificationModifier: ReificationModifier? = null
) : FirAbstractAnnotatedElement(session, psi) ) : FirAbstractAnnotatedElement(session, psi) {
fun addModifier(modifier: LighterASTNode) {
val tokenType = modifier.tokenType
when {
VARIANCE_MODIFIER.contains(tokenType) -> this.varianceModifier = VarianceModifier.valueOf(modifier.toString().toUpperCase())
REIFICATION_MODIFIER.contains(tokenType) -> this.reificationModifier = ReificationModifier.valueOf(modifier.toString().toUpperCase())
}
}
enum class VarianceModifier{ fun getVariance(): Variance {
return varianceModifier.toVariance()
}
fun hasReified(): Boolean {
return reificationModifier == ReificationModifier.REIFIED
}
}
enum class VarianceModifier {
IN { IN {
override fun toVariance(): Variance { override fun toVariance(): Variance {
return Variance.IN_VARIANCE return Variance.IN_VARIANCE
@@ -38,6 +57,6 @@ enum class VarianceModifier{
abstract fun toVariance(): Variance abstract fun toVariance(): Variance
} }
enum class ReificationModifier{ enum class ReificationModifier {
REIFIED REIFIED
} }
@@ -5,13 +5,27 @@
package org.jetbrains.kotlin.fir.lightTree.fir.modifier package org.jetbrains.kotlin.fir.lightTree.fir.modifier
import com.intellij.lang.LighterASTNode
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.impl.FirAbstractAnnotatedElement import org.jetbrains.kotlin.fir.expressions.impl.FirAbstractAnnotatedElement
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.VARIANCE_MODIFIER
import org.jetbrains.kotlin.types.Variance
class TypeProjectionModifier( class TypeProjectionModifier(
session: FirSession, session: FirSession,
psi: PsiElement? = null, psi: PsiElement? = null,
var varianceModifier: VarianceModifier = VarianceModifier.INVARIANT private var varianceModifier: VarianceModifier = VarianceModifier.INVARIANT
) : FirAbstractAnnotatedElement(session, psi) ) : FirAbstractAnnotatedElement(session, psi) {
fun addModifier(modifier: LighterASTNode) {
val tokenType = modifier.tokenType
when {
VARIANCE_MODIFIER.contains(tokenType) -> this.varianceModifier = VarianceModifier.valueOf(modifier.toString().toUpperCase())
}
}
fun getVariance(): Variance {
return varianceModifier.toVariance()
}
}