[FIR] Make FirPlaceholderProjection having source element

This commit is contained in:
Victor Petukhov
2021-10-26 13:39:41 +03:00
parent 5047751b85
commit 697ef03d57
15 changed files with 107 additions and 21 deletions
@@ -36,7 +36,6 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.FirTypePlaceholderProjection
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
@@ -873,7 +872,7 @@ class HtmlFirDump internal constructor(private var linkResolver: FirLinkResolver
generate(typeProjection.typeRef)
}
is FirStarProjection -> +"*"
is FirTypePlaceholderProjection -> +"_"
is FirPlaceholderProjection -> +"_"
}
}
@@ -2064,7 +2064,9 @@ class DeclarationsConverter(
//annotations from modifiers must be ignored
return when {
isStarProjection -> buildStarProjection { source = typeProjection.toFirSourceElement() }
allowedUnderscoredTypeArgument && (firType as? FirUserTypeRef)?.isUnderscored == true -> FirTypePlaceholderProjection
allowedUnderscoredTypeArgument && (firType as? FirUserTypeRef)?.isUnderscored == true -> buildPlaceholderProjection {
source = typeProjection.toFirSourceElement()
}
else -> buildTypeProjectionWithVariance {
source = typeProjection.toFirSourceElement()
typeRef = firType
@@ -33,7 +33,6 @@ import org.jetbrains.kotlin.fir.types.builder.*
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
import org.jetbrains.kotlin.fir.types.impl.FirQualifierPartImpl
import org.jetbrains.kotlin.fir.types.impl.FirTypeArgumentListImpl
import org.jetbrains.kotlin.fir.types.impl.FirTypePlaceholderProjection
import org.jetbrains.kotlin.lexer.KtTokens.*
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.Name
@@ -1785,7 +1784,9 @@ open class RawFirBuilder(
}
val typeReference = typeProjection.typeReference
if (typeReference?.isPlaceholder == true) {
return FirTypePlaceholderProjection
return buildPlaceholderProjection {
source = projectionSource
}
}
val firType = typeReference.toFirOrErrorType()
return buildTypeProjectionWithVariance {
@@ -18,7 +18,6 @@ import org.jetbrains.kotlin.fir.scopes.impl.toConeType
import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag
import org.jetbrains.kotlin.fir.symbols.ensureResolved
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.FirTypePlaceholderProjection
import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemOperation
import org.jetbrains.kotlin.resolve.calls.inference.model.SimpleConstraintSystemConstraintPosition
@@ -80,7 +79,7 @@ internal object CreateFreshTypeVariableSubstitutorStage : ResolutionStage() {
?: context.session.builtinTypes.nullableAnyType.type,
SimpleConstraintSystemConstraintPosition
)
else -> assert(typeArgument == FirTypePlaceholderProjection) {
else -> assert(typeArgument is FirPlaceholderProjection) {
"Unexpected typeArgument: ${typeArgument.renderWithType()}"
}
}
@@ -7,18 +7,18 @@ package org.jetbrains.kotlin.fir.resolve.calls
import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner
import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.types.impl.FirTypePlaceholderProjection
import org.jetbrains.kotlin.fir.types.builder.buildPlaceholderProjection
sealed class TypeArgumentMapping {
abstract operator fun get(typeParameterIndex: Int): FirTypeProjection
object NoExplicitArguments : TypeArgumentMapping() {
override fun get(typeParameterIndex: Int): FirTypeProjection = FirTypePlaceholderProjection
override fun get(typeParameterIndex: Int): FirTypeProjection = buildPlaceholderProjection()
}
class Mapped(private val ordered: List<FirTypeProjection>) : TypeArgumentMapping() {
override fun get(typeParameterIndex: Int): FirTypeProjection {
return ordered.getOrElse(typeParameterIndex) { FirTypePlaceholderProjection }
return ordered.getOrElse(typeParameterIndex) { buildPlaceholderProjection() }
}
}
}
@@ -0,0 +1,25 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* 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.KtSourceElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.visitors.*
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
abstract class FirPlaceholderProjection : FirTypeProjection() {
abstract override val source: KtSourceElement?
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitPlaceholderProjection(this, data)
@Suppress("UNCHECKED_CAST")
override fun <E: FirElement, D> transform(transformer: FirTransformer<D>, data: D): E =
transformer.transformPlaceholderProjection(this, data) as E
}
@@ -0,0 +1,38 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* 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.builder
import kotlin.contracts.*
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.types.FirPlaceholderProjection
import org.jetbrains.kotlin.fir.types.impl.FirPlaceholderProjectionImpl
import org.jetbrains.kotlin.fir.visitors.*
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
@FirBuilderDsl
class FirPlaceholderProjectionBuilder {
var source: KtSourceElement? = null
fun build(): FirPlaceholderProjection {
return FirPlaceholderProjectionImpl(
source,
)
}
}
@OptIn(ExperimentalContracts::class)
inline fun buildPlaceholderProjection(init: FirPlaceholderProjectionBuilder.() -> Unit = {}): FirPlaceholderProjection {
contract {
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
}
return FirPlaceholderProjectionBuilder().apply(init).build()
}
@@ -6,8 +6,7 @@
package org.jetbrains.kotlin.fir.types.impl
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirPlaceholderProjection
import org.jetbrains.kotlin.fir.visitors.*
/*
@@ -15,12 +14,12 @@ import org.jetbrains.kotlin.fir.visitors.*
* DO NOT MODIFY IT MANUALLY
*/
object FirTypePlaceholderProjection : FirTypeProjection() {
override val source: KtSourceElement? get() = null
internal class FirPlaceholderProjectionImpl(
override val source: KtSourceElement?,
) : FirPlaceholderProjection() {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirTypePlaceholderProjection {
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirPlaceholderProjectionImpl {
return this
}
}
@@ -66,6 +66,7 @@ import org.jetbrains.kotlin.fir.expressions.FirTryExpression
import org.jetbrains.kotlin.fir.expressions.FirConstExpression
import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirStarProjection
import org.jetbrains.kotlin.fir.types.FirPlaceholderProjection
import org.jetbrains.kotlin.fir.types.FirTypeProjectionWithVariance
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirCall
@@ -191,6 +192,8 @@ abstract class FirDefaultVisitor<out R, in D> : FirVisitor<R, D>() {
override fun visitStarProjection(starProjection: FirStarProjection, data: D): R = visitTypeProjection(starProjection, data)
override fun visitPlaceholderProjection(placeholderProjection: FirPlaceholderProjection, data: D): R = visitTypeProjection(placeholderProjection, data)
override fun visitTypeProjectionWithVariance(typeProjectionWithVariance: FirTypeProjectionWithVariance, data: D): R = visitTypeProjection(typeProjectionWithVariance, data)
override fun visitCall(call: FirCall, data: D): R = visitStatement(call, data)
@@ -66,6 +66,7 @@ import org.jetbrains.kotlin.fir.expressions.FirTryExpression
import org.jetbrains.kotlin.fir.expressions.FirConstExpression
import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirStarProjection
import org.jetbrains.kotlin.fir.types.FirPlaceholderProjection
import org.jetbrains.kotlin.fir.types.FirTypeProjectionWithVariance
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirCall
@@ -191,6 +192,8 @@ abstract class FirDefaultVisitorVoid : FirVisitorVoid() {
override fun visitStarProjection(starProjection: FirStarProjection) = visitTypeProjection(starProjection)
override fun visitPlaceholderProjection(placeholderProjection: FirPlaceholderProjection) = visitTypeProjection(placeholderProjection)
override fun visitTypeProjectionWithVariance(typeProjectionWithVariance: FirTypeProjectionWithVariance) = visitTypeProjection(typeProjectionWithVariance)
override fun visitCall(call: FirCall) = visitStatement(call)
@@ -66,6 +66,7 @@ import org.jetbrains.kotlin.fir.expressions.FirTryExpression
import org.jetbrains.kotlin.fir.expressions.FirConstExpression
import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirStarProjection
import org.jetbrains.kotlin.fir.types.FirPlaceholderProjection
import org.jetbrains.kotlin.fir.types.FirTypeProjectionWithVariance
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirCall
@@ -386,6 +387,10 @@ abstract class FirTransformer<in D> : FirVisitor<FirElement, D>() {
return transformElement(starProjection, data)
}
open fun transformPlaceholderProjection(placeholderProjection: FirPlaceholderProjection, data: D): FirTypeProjection {
return transformElement(placeholderProjection, data)
}
open fun transformTypeProjectionWithVariance(typeProjectionWithVariance: FirTypeProjectionWithVariance, data: D): FirTypeProjection {
return transformElement(typeProjectionWithVariance, data)
}
@@ -910,6 +915,10 @@ abstract class FirTransformer<in D> : FirVisitor<FirElement, D>() {
return transformStarProjection(starProjection, data)
}
final override fun visitPlaceholderProjection(placeholderProjection: FirPlaceholderProjection, data: D): FirTypeProjection {
return transformPlaceholderProjection(placeholderProjection, data)
}
final override fun visitTypeProjectionWithVariance(typeProjectionWithVariance: FirTypeProjectionWithVariance, data: D): FirTypeProjection {
return transformTypeProjectionWithVariance(typeProjectionWithVariance, data)
}
@@ -66,6 +66,7 @@ import org.jetbrains.kotlin.fir.expressions.FirTryExpression
import org.jetbrains.kotlin.fir.expressions.FirConstExpression
import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirStarProjection
import org.jetbrains.kotlin.fir.types.FirPlaceholderProjection
import org.jetbrains.kotlin.fir.types.FirTypeProjectionWithVariance
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirCall
@@ -265,6 +266,8 @@ abstract class FirVisitor<out R, in D> {
open fun visitStarProjection(starProjection: FirStarProjection, data: D): R = visitElement(starProjection, data)
open fun visitPlaceholderProjection(placeholderProjection: FirPlaceholderProjection, data: D): R = visitElement(placeholderProjection, data)
open fun visitTypeProjectionWithVariance(typeProjectionWithVariance: FirTypeProjectionWithVariance, data: D): R = visitElement(typeProjectionWithVariance, data)
open fun visitArgumentList(argumentList: FirArgumentList, data: D): R = visitElement(argumentList, data)
@@ -66,6 +66,7 @@ import org.jetbrains.kotlin.fir.expressions.FirTryExpression
import org.jetbrains.kotlin.fir.expressions.FirConstExpression
import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirStarProjection
import org.jetbrains.kotlin.fir.types.FirPlaceholderProjection
import org.jetbrains.kotlin.fir.types.FirTypeProjectionWithVariance
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirCall
@@ -385,6 +386,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitElement(starProjection)
}
open fun visitPlaceholderProjection(placeholderProjection: FirPlaceholderProjection) {
visitElement(placeholderProjection)
}
open fun visitTypeProjectionWithVariance(typeProjectionWithVariance: FirTypeProjectionWithVariance) {
visitElement(typeProjectionWithVariance)
}
@@ -909,6 +914,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitStarProjection(starProjection)
}
final override fun visitPlaceholderProjection(placeholderProjection: FirPlaceholderProjection, data: Nothing?) {
visitPlaceholderProjection(placeholderProjection)
}
final override fun visitTypeProjectionWithVariance(typeProjectionWithVariance: FirTypeProjectionWithVariance, data: Nothing?) {
visitTypeProjectionWithVariance(typeProjectionWithVariance)
}
@@ -85,6 +85,7 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val constExpression by element(Expression, expression)
val typeProjection by element(TypeRef)
val starProjection by element(TypeRef, typeProjection)
val placeholderProjection by element(TypeRef, typeProjection)
val typeProjectionWithVariance by element(TypeRef, typeProjection)
val argumentList by element(Expression)
val call by sealedElement(Expression, statement) // TODO: may smth like `CallWithArguments` or `ElementWithArguments`?
@@ -453,11 +453,6 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
default("name", "Name.special(\"<\${diagnostic.reason}>\")")
}
impl(typeProjection, "FirTypePlaceholderProjection") {
kind = Object
noSource()
}
impl(breakExpression) {
defaultTypeRefWithSource("FirImplicitNothingTypeRef")
useTypes(implicitNothingTypeRefType)