diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt index 6bf533bb124..f67b956a700 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt @@ -24,7 +24,6 @@ import org.jetbrains.kotlin.fir.java.declarations.buildJavaValueParameter import org.jetbrains.kotlin.fir.java.enhancement.readOnlyToMutable import org.jetbrains.kotlin.fir.references.builder.buildErrorNamedReference import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference -import org.jetbrains.kotlin.fir.resolve.constructClassType import org.jetbrains.kotlin.fir.resolve.firSymbolProvider import org.jetbrains.kotlin.fir.resolve.getClassDeclaredCallableSymbols import org.jetbrains.kotlin.fir.symbols.StandardClassIds diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/AbstractAnnotationDeserializer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/AbstractAnnotationDeserializer.kt index 2829c8286ab..1cb722cee54 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/AbstractAnnotationDeserializer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/AbstractAnnotationDeserializer.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef +import org.jetbrains.kotlin.fir.types.constructType import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.ProtoBuf.Annotation.Argument.Value.Type.* import org.jetbrains.kotlin.metadata.deserialization.Flags diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/FirTypeDeserializer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/FirTypeDeserializer.kt index 03826800611..638a0d3edaa 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/FirTypeDeserializer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/FirTypeDeserializer.kt @@ -9,7 +9,6 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirTypeParametersOwner import org.jetbrains.kotlin.fir.declarations.addDefaultBoundIfNecessary import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParameterBuilder -import org.jetbrains.kotlin.fir.resolve.toTypeProjection import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.ConeClassifierLookupTag import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt index 94007b5ed64..877884f10e2 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt @@ -37,8 +37,6 @@ import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.types.AbstractStrictEqualityTypeChecker -import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.utils.addToStdlib.safeAs inline fun MutableMap.getOrPut(key: K, defaultValue: (K) -> VA, postCompute: (VA) -> Unit): V { @@ -150,21 +148,6 @@ fun ConeClassifierLookupTag.toSymbol(useSiteSession: FirSession): FirClassifierS fun ConeTypeParameterLookupTag.toSymbol(): FirTypeParameterSymbol = this.symbol as FirTypeParameterSymbol -fun ConeClassLikeLookupTag.constructClassType( - typeArguments: Array, - isNullable: Boolean, -): ConeLookupTagBasedType { - return ConeClassLikeTypeImpl(this, typeArguments, isNullable) -} - -fun ConeClassifierLookupTag.constructType(typeArguments: Array, isNullable: Boolean): ConeLookupTagBasedType { - return when (this) { - is ConeTypeParameterLookupTag -> ConeTypeParameterTypeImpl(this, isNullable) - is ConeClassLikeLookupTag -> this.constructClassType(typeArguments, isNullable) - else -> error("! ${this::class}") - } -} - fun FirClassifierSymbol<*>.constructType(typeArguments: Array, isNullable: Boolean): ConeLookupTagBasedType { return when (this) { is FirTypeParameterSymbol -> { @@ -200,12 +183,6 @@ fun FirClassifierSymbol<*>.constructType( } } -fun ConeKotlinType.toTypeProjection(variance: Variance): ConeKotlinTypeProjection = - when (variance) { - Variance.INVARIANT -> this - Variance.IN_VARIANCE -> ConeKotlinTypeProjectionIn(this) - Variance.OUT_VARIANCE -> ConeKotlinTypeProjectionOut(this) - } private fun List.toTypeProjections(): Array = flatMap { it.typeArguments.map { typeArgument -> @@ -220,81 +197,6 @@ private fun List.toTypeProjections(): Array { - lowerBound - } - typeContext == null && lowerBound == upperBound -> { - lowerBound - } - else -> { - ConeFlexibleType(lowerBound, upperBound) - } - } -} - -fun T.withNullability(nullability: ConeNullability, typeContext: ConeInferenceContext? = null): T { - if (this.nullability == nullability) { - return this - } - - return when (this) { - is ConeClassErrorType -> this - is ConeClassLikeTypeImpl -> ConeClassLikeTypeImpl(lookupTag, typeArguments, nullability.isNullable) as T - is ConeTypeParameterTypeImpl -> ConeTypeParameterTypeImpl(lookupTag, nullability.isNullable) as T - is ConeFlexibleType -> { - if (nullability == ConeNullability.UNKNOWN) { - if (lowerBound.nullability != upperBound.nullability || lowerBound.nullability == ConeNullability.UNKNOWN) { - return this - } - } - coneFlexibleOrSimpleType(typeContext, lowerBound.withNullability(nullability), upperBound.withNullability(nullability)) as T - } - is ConeTypeVariableType -> ConeTypeVariableType(nullability, lookupTag) as T - is ConeCapturedType -> ConeCapturedType(captureStatus, lowerType, nullability, constructor) as T - is ConeIntersectionType -> when (nullability) { - ConeNullability.NULLABLE -> this.mapTypes { - it.withNullability(nullability) - } - ConeNullability.UNKNOWN -> this // TODO: is that correct? - ConeNullability.NOT_NULL -> this - } as T - is ConeStubType -> ConeStubType(variable, nullability) as T - is ConeDefinitelyNotNullType -> when (nullability) { - ConeNullability.NOT_NULL -> this - ConeNullability.NULLABLE -> original.withNullability(nullability) - ConeNullability.UNKNOWN -> original.withNullability(nullability) - } as T - is ConeIntegerLiteralType -> this - else -> error("sealed: ${this::class}") - } -} - - -fun T.withArguments(arguments: Array): T { - if (this.typeArguments === arguments) { - return this - } - - return when (this) { - is ConeClassErrorType -> this - is ConeClassLikeTypeImpl -> ConeClassLikeTypeImpl(lookupTag, arguments, nullability.isNullable) as T - is ConeDefinitelyNotNullType -> ConeDefinitelyNotNullType.create(original.withArguments(arguments))!! as T - else -> error("Not supported: $this: ${this.render()}") - } -} - fun FirFunction<*>.constructFunctionalTypeRef(session: FirSession): FirResolvedTypeRef { val receiverTypeRef = when (this) { is FirSimpleFunction -> receiverTypeRef diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Arguments.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Arguments.kt index 68e9c498988..8749b12a24a 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Arguments.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Arguments.kt @@ -19,7 +19,6 @@ import org.jetbrains.kotlin.fir.resolve.inference.preprocessLambdaArgument import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.firUnsafe import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.resultType -import org.jetbrains.kotlin.fir.resolve.withNullability import org.jetbrains.kotlin.fir.returnExpressions import org.jetbrains.kotlin.fir.scopes.impl.FirILTTypeRefPlaceHolder import org.jetbrains.kotlin.fir.scopes.impl.FirIntegerOperator diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/TowerLevels.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/TowerLevels.kt index cccc68cce24..64158e51276 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/TowerLevels.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/TowerLevels.kt @@ -11,7 +11,6 @@ import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.firSymbolProvider -import org.jetbrains.kotlin.fir.resolve.withNullability import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.ProcessorAction import org.jetbrains.kotlin.fir.scopes.impl.FirAbstractImportingScope @@ -20,6 +19,7 @@ import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeNullability +import org.jetbrains.kotlin.fir.types.withNullability import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.utils.addToStdlib.cast diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/TowerResolveManager.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/TowerResolveManager.kt index 51e68a4bbd0..f64e6d2ec56 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/TowerResolveManager.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/TowerResolveManager.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.fir.resolve.calls import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier import org.jetbrains.kotlin.fir.expressions.builder.FirQualifiedAccessExpressionBuilder -import org.jetbrains.kotlin.fir.resolve.constructClassType import org.jetbrains.kotlin.fir.resolve.constructType import org.jetbrains.kotlin.fir.resolve.transformQualifiedAccessUsingSmartcastInfo import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.firUnsafe diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt index 663ec350e7b..708d7842ec0 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt @@ -21,7 +21,6 @@ import org.jetbrains.kotlin.fir.resolve.dfa.contracts.buildContractFir import org.jetbrains.kotlin.fir.resolve.dfa.contracts.createArgumentsMapping import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirAbstractBodyResolveTransformer import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.resultType -import org.jetbrains.kotlin.fir.resolve.withNullability import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirBuiltinSymbolProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirBuiltinSymbolProvider.kt index e2d07e9a6ed..02e6bbd706e 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirBuiltinSymbolProvider.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirBuiltinSymbolProvider.kt @@ -7,19 +7,21 @@ package org.jetbrains.kotlin.fir.resolve.impl import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor -import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.ClassKind +import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.descriptors.SourceElement +import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.builder.buildClassImpl import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunction import org.jetbrains.kotlin.fir.declarations.builder.buildTypeParameter import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter -import org.jetbrains.kotlin.fir.declarations.impl.* +import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl import org.jetbrains.kotlin.fir.deserialization.FirBuiltinAnnotationDeserializer import org.jetbrains.kotlin.fir.deserialization.FirDeserializationContext import org.jetbrains.kotlin.fir.deserialization.deserializeClassToSymbol import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider -import org.jetbrains.kotlin.fir.resolve.constructClassType import org.jetbrains.kotlin.fir.resolve.getOrPut import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider @@ -29,6 +31,7 @@ import org.jetbrains.kotlin.fir.symbols.StandardClassIds import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef +import org.jetbrains.kotlin.fir.types.constructClassType import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.builtins.BuiltInsBinaryVersion diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/InferenceUtil.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/InferenceComponents.kt similarity index 67% rename from compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/InferenceUtil.kt rename to compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/InferenceComponents.kt index a06ac15f543..e416f3b7840 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/InferenceUtil.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/InferenceComponents.kt @@ -7,10 +7,9 @@ package org.jetbrains.kotlin.fir.resolve.inference import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.resolve.ScopeSession -import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator -import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol -import org.jetbrains.kotlin.fir.types.* +import org.jetbrains.kotlin.fir.types.ConeClassErrorType +import org.jetbrains.kotlin.fir.types.ConeInferenceContext import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintIncorporator import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintInjector import org.jetbrains.kotlin.resolve.calls.inference.components.ResultTypeResolver @@ -20,25 +19,6 @@ import org.jetbrains.kotlin.types.AbstractTypeApproximator import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner import org.jetbrains.kotlin.types.model.SimpleTypeMarker -fun ConeTypeContext.hasNullableSuperType(type: ConeKotlinType): Boolean { - if (type is ConeClassLikeType) return false - - if (type !is ConeLookupTagBasedType) return false // TODO? - val symbol = type.lookupTag.toSymbol(session) ?: return false // TODO?! - for (superType in symbol.supertypes()) { - if (superType.isNullableType()) return true - } -// -// for (KotlinType supertype : getImmediateSupertypes(type)) { -// if (isNullableType(supertype)) return true; -// } - - return false -} - -class TypeParameterBasedTypeVariable(val typeParameterSymbol: FirTypeParameterSymbol) : - ConeTypeVariable(typeParameterSymbol.name.identifier) - class InferenceComponents( val ctx: ConeInferenceContext, val session: FirSession, @@ -50,7 +30,9 @@ class InferenceComponents( return ConeClassErrorType(message) } } - val trivialConstraintTypeInferenceOracle = TrivialConstraintTypeInferenceOracle.create(ctx) + val trivialConstraintTypeInferenceOracle = + TrivialConstraintTypeInferenceOracle + .create(ctx) private val incorporator = ConstraintIncorporator(approximator, trivialConstraintTypeInferenceOracle) private val injector = ConstraintInjector(incorporator, approximator, KotlinTypeRefiner.Default) val resultTypeResolver = ResultTypeResolver(approximator, trivialConstraintTypeInferenceOracle) @@ -59,5 +41,4 @@ class InferenceComponents( return NewConstraintSystemImpl(injector, ctx) } -} - +} \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/TypeParameterBasedTypeVariable.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/TypeParameterBasedTypeVariable.kt new file mode 100644 index 00000000000..061ccdfe655 --- /dev/null +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/TypeParameterBasedTypeVariable.kt @@ -0,0 +1,12 @@ +/* + * Copyright 2010-2020 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.resolve.inference + +import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol +import org.jetbrains.kotlin.fir.types.ConeTypeVariable + +class TypeParameterBasedTypeVariable(val typeParameterSymbol: FirTypeParameterSymbol) : + ConeTypeVariable(typeParameterSymbol.name.identifier) \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/substitution/Substitutors.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/substitution/Substitutors.kt index b4de2249773..13e737a1283 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/substitution/Substitutors.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/substitution/Substitutors.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.fir.resolve.substitution -import org.jetbrains.kotlin.fir.resolve.withNullability import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt index 79d54815aa0..01875c69837 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt @@ -21,7 +21,6 @@ import org.jetbrains.kotlin.fir.resolve.inference.returnType import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.substituteOrNull import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.resultType -import org.jetbrains.kotlin.fir.resolve.withNullability import org.jetbrains.kotlin.fir.scopes.impl.FirIntegerOperatorCall import org.jetbrains.kotlin.fir.scopes.impl.withReplacedConeType import org.jetbrains.kotlin.fir.types.* diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSyntheticCallGenerator.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSyntheticCallGenerator.kt index 7594b1ccf32..7cce5d4984b 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSyntheticCallGenerator.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSyntheticCallGenerator.kt @@ -27,7 +27,6 @@ import org.jetbrains.kotlin.fir.resolve.calls.* import org.jetbrains.kotlin.fir.resolve.diagnostics.FirUnresolvedNameError import org.jetbrains.kotlin.fir.resolve.inference.FirCallCompleter import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirAbstractBodyResolveTransformer -import org.jetbrains.kotlin.fir.resolve.withNullability import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.SyntheticCallableId import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeTypeContext.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeTypeContext.kt index 64b0f0bb06e..f1a75c016f9 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeTypeContext.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeTypeContext.kt @@ -10,10 +10,11 @@ import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.* -import org.jetbrains.kotlin.fir.resolve.* -import org.jetbrains.kotlin.fir.resolve.inference.hasNullableSuperType +import org.jetbrains.kotlin.fir.resolve.correspondingSupertypesCache +import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap +import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.firUnsafe import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.StandardClassIds diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/FirCorrespondingSupertypesCache.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/FirCorrespondingSupertypesCache.kt index 8fd497b22b1..65ba37e7124 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/FirCorrespondingSupertypesCache.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/FirCorrespondingSupertypesCache.kt @@ -9,8 +9,6 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSessionComponent import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration import org.jetbrains.kotlin.fir.declarations.FirTypeParametersOwner -import org.jetbrains.kotlin.fir.resolve.constructClassType -import org.jetbrains.kotlin.fir.resolve.constructType import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol import org.jetbrains.kotlin.types.AbstractTypeCheckerContext diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt index 635503ff0ba..f162fd71b33 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt @@ -5,10 +5,17 @@ package org.jetbrains.kotlin.fir.types -import org.jetbrains.kotlin.fir.resolve.withNullability +import org.jetbrains.kotlin.fir.resolve.toSymbol +import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag +import org.jetbrains.kotlin.fir.symbols.ConeClassifierLookupTag +import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag +import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl +import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl import org.jetbrains.kotlin.resolve.calls.NewCommonSuperTypeCalculator import org.jetbrains.kotlin.types.AbstractNullabilityChecker +import org.jetbrains.kotlin.types.AbstractStrictEqualityTypeChecker import org.jetbrains.kotlin.types.AbstractTypeCheckerContext +import org.jetbrains.kotlin.types.Variance object ConeNullabilityChecker { fun isSubtypeOfAny(context: ConeTypeContext, type: ConeKotlinType): Boolean { @@ -76,4 +83,116 @@ fun ConeKotlinType.makeConeTypeDefinitelyNotNullOrNotNull(): ConeKotlinType { return ConeIntersectionType(intersectedTypes.map { it.makeConeTypeDefinitelyNotNullOrNotNull() }) } return ConeDefinitelyNotNullType.create(this) ?: this.withNullability(ConeNullability.NOT_NULL) +} + +fun T.withArguments(arguments: Array): T { + if (this.typeArguments === arguments) { + return this + } + + return when (this) { + is ConeClassErrorType -> this + is ConeClassLikeTypeImpl -> ConeClassLikeTypeImpl(lookupTag, arguments, nullability.isNullable) as T + is ConeDefinitelyNotNullType -> ConeDefinitelyNotNullType.create(original.withArguments(arguments))!! as T + else -> error("Not supported: $this: ${this.render()}") + } +} + +fun ConeTypeContext.hasNullableSuperType(type: ConeKotlinType): Boolean { + if (type is ConeClassLikeType) return false + + if (type !is ConeLookupTagBasedType) return false // TODO? + val symbol = type.lookupTag.toSymbol(session) ?: return false // TODO?! + for (superType in symbol.supertypes()) { + if (superType.isNullableType()) return true + } +// +// for (KotlinType supertype : getImmediateSupertypes(type)) { +// if (isNullableType(supertype)) return true; +// } + + return false +} + +fun T.withNullability(nullability: ConeNullability, typeContext: ConeInferenceContext? = null): T { + if (this.nullability == nullability) { + return this + } + + return when (this) { + is ConeClassErrorType -> this + is ConeClassLikeTypeImpl -> ConeClassLikeTypeImpl(lookupTag, typeArguments, nullability.isNullable) as T + is ConeTypeParameterTypeImpl -> ConeTypeParameterTypeImpl(lookupTag, nullability.isNullable) as T + is ConeFlexibleType -> { + if (nullability == ConeNullability.UNKNOWN) { + if (lowerBound.nullability != upperBound.nullability || lowerBound.nullability == ConeNullability.UNKNOWN) { + return this + } + } + coneFlexibleOrSimpleType(typeContext, lowerBound.withNullability(nullability), upperBound.withNullability(nullability)) as T + } + is ConeTypeVariableType -> ConeTypeVariableType(nullability, lookupTag) as T + is ConeCapturedType -> ConeCapturedType(captureStatus, lowerType, nullability, constructor) as T + is ConeIntersectionType -> when (nullability) { + ConeNullability.NULLABLE -> this.mapTypes { + it.withNullability(nullability) + } + ConeNullability.UNKNOWN -> this // TODO: is that correct? + ConeNullability.NOT_NULL -> this + } as T + is ConeStubType -> ConeStubType(variable, nullability) as T + is ConeDefinitelyNotNullType -> when (nullability) { + ConeNullability.NOT_NULL -> this + ConeNullability.NULLABLE -> original.withNullability(nullability) + ConeNullability.UNKNOWN -> original.withNullability(nullability) + } as T + is ConeIntegerLiteralType -> this + else -> error("sealed: ${this::class}") + } +} + +fun coneFlexibleOrSimpleType( + typeContext: ConeInferenceContext?, + lowerBound: ConeKotlinType, + upperBound: ConeKotlinType, +): ConeKotlinType { + if (lowerBound is ConeFlexibleType) { + return coneFlexibleOrSimpleType(typeContext, lowerBound.lowerBound, upperBound) + } + if (upperBound is ConeFlexibleType) { + return coneFlexibleOrSimpleType(typeContext, lowerBound, upperBound.upperBound) + } + return when { + typeContext != null && AbstractStrictEqualityTypeChecker.strictEqualTypes(typeContext, lowerBound, upperBound) -> { + lowerBound + } + typeContext == null && lowerBound == upperBound -> { + lowerBound + } + else -> { + ConeFlexibleType(lowerBound, upperBound) + } + } +} + +fun ConeKotlinType.toTypeProjection(variance: Variance): ConeKotlinTypeProjection = + when (variance) { + Variance.INVARIANT -> this + Variance.IN_VARIANCE -> ConeKotlinTypeProjectionIn(this) + Variance.OUT_VARIANCE -> ConeKotlinTypeProjectionOut(this) + } + +fun ConeClassLikeLookupTag.constructClassType( + typeArguments: Array, + isNullable: Boolean, +): ConeLookupTagBasedType { + return ConeClassLikeTypeImpl(this, typeArguments, isNullable) +} + +fun ConeClassifierLookupTag.constructType(typeArguments: Array, isNullable: Boolean): ConeLookupTagBasedType { + return when (this) { + is ConeTypeParameterLookupTag -> ConeTypeParameterTypeImpl(this, isNullable) + is ConeClassLikeLookupTag -> this.constructClassType(typeArguments, isNullable) + else -> error("! ${this::class}") + } } \ No newline at end of file