FIR: Explicitlty separate static and member scopes

For Java, they have rather different semantics considering "overrides"
and obtaining functions/properties from supertypes

See the Java statics implementation
This commit is contained in:
Denis Zharkov
2020-06-25 12:28:16 +03:00
parent e058c578a8
commit 9668a60151
15 changed files with 363 additions and 129 deletions
@@ -7,25 +7,21 @@ package org.jetbrains.kotlin.fir.java
import org.jetbrains.kotlin.fir.FirRenderer
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass
import org.jetbrains.kotlin.fir.java.declarations.FirJavaConstructor
import org.jetbrains.kotlin.fir.java.declarations.FirJavaField
import org.jetbrains.kotlin.fir.java.declarations.FirJavaMethod
import org.jetbrains.kotlin.fir.java.scopes.JavaClassEnhancementScope
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.buildUseSiteMemberScope
import org.jetbrains.kotlin.fir.scopes.impl.FirCompositeScope
fun renderJavaClass(renderer: FirRenderer, javaClass: FirJavaClass, session: FirSession) {
val enhancementScope = javaClass.buildUseSiteMemberScope(session, ScopeSession()).let {
when (it) {
is FirCompositeScope -> it.scopes.filterIsInstance<JavaClassEnhancementScope>().first()
is JavaClassEnhancementScope -> it
else -> null
}
}
if (enhancementScope == null) {
val memberScope = javaClass.buildUseSiteMemberScope(session, ScopeSession())
val staticScope = javaClass.scopeProvider.getStaticScope(javaClass, session, ScopeSession())
if (memberScope == null && staticScope == null) {
javaClass.accept(renderer, null)
} else {
renderer.visitMemberDeclaration(javaClass)
@@ -34,8 +30,15 @@ fun renderJavaClass(renderer: FirRenderer, javaClass: FirJavaClass, session: Fir
val renderedDeclarations = mutableListOf<FirDeclaration>()
for (declaration in javaClass.declarations) {
if (declaration in renderedDeclarations) continue
val scopeToUse =
if (declaration is FirCallableMemberDeclaration<*> && declaration.status.isStatic)
staticScope
else
memberScope
when (declaration) {
is FirJavaConstructor -> enhancementScope.processDeclaredConstructors { symbol ->
is FirJavaConstructor -> scopeToUse!!.processDeclaredConstructors { symbol ->
val enhanced = symbol.fir
if (enhanced !in renderedDeclarations) {
enhanced.accept(renderer, null)
@@ -43,7 +46,7 @@ fun renderJavaClass(renderer: FirRenderer, javaClass: FirJavaClass, session: Fir
renderedDeclarations += enhanced
}
}
is FirJavaMethod -> enhancementScope.processFunctionsByName(declaration.name) { symbol ->
is FirJavaMethod -> scopeToUse!!.processFunctionsByName(declaration.name) { symbol ->
val enhanced = symbol.fir
if (enhanced !in renderedDeclarations) {
enhanced.accept(renderer, null)
@@ -51,7 +54,7 @@ fun renderJavaClass(renderer: FirRenderer, javaClass: FirJavaClass, session: Fir
renderedDeclarations += enhanced
}
}
is FirJavaField -> enhancementScope.processPropertiesByName(declaration.name) { symbol ->
is FirJavaField -> scopeToUse!!.processPropertiesByName(declaration.name) { symbol ->
val enhanced = symbol.fir
if (enhanced !in renderedDeclarations) {
enhanced.accept(renderer, null)