Raw FIR: copy class type-parameters into constructors properly
This commit is contained in:
committed by
Mikhail Glukhikh
parent
9cef9e4056
commit
77817cb750
@@ -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 }
|
||||
|
||||
+4
-1
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user