Fir Java: add type parameters to constructors and their return types

This commit is contained in:
Mikhail Glukhikh
2019-04-18 18:05:18 +03:00
parent 5bf489327d
commit f8bb1d161a
3 changed files with 14 additions and 6 deletions
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFieldSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFieldSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.types.ConeClassErrorType import org.jetbrains.kotlin.fir.types.ConeClassErrorType
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
import org.jetbrains.kotlin.load.java.JavaClassFinder import org.jetbrains.kotlin.load.java.JavaClassFinder
import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.load.java.JvmAnnotationNames
@@ -163,17 +164,24 @@ class JavaSymbolProvider(
for (javaConstructor in javaClass.constructors) { for (javaConstructor in javaClass.constructors) {
val constructorId = CallableId(classId.packageFqName, classId.relativeClassName, classId.shortClassName) val constructorId = CallableId(classId.packageFqName, classId.relativeClassName, classId.shortClassName)
val constructorSymbol = FirFunctionSymbol(constructorId) val constructorSymbol = FirFunctionSymbol(constructorId)
val classTypeParameters = typeParameters.map {
createTypeParameterSymbol(this@JavaSymbolProvider.session, it.name).fir
}
val constructorTypeParameters = javaConstructor.typeParameters.map {
createTypeParameterSymbol(this@JavaSymbolProvider.session, it.name).fir
}
val typeParameters = classTypeParameters + constructorTypeParameters
val firJavaConstructor = FirJavaConstructor( val firJavaConstructor = FirJavaConstructor(
this@JavaSymbolProvider.session, constructorSymbol, javaConstructor.visibility, this@JavaSymbolProvider.session, constructorSymbol, javaConstructor.visibility,
FirResolvedTypeRefImpl( FirResolvedTypeRefImpl(
this@JavaSymbolProvider.session, null, this@JavaSymbolProvider.session, null,
firSymbol.constructType(emptyArray(), false), firSymbol.constructType(
classTypeParameters.map { ConeTypeParameterTypeImpl(it.symbol, false) }.toTypedArray(), false
),
false, emptyList() false, emptyList()
) )
).apply { ).apply {
for (typeParameter in javaConstructor.typeParameters) { this.typeParameters += typeParameters
typeParameters += createTypeParameterSymbol(this@JavaSymbolProvider.session, typeParameter.name).fir
}
addAnnotationsFrom(this@JavaSymbolProvider.session, javaConstructor) addAnnotationsFrom(this@JavaSymbolProvider.session, javaConstructor)
for (valueParameter in javaConstructor.valueParameters) { for (valueParameter in javaConstructor.valueParameters) {
valueParameters += valueParameter.toFirValueParameters(this@JavaSymbolProvider.session) valueParameters += valueParameter.toFirValueParameters(this@JavaSymbolProvider.session)
@@ -1,4 +1,4 @@
public open class ConstructorWithNewTypeParams<T> : R|java/lang/Object| { public open class ConstructorWithNewTypeParams<T> : R|java/lang/Object| {
public constructor(first: R|ft<U, U?>|!): R|test/ConstructorWithNewTypeParams| public constructor(first: R|ft<U, U?>|!): R|test/ConstructorWithNewTypeParams<T>|
} }
@@ -1,4 +1,4 @@
public open class ConstructorWithParentTypeParams<T> : R|java/lang/Object| { public open class ConstructorWithParentTypeParams<T> : R|java/lang/Object| {
public constructor(first: R|ft<T, T?>|!): R|test/ConstructorWithParentTypeParams| public constructor(first: R|ft<T, T?>|!): R|test/ConstructorWithParentTypeParams<T>|
} }