From d817f719a45902c99f42bec71f68e9018649f08f Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Thu, 7 Mar 2019 17:16:13 +0300 Subject: [PATCH] FIR: Cleanup failures in body resolve --- .../FirAccessResolveTransformer.kt | 27 ---------- .../transformers/FirBodyResolveTransformer.kt | 54 ++++++++++++------- .../FirTotalResolveTransformer.kt | 1 - 3 files changed, 35 insertions(+), 47 deletions(-) delete mode 100644 compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAccessResolveTransformer.kt diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAccessResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAccessResolveTransformer.kt deleted file mode 100644 index e7287e860a0..00000000000 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAccessResolveTransformer.kt +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2010-2019 JetBrains s.r.o. 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.transformers - -import org.jetbrains.kotlin.fir.FirNamedReference -import org.jetbrains.kotlin.fir.FirResolvedCallableReference -import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.declarations.FirDeclaration -import org.jetbrains.kotlin.fir.declarations.FirFile -import org.jetbrains.kotlin.fir.declarations.FirRegularClass -import org.jetbrains.kotlin.fir.expressions.* -import org.jetbrains.kotlin.fir.references.FirErrorNamedReference -import org.jetbrains.kotlin.fir.references.FirResolvedCallableReferenceImpl -import org.jetbrains.kotlin.fir.scopes.FirScope -import org.jetbrains.kotlin.fir.scopes.ProcessorAction -import org.jetbrains.kotlin.fir.scopes.ProcessorAction.NEXT -import org.jetbrains.kotlin.fir.scopes.impl.FirTopLevelDeclaredMemberScope -import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol -import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult -import org.jetbrains.kotlin.fir.visitors.compose - -class FirAccessResolveTransformer : FirAbstractTreeTransformerWithSuperTypes(reversedScopePriority = true) { - -} \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt index 7bd7f4e1490..d7b818eb9f3 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt @@ -104,12 +104,19 @@ class FirBodyResolveTransformer(val session: FirSession) : FirTransformer( return FirClassUseSiteScope(useSiteSession, superTypeScope, declaredScope, true) } - fun ConeKotlinType.scope(useSiteSession: FirSession): FirScope { + fun ConeKotlinType.scope(useSiteSession: FirSession): FirScope? { return when (this) { + is ConeKotlinErrorType -> null + is ConeClassErrorType -> null is ConeAbbreviatedType -> directExpansion.scope(useSiteSession) - is ConeClassLikeType -> (this.lookupTag.toSymbol(useSiteSession) as FirBasedSymbol).fir.buildUseSiteScope( - useSiteSession - ) + is ConeClassLikeType -> { + val fir = this.lookupTag.toSymbol(useSiteSession)?.firUnsafe() ?: return null + fir.buildUseSiteScope(useSiteSession) + } + is ConeTypeParameterType -> { + val fir = this.lookupTag.toSymbol(useSiteSession)?.firUnsafe() ?: return null + FirCompositeScope(fir.bounds.mapNotNullTo(mutableListOf()) { it.coneTypeUnsafe().scope(useSiteSession) }) + } else -> error("Failed type ${this}") } } @@ -124,8 +131,9 @@ class FirBodyResolveTransformer(val session: FirSession) : FirTransformer( override fun transformRegularClass(regularClass: FirRegularClass, data: Any?): CompositeTransformResult { return withScopeCleanup(scopes) { - scopes += regularClass.buildUseSiteScope() - withLabel(regularClass.name, regularClass.defaultType()) { + val type = regularClass.defaultType() + scopes.addIfNotNull(type.scope(session)) + withLabel(regularClass.name, type) { super.transformRegularClass(regularClass, data) } } @@ -334,7 +342,7 @@ class FirBodyResolveTransformer(val session: FirSession) : FirTransformer( lookupInvoke = true - receiverScope.processFunctionsByName(invoke) { candidate -> + receiverScope?.processFunctionsByName(invoke) { candidate -> this.consumeCandidate(-1, candidate) ProcessorAction.NEXT } @@ -560,17 +568,16 @@ class FirBodyResolveTransformer(val session: FirSession) : FirTransformer( return super.transformBlock(block, data) } - private fun commonSuperType(types: List): FirTypeRef { - return types.first() + private fun commonSuperType(types: List): FirTypeRef? { + return types.firstOrNull() } override fun transformWhenExpression(whenExpression: FirWhenExpression, data: Any?): CompositeTransformResult { - val type = commonSuperType(whenExpression.branches.mapNotNull { it.result.visitNoTransform(this, data) it.result.resultType }) - bindingContext[whenExpression] = type + if (type != null) bindingContext[whenExpression] = type return super.transformWhenExpression(whenExpression, data) } @@ -616,13 +623,16 @@ class FirBodyResolveTransformer(val session: FirSession) : FirTransformer( localScopes.lastOrNull()?.storeDeclaration(namedFunction) return withScopeCleanup(scopes) { scopes.addIfNotNull(receiverTypeRef?.coneTypeSafe()?.scope(session)) - val body = namedFunction.body - if (namedFunction.returnTypeRef is FirImplicitTypeRef && body != null) { - body.visitNoTransform(this, namedFunction.returnTypeRef) - namedFunction.transformReturnTypeRef(this, body.resultType) - } - super.transformNamedFunction(namedFunction, data) + + val result = super.transformNamedFunction(namedFunction, namedFunction.returnTypeRef).single as FirNamedFunction + val body = result.body + if (result.returnTypeRef is FirImplicitTypeRef && body != null) { + result.transformReturnTypeRef(this, body.resultType) + result + } else { + result + }.compose() } } @@ -638,14 +648,14 @@ class FirBodyResolveTransformer(val session: FirSession) : FirTransformer( initializer?.visitNoTransform(this, variable.returnTypeRef) if (variable.returnTypeRef is FirImplicitTypeRef) { when { - variable.delegate != null -> TODO("!?") initializer != null -> { variable.transformReturnTypeRef(this, initializer.resultType) } + variable.delegate != null -> {} } } if (variable !is FirProperty) { - localScopes.last().storeDeclaration(variable) + localScopes.lastOrNull()?.storeDeclaration(variable) } return super.transformVariable(variable, data) } @@ -672,3 +682,9 @@ class FirBodyResolveTransformerAdapter : FirTransformer() { return file.transform(transformer, null) } } + + +inline fun ConeSymbol.firUnsafe(): T { + this as FirBasedSymbol<*> + return this.fir as T +} \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTotalResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTotalResolveTransformer.kt index bc93046e707..9ca69d43005 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTotalResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTotalResolveTransformer.kt @@ -15,7 +15,6 @@ class FirTotalResolveTransformer { FirSupertypeResolverTransformer(), FirTypeResolveTransformer(), FirStatusResolveTransformer(), - FirAccessResolveTransformer(), FirBodyResolveTransformerAdapter() )