FIR: transform types inside functions & properties

This commit is contained in:
Mikhail Glukhikh
2018-03-20 16:18:23 +03:00
parent be35b904f2
commit 1ba498b021
14 changed files with 183 additions and 27 deletions
@@ -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,
@@ -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
}
@@ -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
}
}
@@ -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
}
}
@@ -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
}
}
@@ -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")
}
@@ -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)
}
}
@@ -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)
}
}
@@ -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)
}
}
@@ -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
View File
@@ -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
View File
@@ -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");