diff --git a/compiler/fir/dump/src/org/jetbrains/kotlin/fir/dump/HtmlFirDump.kt b/compiler/fir/dump/src/org/jetbrains/kotlin/fir/dump/HtmlFirDump.kt index 9c94d92fcb7..43d862cdf19 100644 --- a/compiler/fir/dump/src/org/jetbrains/kotlin/fir/dump/HtmlFirDump.kt +++ b/compiler/fir/dump/src/org/jetbrains/kotlin/fir/dump/HtmlFirDump.kt @@ -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 -> +"_" } } diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index 788602f544c..306c0f4f0e3 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -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 diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index e5e55f6b6ee..b6a52be1eea 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -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 { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CreateFreshTypeVariableSubstitutorStage.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CreateFreshTypeVariableSubstitutorStage.kt index b13d8100dee..acde7528981 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CreateFreshTypeVariableSubstitutorStage.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CreateFreshTypeVariableSubstitutorStage.kt @@ -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()}" } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/TypeArgumentMapping.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/TypeArgumentMapping.kt index 54acef27b0b..c411aa4e58b 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/TypeArgumentMapping.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/TypeArgumentMapping.kt @@ -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) : TypeArgumentMapping() { override fun get(typeParameterIndex: Int): FirTypeProjection { - return ordered.getOrElse(typeParameterIndex) { FirTypePlaceholderProjection } + return ordered.getOrElse(typeParameterIndex) { buildPlaceholderProjection() } } } } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/FirPlaceholderProjection.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/FirPlaceholderProjection.kt new file mode 100644 index 00000000000..2ac9c04a34a --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/FirPlaceholderProjection.kt @@ -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 accept(visitor: FirVisitor, data: D): R = visitor.visitPlaceholderProjection(this, data) + + @Suppress("UNCHECKED_CAST") + override fun transform(transformer: FirTransformer, data: D): E = + transformer.transformPlaceholderProjection(this, data) as E +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/builder/FirPlaceholderProjectionBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/builder/FirPlaceholderProjectionBuilder.kt new file mode 100644 index 00000000000..27fbcdc56d9 --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/builder/FirPlaceholderProjectionBuilder.kt @@ -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() +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/impl/FirTypePlaceholderProjection.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/impl/FirPlaceholderProjectionImpl.kt similarity index 68% rename from compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/impl/FirTypePlaceholderProjection.kt rename to compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/impl/FirPlaceholderProjectionImpl.kt index a3f9ebe3410..a7c503dfa1b 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/impl/FirTypePlaceholderProjection.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/types/impl/FirPlaceholderProjectionImpl.kt @@ -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 acceptChildren(visitor: FirVisitor, data: D) {} - override fun transformChildren(transformer: FirTransformer, data: D): FirTypePlaceholderProjection { + override fun transformChildren(transformer: FirTransformer, data: D): FirPlaceholderProjectionImpl { return this } } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt index 92b93e92532..cee073e1885 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt @@ -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 : FirVisitor() { 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) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt index 743fac567e6..71ef15f2def 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt @@ -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) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt index d3567035d4a..3430a1a0fdd 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt @@ -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 : FirVisitor() { 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 : FirVisitor() { 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) } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt index d7056dbf314..c5ed2fff817 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt @@ -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 { 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) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt index a26e5d7d801..45091afb7c8 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt @@ -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() { visitElement(starProjection) } + open fun visitPlaceholderProjection(placeholderProjection: FirPlaceholderProjection) { + visitElement(placeholderProjection) + } + open fun visitTypeProjectionWithVariance(typeProjectionWithVariance: FirTypeProjectionWithVariance) { visitElement(typeProjectionWithVariance) } @@ -909,6 +914,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitStarProjection(starProjection) } + final override fun visitPlaceholderProjection(placeholderProjection: FirPlaceholderProjection, data: Nothing?) { + visitPlaceholderProjection(placeholderProjection) + } + final override fun visitTypeProjectionWithVariance(typeProjectionWithVariance: FirTypeProjectionWithVariance, data: Nothing?) { visitTypeProjectionWithVariance(typeProjectionWithVariance) } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt index 6daea0bedf9..3ff1d4362ff 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt @@ -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`? diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt index f16ca484c8a..51fbf9b8063 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt @@ -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)