Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ package org.jetbrains.kotlin.fir.analysis.checkers.expression

import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.OnlyForDefaultLanguageFeatureDisabled
import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
Expand All @@ -17,6 +16,7 @@ import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
import org.jetbrains.kotlin.fir.expressions.InaccessibleReceiverKind
import org.jetbrains.kotlin.fir.expressions.arguments
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.util.OnlyForDefaultLanguageFeatureDisabled

@OptIn(OnlyForDefaultLanguageFeatureDisabled::class)
object FirReceiverAccessBeforeSuperCallChecker : FirInaccessibleReceiverChecker(MppCheckerKind.Common) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
package org.jetbrains.kotlin.fir.resolve.calls

import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.OnlyForDefaultLanguageFeatureDisabled
import org.jetbrains.kotlin.fir.collectUpperBounds
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.FirExpression
Expand All @@ -25,6 +24,7 @@ import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder
import org.jetbrains.kotlin.resolve.calls.inference.components.ResultTypeResolver
import org.jetbrains.kotlin.resolve.calls.inference.components.TypeVariableDirectionCalculator.ResolveDirection.UNKNOWN
import org.jetbrains.kotlin.types.model.TypeSystemCommonSuperTypesContext
import org.jetbrains.kotlin.util.OnlyForDefaultLanguageFeatureDisabled
import org.jetbrains.kotlin.utils.addToStdlib.applyIf
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.contract
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ import org.jetbrains.kotlin.resolve.calls.tower.CandidateApplicability
import org.jetbrains.kotlin.resolve.calls.tower.isSuccess
import org.jetbrains.kotlin.resolve.calls.tower.shouldStopResolve
import org.jetbrains.kotlin.types.Variance
import org.jetbrains.kotlin.util.OnlyForDefaultLanguageFeatureDisabled
import org.jetbrains.kotlin.util.OperatorNameConventions
import org.jetbrains.kotlin.utils.addToStdlib.runIf
import org.jetbrains.kotlin.utils.addToStdlib.shouldNotBeCalled
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.resolve.calls.tower.ApplicabilityDetail
import org.jetbrains.kotlin.resolve.calls.tower.CandidateApplicability
import org.jetbrains.kotlin.resolve.calls.tower.isSuccess
import org.jetbrains.kotlin.resolve.calls.tower.shouldStopResolve
import org.jetbrains.kotlin.util.OnlyForDefaultLanguageFeatureDisabled

open class CandidateCollector(
val components: BodyResolveComponents,
Expand Down Expand Up @@ -65,6 +66,7 @@ open class CandidateCollector(
dropOldCandidates()
}

@OptIn(OnlyForDefaultLanguageFeatureDisabled::class)
if (currentApplicability == CandidateApplicability.RESOLVED_NEED_PRESERVE_COMPATIBILITY &&
applicability > currentApplicability
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ package org.jetbrains.kotlin.fir.resolve.calls.overloads

import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.fir.FirAnnotationContainer
import org.jetbrains.kotlin.fir.OnlyForDefaultLanguageFeatureDisabled
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirResolvable
import org.jetbrains.kotlin.fir.resolve.calls.CandidateChosenUsingOverloadResolutionByLambdaAnnotation
Expand All @@ -26,6 +25,7 @@ import org.jetbrains.kotlin.fir.types.isSomeFunctionType
import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionMode
import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionMode.ExclusiveForOverloadResolutionByLambdaReturnType
import org.jetbrains.kotlin.resolve.descriptorUtil.OVERLOAD_RESOLUTION_BY_LAMBDA_ANNOTATION_CLASS_ID
import org.jetbrains.kotlin.util.OnlyForDefaultLanguageFeatureDisabled
import org.jetbrains.kotlin.utils.addToStdlib.same

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
package org.jetbrains.kotlin.fir.resolve.calls.stages

import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.fir.OnlyForDefaultLanguageFeatureDisabled
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.expressions.ExplicitTypeArgumentIfMadeFlexibleSyntheticallyTypeAttribute
import org.jetbrains.kotlin.fir.isEnabled
Expand Down Expand Up @@ -37,6 +36,7 @@ import org.jetbrains.kotlin.fir.unwrapSubstitutionOverrides
import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemOperation
import org.jetbrains.kotlin.resolve.calls.inference.model.SimpleConstraintSystemConstraintPosition
import org.jetbrains.kotlin.util.OnlyForDefaultLanguageFeatureDisabled

internal object CreateFreshTypeVariableSubstitutorStage : ResolutionStage() {
context(sink: CheckerSink, context: ResolutionContext)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ import org.jetbrains.kotlin.types.AbstractTypeChecker
import org.jetbrains.kotlin.types.TypeApproximatorConfiguration
import org.jetbrains.kotlin.types.model.TypeVariableTypeConstructorMarker
import org.jetbrains.kotlin.types.model.typeConstructor
import org.jetbrains.kotlin.util.OnlyForDefaultLanguageFeatureDisabled
import org.jetbrains.kotlin.utils.addToStdlib.runIf
import org.jetbrains.kotlin.utils.addToStdlib.unreachableBranch

Expand Down Expand Up @@ -843,6 +844,7 @@ private fun Candidate.isJavaApplicableCandidate(): Boolean {
}

internal object EagerResolveOfCallableReferences : ResolutionStage() {
@OptIn(OnlyForDefaultLanguageFeatureDisabled::class)
context(sink: CheckerSink, context: ResolutionContext)
override suspend fun check(candidate: Candidate) {
if (candidate.postponedAtoms.isEmpty()) return
Expand All @@ -863,6 +865,8 @@ internal object EagerResolveOfCallableReferences : ResolutionStage() {
} else when (applicability) {
CandidateApplicability.RESOLVED_NEED_PRESERVE_COMPATIBILITY ->
sink.reportDiagnostic(LowerPriorityToPreserveCompatibilityDiagnostic)
CandidateApplicability.RESOLVED_LOW_PRIORITY ->
sink.reportDiagnostic(ResolvedWithLowPriority)
else -> {
}
}
Expand Down Expand Up @@ -980,9 +984,6 @@ internal object CheckIncompatibleTypeVariableUpperBounds : ResolutionStage() {
emptyIntersectionTypeInfo.casingTypes.toList() as List<ConeKotlinType>,
variableWithConstraints.typeVariable.asCone(),
emptyIntersectionTypeInfo.kind,
isError = context.session.languageVersionSettings.supportsFeature(
LanguageFeature.ForbidInferringTypeVariablesIntoEmptyIntersection
)
)
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import org.jetbrains.kotlin.fir.types.classId
import org.jetbrains.kotlin.fir.types.coneType
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.SpecialNames.UNDERSCORE_FOR_UNUSED_VAR
import org.jetbrains.kotlin.util.OnlyForDefaultLanguageFeatureDisabled
import org.jetbrains.kotlin.util.PrivateForInline
import org.jetbrains.kotlin.utils.addToStdlib.runIf

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ import org.jetbrains.kotlin.resolve.calls.inference.buildCurrentSubstitutor
import org.jetbrains.kotlin.resolve.calls.inference.components.TypeVariableDirectionCalculator
import org.jetbrains.kotlin.resolve.calls.inference.model.ProvideDelegateFixationPosition
import org.jetbrains.kotlin.types.model.TypeConstructorMarker
import org.jetbrains.kotlin.util.OnlyForDefaultLanguageFeatureDisabled
import org.jetbrains.kotlin.util.OperatorNameConventions
import org.jetbrains.kotlin.util.PrivateForInline
import org.jetbrains.kotlin.utils.addToStdlib.runIf
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ import org.jetbrains.kotlin.types.AbstractTypeChecker
import org.jetbrains.kotlin.types.ConstantValueKind
import org.jetbrains.kotlin.types.TypeApproximatorConfiguration
import org.jetbrains.kotlin.types.model.anySuperTypeConstructor
import org.jetbrains.kotlin.util.OnlyForDefaultLanguageFeatureDisabled
import org.jetbrains.kotlin.util.OperatorNameConventions
import org.jetbrains.kotlin.util.PrivateForInline
import org.jetbrains.kotlin.utils.addToStdlib.applyIf
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,17 @@
package org.jetbrains.kotlin.fir.resolve.calls

import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.fir.SessionHolder
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
import org.jetbrains.kotlin.fir.declarations.FirFunction
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirNamedArgumentExpression
import org.jetbrains.kotlin.fir.expressions.FirSmartCastExpression
import org.jetbrains.kotlin.fir.isEnabled
import org.jetbrains.kotlin.fir.languageVersionSettings
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
Expand All @@ -23,12 +27,14 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.ConeTypeVariable
import org.jetbrains.kotlin.resolve.ForbiddenNamedArgumentsTarget
import org.jetbrains.kotlin.resolve.calls.inference.isError
import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintSystemError
import org.jetbrains.kotlin.resolve.calls.tower.ApplicabilityDetail
import org.jetbrains.kotlin.resolve.calls.tower.CandidateApplicability
import org.jetbrains.kotlin.resolve.calls.tower.CandidateApplicability.*
import org.jetbrains.kotlin.resolve.calls.tower.isSuccess
import org.jetbrains.kotlin.types.EmptyIntersectionTypeKind
import org.jetbrains.kotlin.util.OnlyForDefaultLanguageFeatureDisabled

abstract class ResolutionDiagnostic(val applicability: CandidateApplicability)

Expand All @@ -38,13 +44,36 @@ abstract class InapplicableArgumentDiagnostic : ResolutionDiagnostic(INAPPLICABL

class MixingNamedAndPositionArguments(override val argument: FirExpression) : InapplicableArgumentDiagnostic()

class InferredEmptyIntersectionDiagnostic(
class InferredEmptyIntersectionDiagnostic private constructor(
val incompatibleTypes: Collection<ConeKotlinType>,
val causingTypes: Collection<ConeKotlinType>,
val typeVariable: ConeTypeVariable,
val kind: EmptyIntersectionTypeKind,
val isError: Boolean
) : ResolutionDiagnostic(INAPPLICABLE)
val isError: Boolean,
applicability: CandidateApplicability,
) : ResolutionDiagnostic(applicability) {
companion object {
context(sessionHolder: SessionHolder)
operator fun invoke(
incompatibleTypes: Collection<ConeKotlinType>,
causingTypes: Collection<ConeKotlinType>,
typeVariable: ConeTypeVariable,
kind: EmptyIntersectionTypeKind,
): InferredEmptyIntersectionDiagnostic {
val isError = kind.isError(sessionHolder.session.languageVersionSettings)
val isInapplicable = isError || !LanguageFeature.FixApplicabilityOfEmptyIntersection.isEnabled()

return InferredEmptyIntersectionDiagnostic(
incompatibleTypes,
causingTypes,
typeVariable,
kind,
isError,
if (isInapplicable) INAPPLICABLE else RESOLVED_LOW_PRIORITY
)
}
}
}

class TooManyArguments(
val argument: FirExpression,
Expand Down Expand Up @@ -141,6 +170,7 @@ object InvokeOnHiddenCompanionObject : ResolutionDiagnostic(HIDDEN)

class InapplicableNullableReceiver(val actualType: ConeKotlinType) : ResolutionDiagnostic(UNSAFE_CALL)

@OptIn(OnlyForDefaultLanguageFeatureDisabled::class)
object LowerPriorityToPreserveCompatibilityDiagnostic : ResolutionDiagnostic(RESOLVED_NEED_PRESERVE_COMPATIBILITY)

object LowerPriorityForDynamic : ResolutionDiagnostic(RESOLVED_LOW_PRIORITY)
Expand Down
9 changes: 0 additions & 9 deletions compiler/fir/tree/src/org/jetbrains/kotlin/fir/annotations.kt
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +38,6 @@ annotation class PrivateSessionConstructor
@RequiresOptIn
annotation class SessionConfiguration

/**
* Declarations that are only being used in case some default language features are disabled: mostly likely due to using not the latest
* language version.
*
* Let's try to have a convention to use a relevant language feature name as a side comment.
*/
@RequiresOptIn
annotation class OnlyForDefaultLanguageFeatureDisabled(val languageFeature: LanguageFeature)

/**
* Declaration is only relevant for old (pre-CL) resolution of array literals for annotations.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
package org.jetbrains.kotlin.fir.expressions

import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.fir.OnlyForDefaultLanguageFeatureDisabled
import org.jetbrains.kotlin.util.OnlyForDefaultLanguageFeatureDisabled

/**
* Enum describing the different kinds of [FirInaccessibleReceiverExpression].
Expand Down Expand Up @@ -59,4 +59,4 @@ enum class InaccessibleReceiverKind(
* ```
*/
ClassHeader(false),
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,12 @@

package org.jetbrains.kotlin.resolve.calls.inference

import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.resolve.calls.inference.components.extractProjectionsForAllCapturedTypes
import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintStorage
import org.jetbrains.kotlin.resolve.calls.inference.model.NewConstraintSystemImpl
import org.jetbrains.kotlin.types.EmptyIntersectionTypeKind
import org.jetbrains.kotlin.types.model.*

fun ConstraintStorage.buildCurrentSubstitutor(
Expand Down Expand Up @@ -111,3 +114,7 @@ private fun KotlinTypeMarker.extractAllContainingTypeVariablesNoCaptureTypeProce
false
}
}

fun EmptyIntersectionTypeKind.isError(settings: LanguageVersionSettings): Boolean {
return isDefinitelyEmpty && settings.supportsFeature(LanguageFeature.ForbidInferringTypeVariablesIntoEmptyIntersection)
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.types.EmptyIntersectionTypeKind
import org.jetbrains.kotlin.types.model.KotlinTypeMarker
import org.jetbrains.kotlin.types.model.TypeParameterMarker
import org.jetbrains.kotlin.types.model.TypeVariableMarker
import org.jetbrains.kotlin.util.OnlyForDefaultLanguageFeatureDisabled

interface OnlyInputTypeConstraintPosition

Expand Down Expand Up @@ -180,6 +181,7 @@ class InferredEmptyIntersectionError(

class OnlyInputTypesDiagnostic(val typeVariable: TypeVariableMarker) : ConstraintSystemError(INAPPLICABLE)

@OptIn(OnlyForDefaultLanguageFeatureDisabled::class)
class LowerPriorityToPreserveCompatibility(val needToReportWarning: Boolean) :
ConstraintSystemError(RESOLVED_NEED_PRESERVE_COMPATIBILITY)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -734,9 +734,7 @@ class NewConstraintSystemImpl(
// Remove existing errors from the resolution stage because a completion stage error is always more precise
storage.errors.removeIf { it is InferredEmptyIntersection }

val isInferredEmptyIntersectionForbidden =
languageVersionSettings.supportsFeature(LanguageFeature.ForbidInferringTypeVariablesIntoEmptyIntersection)
val errorFactory = if (emptyIntersectionTypeInfo.kind.isDefinitelyEmpty && isInferredEmptyIntersectionForbidden)
val errorFactory = if (emptyIntersectionTypeInfo.kind.isError(languageVersionSettings))
::InferredEmptyIntersectionError
else ::InferredEmptyIntersectionWarning

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@

package org.jetbrains.kotlin.resolve.calls.tower

import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.util.OnlyForDefaultLanguageFeatureDisabled

enum class CandidateApplicability {
/**
* Special applicability for migration warning up to 1.5.
Expand Down Expand Up @@ -98,6 +101,7 @@ enum class CandidateApplicability {
* Candidate is successful but uses new features that change resolve.
* Tower resolve proceeds to next levels.
*/
@OnlyForDefaultLanguageFeatureDisabled(LanguageFeature.DisableCompatibilityModeForNewInference, LanguageFeature.DisableCompatibilityModeForNewInference)
RESOLVED_NEED_PRESERVE_COMPATIBILITY,

// Everything below has shouldStopResolve = true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValueWithSmartCastI
import org.jetbrains.kotlin.resolve.scopes.utils.parentsWithSelf
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.isDynamic
import org.jetbrains.kotlin.util.OnlyForDefaultLanguageFeatureDisabled
import org.jetbrains.kotlin.util.OperatorNameConventions
import java.util.*

Expand Down Expand Up @@ -466,6 +467,7 @@ class TowerResolver {
return candidate.resultingApplicability.shouldStopResolve
}

@OptIn(OnlyForDefaultLanguageFeatureDisabled::class)
private fun isPreserveCompatibilityCandidate(candidate: C): Boolean =
candidate.resultingApplicability == CandidateApplicability.RESOLVED_NEED_PRESERVE_COMPATIBILITY

Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// LATEST_LV_DIFFERENCE
// RUN_PIPELINE_TILL: FRONTEND
// LANGUAGE: +CollectionLiterals, +CompanionBlocksAndExtensions
// WITH_STDLIB
Expand Down
Loading