From b72d0957e49a695564965240398d045fbef918e4 Mon Sep 17 00:00:00 2001 From: "simon.ogorodnik" Date: Thu, 9 Apr 2020 22:27:51 +0300 Subject: [PATCH] [FIR] Support captured type arguments of anonymous objects in resolve --- .../src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt | 4 ++-- .../body/resolve/FirDeclarationsResolveTransformer.kt | 8 +++++--- .../src/org/jetbrains/kotlin/fir/types/ConeTypeContext.kt | 3 ++- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt index 6eca7961a3a..f51642f321c 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt @@ -78,8 +78,8 @@ fun FirRegularClass.defaultType(): ConeClassLikeTypeImpl { ) } -fun FirAnonymousObject.defaultType(): ConeClassLikeTypeImpl { - return ConeClassLikeTypeImpl( +fun FirAnonymousObject.defaultType(): ConeClassLikeType { + return this.typeRef.coneTypeSafe() ?: ConeClassLikeTypeImpl( symbol.toLookupTag(), emptyArray(), isNullable = false diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt index 40068209268..b632f272da9 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt @@ -369,9 +369,11 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer) } dataFlowAnalyzer.enterClass() val type = anonymousObject.defaultType() - anonymousObject.resultType = buildResolvedTypeRef { - source = anonymousObject.source - this.type = type + if (anonymousObject.typeRef !is FirResolvedTypeRef) { + anonymousObject.resultType = buildResolvedTypeRef { + source = anonymousObject.source + this.type = type + } } var result = withLabelAndReceiverType(null, anonymousObject, type) { transformDeclarationContent(anonymousObject, data).single as FirAnonymousObject 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 ebf2a494c05..ec764b0a972 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 @@ -200,11 +200,11 @@ interface ConeTypeContext : TypeSystemContext, TypeSystemOptimizationContext, Ty //require(this is ConeSymbol) return when (this) { is FirTypeParameterSymbol, - is FirAnonymousObjectSymbol, is ConeCapturedTypeConstructor, is ErrorTypeConstructor, is ConeTypeVariableTypeConstructor, is ConeIntersectionType -> 0 + is FirAnonymousObjectSymbol -> fir.typeParameters.size is FirRegularClassSymbol -> fir.typeParameters.size is FirTypeAliasSymbol -> fir.typeParameters.size is ConeIntegerLiteralType -> 0 @@ -216,6 +216,7 @@ interface ConeTypeContext : TypeSystemContext, TypeSystemOptimizationContext, Ty //require(this is ConeSymbol) return when (this) { is FirTypeParameterSymbol -> error("?!:11") + is FirAnonymousObjectSymbol -> fir.typeParameters[index].symbol is FirRegularClassSymbol -> fir.typeParameters[index].symbol is FirTypeAliasSymbol -> fir.typeParameters[index].symbol else -> error("?!:12")