FIR: transform types inside functions & properties
This commit is contained in:
@@ -84,7 +84,11 @@ class RawFirBuilder(val session: FirSession) {
|
||||
isGetter: Boolean
|
||||
): FirPropertyAccessor {
|
||||
if (this == null) {
|
||||
return FirDefaultPropertyAccessor(session, property, isGetter, propertyType)
|
||||
return if (isGetter) {
|
||||
FirDefaultPropertyGetter(session, property, propertyType)
|
||||
} else {
|
||||
FirDefaultPropertySetter(session, property, propertyType)
|
||||
}
|
||||
}
|
||||
val firAccessor = FirPropertyAccessorImpl(
|
||||
session,
|
||||
|
||||
+1
-1
@@ -32,7 +32,7 @@ class FirTypeResolverImpl : FirTypeResolver {
|
||||
ConeKotlinErrorType(type.reason)
|
||||
}
|
||||
is FirFunctionType, is FirDynamicType, is FirImplicitType, is FirDelegatedType -> {
|
||||
ConeKotlinErrorType("Not supported: $type")
|
||||
ConeKotlinErrorType("Not supported: ${type::class.simpleName}")
|
||||
}
|
||||
else -> error("!")
|
||||
}
|
||||
|
||||
@@ -28,3 +28,7 @@ fun <T : FirElement, D> MutableList<T>.transformInplace(transformer: FirTransfor
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fun <T : FirElement, D> T.transformSingle(transformer: FirTransformer<D>, data: D): T {
|
||||
return this.transform<T, D>(transformer, data).single
|
||||
}
|
||||
+14
-3
@@ -8,9 +8,12 @@ package org.jetbrains.kotlin.fir.declarations.impl
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirCallableMember
|
||||
import org.jetbrains.kotlin.fir.transformSingle
|
||||
import org.jetbrains.kotlin.fir.types.FirType
|
||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
abstract class FirAbstractCallableMember(
|
||||
@@ -20,6 +23,14 @@ abstract class FirAbstractCallableMember(
|
||||
visibility: Visibility,
|
||||
modality: Modality,
|
||||
final override val isOverride: Boolean,
|
||||
final override val receiverType: FirType?,
|
||||
final override val returnType: FirType
|
||||
) : FirAbstractMemberDeclaration(session, psi, name, visibility, modality), FirCallableMember
|
||||
final override var receiverType: FirType?,
|
||||
final override var returnType: FirType
|
||||
) : FirAbstractMemberDeclaration(session, psi, name, visibility, modality), FirCallableMember {
|
||||
|
||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
||||
receiverType = receiverType?.transformSingle(transformer, data)
|
||||
returnType = returnType.transformSingle(transformer, data)
|
||||
|
||||
return this
|
||||
}
|
||||
}
|
||||
+9
@@ -6,10 +6,13 @@
|
||||
package org.jetbrains.kotlin.fir.declarations.impl
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||
import org.jetbrains.kotlin.fir.expressions.FirBody
|
||||
import org.jetbrains.kotlin.fir.transformInplace
|
||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||
|
||||
abstract class FirAbstractFunction(
|
||||
session: FirSession,
|
||||
@@ -17,4 +20,10 @@ abstract class FirAbstractFunction(
|
||||
final override val body: FirBody?
|
||||
) : FirAbstractAnnotatedDeclaration(session, psi), FirFunction {
|
||||
final override val valueParameters = mutableListOf<FirValueParameter>()
|
||||
|
||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
||||
valueParameters.transformInplace(transformer, data)
|
||||
|
||||
return this
|
||||
}
|
||||
}
|
||||
+44
-14
@@ -7,32 +7,62 @@ package org.jetbrains.kotlin.fir.declarations.impl
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
|
||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirBody
|
||||
import org.jetbrains.kotlin.fir.transformInplace
|
||||
import org.jetbrains.kotlin.fir.transformSingle
|
||||
import org.jetbrains.kotlin.fir.types.FirType
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirUnitType
|
||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||
|
||||
class FirDefaultPropertyAccessor(
|
||||
override val session: FirSession,
|
||||
override val psi: PsiElement?,
|
||||
override val isGetter: Boolean,
|
||||
propertyType: FirType
|
||||
abstract class FirDefaultPropertyAccessor(
|
||||
final override val session: FirSession,
|
||||
final override val psi: PsiElement?,
|
||||
final override val isGetter: Boolean
|
||||
) : FirPropertyAccessor {
|
||||
override val visibility =
|
||||
final override val visibility =
|
||||
Visibilities.UNKNOWN
|
||||
|
||||
override val valueParameters: List<FirValueParameter> =
|
||||
if (isGetter) emptyList() else listOf(FirDefaultSetterValueParameter(session, psi, propertyType))
|
||||
|
||||
override val returnType: FirType =
|
||||
if (isGetter) propertyType else FirUnitType(session, psi)
|
||||
|
||||
override val body: FirBody? =
|
||||
final override val body: FirBody? =
|
||||
null
|
||||
|
||||
override val annotations: List<FirAnnotationCall>
|
||||
final override val annotations: List<FirAnnotationCall>
|
||||
get() = emptyList()
|
||||
}
|
||||
|
||||
class FirDefaultPropertyGetter(
|
||||
session: FirSession,
|
||||
psi: PsiElement?,
|
||||
propertyType: FirType
|
||||
): FirDefaultPropertyAccessor(session, psi, isGetter = true) {
|
||||
override val valueParameters: List<FirValueParameter> = emptyList()
|
||||
|
||||
override var returnType: FirType = propertyType
|
||||
|
||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
||||
returnType = returnType.transformSingle(transformer, data)
|
||||
|
||||
return this
|
||||
}
|
||||
}
|
||||
|
||||
class FirDefaultPropertySetter(
|
||||
session: FirSession,
|
||||
psi: PsiElement?,
|
||||
propertyType: FirType
|
||||
): FirDefaultPropertyAccessor(session, psi, isGetter = false) {
|
||||
override val valueParameters = mutableListOf(FirDefaultSetterValueParameter(session, psi, propertyType))
|
||||
|
||||
override var returnType: FirType = FirUnitType(session, psi)
|
||||
|
||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
||||
valueParameters.transformInplace(transformer, data)
|
||||
returnType = returnType.transformSingle(transformer, data)
|
||||
|
||||
return this
|
||||
}
|
||||
}
|
||||
+10
-1
@@ -6,16 +6,19 @@
|
||||
package org.jetbrains.kotlin.fir.declarations.impl
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.transformSingle
|
||||
import org.jetbrains.kotlin.fir.types.FirType
|
||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
class FirDefaultSetterValueParameter(
|
||||
session: FirSession,
|
||||
psi: PsiElement?,
|
||||
override val returnType: FirType
|
||||
override var returnType: FirType
|
||||
) : FirAbstractNamedAnnotatedDeclaration(session, psi, name), FirValueParameter {
|
||||
override val isCrossinline = false
|
||||
|
||||
@@ -25,6 +28,12 @@ class FirDefaultSetterValueParameter(
|
||||
|
||||
override val defaultValue: FirExpression? = null
|
||||
|
||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
||||
returnType = returnType.transformSingle(transformer, data)
|
||||
|
||||
return this
|
||||
}
|
||||
|
||||
companion object {
|
||||
val name = Name.identifier("value")
|
||||
}
|
||||
|
||||
+9
@@ -8,11 +8,14 @@ package org.jetbrains.kotlin.fir.declarations.impl
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirNamedFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||
import org.jetbrains.kotlin.fir.expressions.FirBody
|
||||
import org.jetbrains.kotlin.fir.transformInplace
|
||||
import org.jetbrains.kotlin.fir.types.FirType
|
||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
class FirMemberFunctionImpl(
|
||||
@@ -33,4 +36,10 @@ class FirMemberFunctionImpl(
|
||||
) : FirAbstractCallableMember(session, psi, name, visibility, modality, isOverride, receiverType, returnType),
|
||||
FirNamedFunction {
|
||||
override val valueParameters = mutableListOf<FirValueParameter>()
|
||||
|
||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
||||
valueParameters.transformInplace(transformer, data)
|
||||
|
||||
return super<FirAbstractCallableMember>.transformChildren(transformer, data)
|
||||
}
|
||||
}
|
||||
+13
-3
@@ -8,11 +8,14 @@ package org.jetbrains.kotlin.fir.declarations.impl
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.transformSingle
|
||||
import org.jetbrains.kotlin.fir.types.FirType
|
||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
class FirMemberPropertyImpl(
|
||||
@@ -27,8 +30,15 @@ class FirMemberPropertyImpl(
|
||||
returnType: FirType,
|
||||
override val isVar: Boolean,
|
||||
override val initializer: FirExpression?,
|
||||
override val getter: FirPropertyAccessor,
|
||||
override val setter: FirPropertyAccessor,
|
||||
override var getter: FirPropertyAccessor,
|
||||
override var setter: FirPropertyAccessor,
|
||||
override val delegate: FirExpression?
|
||||
) : FirAbstractCallableMember(session, psi, name, visibility, modality, isOverride, receiverType, returnType),
|
||||
FirProperty
|
||||
FirProperty {
|
||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
||||
getter = getter.transformSingle(transformer, data)
|
||||
setter = setter.transformSingle(transformer, data)
|
||||
|
||||
return super<FirAbstractCallableMember>.transformChildren(transformer, data)
|
||||
}
|
||||
}
|
||||
+11
-2
@@ -7,16 +7,25 @@ package org.jetbrains.kotlin.fir.declarations.impl
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
|
||||
import org.jetbrains.kotlin.fir.expressions.FirBody
|
||||
import org.jetbrains.kotlin.fir.transformSingle
|
||||
import org.jetbrains.kotlin.fir.types.FirType
|
||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||
|
||||
class FirPropertyAccessorImpl(
|
||||
session: FirSession,
|
||||
psi: PsiElement?,
|
||||
override val isGetter: Boolean,
|
||||
override val visibility: Visibility,
|
||||
override val returnType: FirType,
|
||||
override var returnType: FirType,
|
||||
body: FirBody?
|
||||
) : FirAbstractFunction(session, psi, body), FirPropertyAccessor
|
||||
) : FirAbstractFunction(session, psi, body), FirPropertyAccessor {
|
||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
||||
returnType = returnType.transformSingle(transformer, data)
|
||||
|
||||
return super<FirAbstractFunction>.transformChildren(transformer, data)
|
||||
}
|
||||
}
|
||||
+11
-2
@@ -6,20 +6,29 @@
|
||||
package org.jetbrains.kotlin.fir.declarations.impl
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.transformSingle
|
||||
import org.jetbrains.kotlin.fir.types.FirType
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||
|
||||
class FirValueParameterImpl(
|
||||
session: FirSession,
|
||||
psi: PsiElement?,
|
||||
val isProperty: Boolean,
|
||||
name: Name,
|
||||
override val returnType: FirType,
|
||||
override var returnType: FirType,
|
||||
override val defaultValue: FirExpression?,
|
||||
override val isCrossinline: Boolean,
|
||||
override val isNoinline: Boolean,
|
||||
override val isVararg: Boolean
|
||||
) : FirAbstractNamedAnnotatedDeclaration(session, psi, name), FirValueParameter
|
||||
) : FirAbstractNamedAnnotatedDeclaration(session, psi, name), FirValueParameter {
|
||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
||||
returnType = returnType.transformSingle(transformer, data)
|
||||
|
||||
return this
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
interface SomeInterface {
|
||||
fun foo(x: Int, y: String): String
|
||||
|
||||
val bar: Boolean
|
||||
}
|
||||
|
||||
class SomeClass : SomeInterface {
|
||||
private val baz = 42
|
||||
|
||||
override fun foo(x: Int, y: String): String {
|
||||
return y + x + baz
|
||||
}
|
||||
|
||||
override var bar: Boolean
|
||||
get() = true
|
||||
set(value) {}
|
||||
|
||||
var fau: Double
|
||||
}
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
FILE: simpleClass.kt
|
||||
unknown final interface SomeInterface() {
|
||||
unknown final function foo(x: R/error: Failed to resolve qualified type/, y: R/error: Failed to resolve qualified type/): R/error: Failed to resolve qualified type/
|
||||
|
||||
unknown final property bar(val): R/error: Failed to resolve qualified type/
|
||||
unknown get(): R/error: Failed to resolve qualified type/
|
||||
|
||||
}
|
||||
unknown final class SomeClass() : R/<root>.SomeInterface/ {
|
||||
private final property baz(val): R/error: Not supported: FirImplicitTypeImpl/ = STUB
|
||||
unknown get(): R/error: Not supported: FirImplicitTypeImpl/
|
||||
|
||||
unknown final override function foo(x: R/error: Failed to resolve qualified type/, y: R/error: Failed to resolve qualified type/): R/error: Failed to resolve qualified type/ {
|
||||
}
|
||||
|
||||
unknown final override property bar(var): R/error: Failed to resolve qualified type/
|
||||
unknown get(): R/error: Not supported: FirImplicitTypeImpl/ {
|
||||
STUB
|
||||
}
|
||||
unknown set(value: R/error: Failed to resolve qualified type/): R/error: Not supported: FirImplicitTypeImpl/ {
|
||||
}
|
||||
|
||||
unknown final property fau(var): R/error: Failed to resolve qualified type/
|
||||
unknown get(): R/error: Failed to resolve qualified type/
|
||||
unknown set(value: R/error: Failed to resolve qualified type/): R/kotlin.Unit/
|
||||
|
||||
}
|
||||
@@ -37,6 +37,12 @@ public class FirResolveTestCaseGenerated extends AbstractFirResolveTestCase {
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("simpleClass.kt")
|
||||
public void testSimpleClass() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/fir/resolve/simpleClass.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("TwoDeclarationsInSameFile.kt")
|
||||
public void testTwoDeclarationsInSameFile() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/fir/resolve/TwoDeclarationsInSameFile.kt");
|
||||
|
||||
Reference in New Issue
Block a user