FIR: include properties from primary constructors in tree

This commit is contained in:
Mikhail Glukhikh
2018-04-03 22:30:58 +03:00
parent e2cec9125d
commit b58e372db3
10 changed files with 60 additions and 6 deletions
@@ -74,12 +74,10 @@ class RawFirBuilder(val session: FirSession) {
}
private inner class Visitor : KtVisitor<FirElement, Unit>() {
@Suppress("UNCHECKED_CAST")
private fun <R : FirElement> KtElement?.convertSafe(): R? =
private inline fun <reified R : FirElement> KtElement?.convertSafe(): R? =
this?.accept(this@Visitor, Unit) as? R
@Suppress("UNCHECKED_CAST")
private fun <R : FirElement> KtElement.convert(): R =
private inline fun <reified R : FirElement> KtElement.convert(): R =
this.accept(this@Visitor, Unit) as R
private fun KtTypeReference?.toFirOrImplicitType(): FirType =
@@ -126,7 +124,6 @@ class RawFirBuilder(val session: FirSession) {
val firValueParameter = FirValueParameterImpl(
session,
this,
hasValOrVar(),
nameAsSafeName,
when {
typeReference != null -> typeReference.toFirOrErrorType()
@@ -142,6 +139,31 @@ class RawFirBuilder(val session: FirSession) {
return firValueParameter
}
private fun KtParameter.toFirProperty(): FirProperty {
require(hasValOrVar())
val type = typeReference.toFirOrErrorType()
val firProperty = FirMemberPropertyImpl(
session,
this,
nameAsSafeName,
visibility,
modality,
platformStatus,
isOverride = hasModifier(KtTokens.OVERRIDE_KEYWORD),
isConst = false,
isLateInit = false,
receiverType = null,
returnType = type,
isVar = valOrVarKeyword?.node?.elementType == KtTokens.VAR_KEYWORD,
initializer = null,
getter = FirDefaultPropertyGetter(session, this, type),
setter = FirDefaultPropertySetter(session, this, type),
delegate = null
)
extractAnnotationsTo(firProperty)
return firProperty
}
private fun KtModifierListOwner.extractAnnotationsTo(container: FirAbstractAnnotatedDeclaration) {
for (annotationEntry in annotationEntries) {
container.annotations += annotationEntry.convert<FirAnnotationCall>()
@@ -297,6 +319,12 @@ class RawFirBuilder(val session: FirSession) {
classOrObject.extractAnnotationsTo(firClass)
classOrObject.extractTypeParametersTo(firClass)
classOrObject.extractSuperTypeListEntriesTo(firClass)
classOrObject.primaryConstructor?.valueParameters?.forEach {
if (it.hasValOrVar()) {
firClass.declarations += it.toFirProperty()
}
}
for (declaration in classOrObject.declarations) {
firClass.declarations += declaration.convert<FirDeclaration>()
}