FIR: make JavaClassEnhancementScope use-site, get rid of scope providers

Related to KT-29937
This commit is contained in:
Mikhail Glukhikh
2019-03-13 14:53:43 +03:00
parent e0348b56a1
commit 6c12fabf74
14 changed files with 65 additions and 159 deletions
@@ -9,9 +9,7 @@ import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.java.scopes.JavaFirScopeProvider
import org.jetbrains.kotlin.fir.resolve.FirProvider
import org.jetbrains.kotlin.fir.resolve.FirScopeProvider
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
import org.jetbrains.kotlin.fir.resolve.impl.*
@@ -34,15 +32,6 @@ class FirJavaModuleBasedSession(
)
)
)
registerComponent(
FirScopeProvider::class,
FirCompositeScopeProvider(
listOf(
JavaFirScopeProvider(),
FirRegularScopeProvider()
)
)
)
}
}
@@ -63,15 +52,6 @@ class FirLibrarySession(
)
)
)
registerComponent(
FirScopeProvider::class,
FirCompositeScopeProvider(
listOf(
JavaFirScopeProvider(),
FirRegularScopeProvider()
)
)
)
}
}
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.java.scopes.JavaClassEnhancementScope
import org.jetbrains.kotlin.fir.java.scopes.JavaClassUseSiteScope
import org.jetbrains.kotlin.fir.resolve.lookupSuperTypes
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScope
import org.jetbrains.kotlin.fir.scopes.impl.FirCompositeScope
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
@@ -48,24 +49,27 @@ class FirJavaClass(
override val superTypeRefs = mutableListOf<FirTypeRef>()
val useSiteScope: JavaClassUseSiteScope by lazy { buildUseSiteScope() }
override fun buildClassSpecificUseSiteScope(useSiteSession: FirSession): FirScope? {
return JavaClassEnhancementScope(useSiteSession, buildJavaUseSiteScope(this, useSiteSession))
}
override val declarations = mutableListOf<FirDeclaration>()
private fun FirRegularClass.buildUseSiteScope(useSiteSession: FirSession = session): JavaClassUseSiteScope {
private fun buildJavaUseSiteScope(regularClass: FirRegularClass, useSiteSession: FirSession): JavaClassUseSiteScope {
val superTypeEnhancementScope = FirCompositeScope(mutableListOf())
val declaredScope = FirClassDeclaredMemberScope(this, useSiteSession)
lookupSuperTypes(this, lookupInterfaces = true, deep = false, useSiteSession = useSiteSession)
val declaredScope = FirClassDeclaredMemberScope(regularClass, useSiteSession)
lookupSuperTypes(regularClass, lookupInterfaces = true, deep = false, useSiteSession = useSiteSession)
.mapNotNullTo(superTypeEnhancementScope.scopes) { useSiteSuperType ->
if (useSiteSuperType is ConeClassErrorType) return@mapNotNullTo null
val symbol = useSiteSuperType.lookupTag.toSymbol(useSiteSession)
if (symbol is FirClassSymbol) {
JavaClassEnhancementScope(useSiteSession, symbol.fir.buildUseSiteScope(useSiteSession))
// We need JavaClassEnhancementScope here to have already enhanced signatures from supertypes
JavaClassEnhancementScope(useSiteSession, buildJavaUseSiteScope(symbol.fir, useSiteSession))
} else {
null
}
}
return JavaClassUseSiteScope(this, useSiteSession, superTypeEnhancementScope, declaredScope)
return JavaClassUseSiteScope(regularClass, useSiteSession, superTypeEnhancementScope, declaredScope)
}
override fun replaceSupertypes(newSupertypes: List<FirTypeRef>): FirRegularClass {
@@ -1,20 +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.java.scopes
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass
import org.jetbrains.kotlin.fir.resolve.FirScopeProvider
import org.jetbrains.kotlin.fir.scopes.FirScope
class JavaFirScopeProvider : FirScopeProvider {
override fun getDeclaredMemberScope(klass: FirRegularClass, session: FirSession): FirScope {
if (klass !is FirJavaClass) return FirScopeProvider.emptyScope
return JavaClassEnhancementScope(session, klass.useSiteScope)
}
}