FIR: Introduce new kotlin types aka 'cones' #KT-24063 Fixed
This commit is contained in:
committed by
Mikhail Glukhikh
parent
12acbaaa21
commit
ce7456c93d
@@ -0,0 +1,22 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
import org.jetbrains.kotlin.name.FqNameUnsafe
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
data class UnambiguousFqName(val packageFqName: FqNameUnsafe, val classFqName: FqName) {
|
||||||
|
|
||||||
|
override fun toString(): String {
|
||||||
|
return packageFqName.asString() + "/" + classFqName.asString()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.types
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.UnambiguousFqName
|
||||||
|
|
||||||
|
sealed class ConeKotlinTypeProjection(val kind: ProjectionKind)
|
||||||
|
|
||||||
|
enum class ProjectionKind {
|
||||||
|
STAR, IN, OUT, INVARIANT
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
object StarProjection : ConeKotlinTypeProjection(ProjectionKind.STAR)
|
||||||
|
|
||||||
|
abstract class ConeKotlinTypeProjectionIn : ConeKotlinTypeProjection(ProjectionKind.IN) {
|
||||||
|
abstract val type: ConeKotlinType
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class ConeKotlinTypeProjectionOut : ConeKotlinTypeProjection(ProjectionKind.OUT) {
|
||||||
|
abstract val type: ConeKotlinType
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class ConeKotlinType : ConeKotlinTypeProjection(ProjectionKind.INVARIANT) {
|
||||||
|
abstract val typeArguments: List<ConeKotlinTypeProjection>
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class ConeClassType : ConeKotlinType() {
|
||||||
|
abstract val fqName: UnambiguousFqName
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.types.impl
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.UnambiguousFqName
|
||||||
|
import org.jetbrains.kotlin.fir.types.*
|
||||||
|
|
||||||
|
class ConeClassTypeImpl(
|
||||||
|
override val fqName: UnambiguousFqName,
|
||||||
|
override val typeArguments: List<ConeKotlinTypeProjection>
|
||||||
|
) : ConeClassType()
|
||||||
|
|
||||||
|
class NewKotlinTypeProjectionInImpl(override val type: ConeKotlinType) : ConeKotlinTypeProjectionIn()
|
||||||
|
|
||||||
|
class ConeKotlinTypeProjectionOutImpl(override val type: ConeKotlinType) : ConeKotlinTypeProjectionOut()
|
||||||
|
|
||||||
|
class ConeKotlinErrorType(val reason: String) : ConeKotlinType() {
|
||||||
|
override val typeArguments: List<ConeKotlinTypeProjection>
|
||||||
|
get() = emptyList()
|
||||||
|
|
||||||
|
override fun toString(): String {
|
||||||
|
return "<ERROR TYPE: $reason>"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir
|
|||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.expressions.*
|
import org.jetbrains.kotlin.fir.expressions.*
|
||||||
import org.jetbrains.kotlin.fir.types.*
|
import org.jetbrains.kotlin.fir.types.*
|
||||||
|
import org.jetbrains.kotlin.fir.types.impl.ConeKotlinErrorType
|
||||||
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
|
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
|
||||||
import org.jetbrains.kotlin.types.Variance
|
import org.jetbrains.kotlin.types.Variance
|
||||||
import org.jetbrains.kotlin.utils.Printer
|
import org.jetbrains.kotlin.utils.Printer
|
||||||
@@ -364,10 +365,34 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
|
|||||||
visitTypeWithNullability(functionType)
|
visitTypeWithNullability(functionType)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun ConeKotlinType.asString(): String {
|
||||||
|
return when (this) {
|
||||||
|
is ConeKotlinErrorType -> "error: $reason"
|
||||||
|
is ConeClassType -> {
|
||||||
|
val sb = StringBuilder()
|
||||||
|
val fqName = fqName
|
||||||
|
sb.append(fqName.packageFqName.asString().replace('.', '/'))
|
||||||
|
sb.append('.')
|
||||||
|
sb.append(fqName.classFqName.asString())
|
||||||
|
sb.append(typeArguments.joinToString { it ->
|
||||||
|
when (it) {
|
||||||
|
StarProjection -> "*"
|
||||||
|
is ConeKotlinTypeProjectionIn -> "in ${it.type.asString()}"
|
||||||
|
is ConeKotlinTypeProjectionOut -> "out ${it.type.asString()}"
|
||||||
|
is ConeKotlinType -> it.asString()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
sb.toString()
|
||||||
|
}
|
||||||
|
else -> "Unsupported: $this"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun visitResolvedType(resolvedType: FirResolvedType) {
|
override fun visitResolvedType(resolvedType: FirResolvedType) {
|
||||||
resolvedType.annotations.renderAnnotations()
|
resolvedType.annotations.renderAnnotations()
|
||||||
print("R/")
|
print("R/")
|
||||||
print(resolvedType.type)
|
val coneType = resolvedType.type
|
||||||
|
print(coneType.asString())
|
||||||
print("/")
|
print("/")
|
||||||
visitTypeWithNullability(resolvedType)
|
visitTypeWithNullability(resolvedType)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
|||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
|
|
||||||
interface FirResolvedType : FirTypeWithNullability {
|
interface FirResolvedType : FirTypeWithNullability {
|
||||||
val type: KotlinType
|
val type: ConeKotlinType
|
||||||
|
|
||||||
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
|
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
|
||||||
visitor.visitResolvedType(this, data)
|
visitor.visitResolvedType(this, data)
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.types.impl
|
||||||
|
|
||||||
|
import com.intellij.psi.PsiElement
|
||||||
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.UnambiguousFqName
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
|
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||||
|
import org.jetbrains.kotlin.fir.types.FirResolvedType
|
||||||
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
import org.jetbrains.kotlin.name.FqNameUnsafe
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
|
sealed class FirBuiltinType(
|
||||||
|
final override val session: FirSession,
|
||||||
|
final override val psi: PsiElement?,
|
||||||
|
val name: String
|
||||||
|
) : FirResolvedType {
|
||||||
|
final override val type: ConeKotlinType = ConeClassTypeImpl(
|
||||||
|
UnambiguousFqName(
|
||||||
|
KOTLIN_PACKAGE_FQ_NAME,
|
||||||
|
FqName.topLevel(Name.identifier(name))
|
||||||
|
), emptyList()
|
||||||
|
)
|
||||||
|
|
||||||
|
final override val isNullable = false
|
||||||
|
|
||||||
|
final override val annotations: List<FirAnnotationCall>
|
||||||
|
get() = emptyList()
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private val KOTLIN_PACKAGE_FQ_NAME = FqNameUnsafe.topLevel(Name.identifier("kotlin"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class FirUnitType(
|
||||||
|
session: FirSession,
|
||||||
|
psi: PsiElement?
|
||||||
|
) : FirBuiltinType(session, psi, "Unit")
|
||||||
+7
-13
@@ -1,26 +1,20 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
* that can be found in the license/LICENSE.txt file.
|
* that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jetbrains.kotlin.fir.types.impl
|
package org.jetbrains.kotlin.fir.types.impl
|
||||||
|
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
|
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
|
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||||
import org.jetbrains.kotlin.fir.types.FirResolvedType
|
import org.jetbrains.kotlin.fir.types.FirResolvedType
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
|
||||||
|
|
||||||
class FirUnitType(
|
class FirResolvedTypeImpl(
|
||||||
override val session: FirSession,
|
override val session: FirSession,
|
||||||
override val psi: PsiElement?
|
override val psi: PsiElement?,
|
||||||
) : FirResolvedType {
|
override val type: ConeKotlinType,
|
||||||
override val type: KotlinType
|
override val isNullable: Boolean,
|
||||||
get() = DefaultBuiltIns.Instance.unitType
|
|
||||||
|
|
||||||
override val isNullable = false
|
|
||||||
|
|
||||||
override val annotations: List<FirAnnotationCall>
|
override val annotations: List<FirAnnotationCall>
|
||||||
get() = emptyList()
|
) : FirResolvedType
|
||||||
}
|
|
||||||
@@ -22,6 +22,6 @@ FILE: simpleClass.kt
|
|||||||
|
|
||||||
unknown final property fau(var): Double
|
unknown final property fau(var): Double
|
||||||
unknown get(): Double
|
unknown get(): Double
|
||||||
unknown set(value: Double): R/Unit/
|
unknown set(value: Double): R/kotlin.Unit/
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user