Raw FIR: copy class type-parameters into constructors properly

This commit is contained in:
Simon Ogorodnik
2019-04-25 18:16:10 +03:00
committed by Mikhail Glukhikh
parent 9cef9e4056
commit 77817cb750
12 changed files with 54 additions and 32 deletions
@@ -6,10 +6,8 @@
package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirAnnotationContainer
import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.coneTypeSafe
@@ -28,8 +26,15 @@ interface FirClass : FirDeclarationContainer, FirStatement, FirAnnotationContain
for (superType in superTypeRefs) {
superType.accept(visitor, data)
}
var constructorFound = false
for (declaration in declarations) {
declaration.accept(visitor, data)
if (!constructorFound && declaration is FirConstructor) {
for (typeParameter in declaration.typeParameters) {
typeParameter.accept(visitor, data)
}
constructorFound = true
}
}
}
}
@@ -23,11 +23,13 @@ interface FirConstructor : @VisitedSupertype FirFunction, FirCallableMemberDecla
visitor.visitConstructor(this, data)
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
super<FirCallableMemberDeclaration>.acceptChildren(visitor, data)
acceptAnnotations(visitor, data)
status.accept(visitor, data)
delegatedConstructor?.accept(visitor, data)
for (parameter in valueParameters) {
parameter.accept(visitor, data)
}
returnTypeRef.accept(visitor, data)
body?.accept(visitor, data)
}
}
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
@@ -17,6 +18,7 @@ import org.jetbrains.kotlin.fir.transformInplace
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
open class FirClassImpl(
session: FirSession,
@@ -69,6 +71,7 @@ open class FirClassImpl(
superTypeRefs.transformInplace(transformer, data)
val result = super<FirAbstractMemberDeclaration>.transformChildren(transformer, data) as FirRegularClass
declarations.firstIsInstanceOrNull<FirConstructorImpl>()?.typeParameters?.transformInplace(transformer, data)
// Transform declarations in last turn
declarations.transformInplace(transformer, data)
companionObject = declarations.asSequence().filterIsInstance<FirRegularClass>().firstOrNull { it.isCompanion }
@@ -61,11 +61,14 @@ open class FirConstructorImpl : FirAbstractCallableMember, FirConstructor {
override var body: FirBlock? = null
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
annotations.transformInplace(transformer, data)
valueParameters.transformInplace(transformer, data)
returnTypeRef = returnTypeRef.transformSingle(transformer, data)
status = status.transformSingle(transformer, data)
delegatedConstructor?.transformSingle(transformer, data)
body = body?.transformSingle(transformer, data)
return super<FirAbstractCallableMember>.transformChildren(transformer, data)
return this
}
companion object {