[FIR] Split functions & constructors processing

This commit is contained in:
simon.ogorodnik
2020-04-09 22:34:23 +03:00
parent 7a1ecabe0a
commit c2ea0676e4
9 changed files with 260 additions and 99 deletions
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.name.Name
@@ -17,11 +18,11 @@ import org.jetbrains.kotlin.name.Name
class JvmMappedScope(
private val declaredMemberScope: FirScope,
private val javaMappedClassUseSiteScope: FirScope,
private val whiteListSignaturesByName: Map<Name, List<String>>
private val signatures: Signatures
) : FirScope() {
override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> Unit) {
val whiteListSignatures = whiteListSignaturesByName[name]
val whiteListSignatures = signatures.whiteListSignaturesByName[name]
?: return declaredMemberScope.processFunctionsByName(name, processor)
javaMappedClassUseSiteScope.processFunctionsByName(name) { symbol ->
val jvmSignature = symbol.fir.computeJvmDescriptor()
@@ -36,6 +37,22 @@ class JvmMappedScope(
declaredMemberScope.processFunctionsByName(name, processor)
}
override fun processDeclaredConstructors(processor: (FirConstructorSymbol) -> Unit) {
val constructorBlackList = signatures.constructorBlackList
if (constructorBlackList.isNotEmpty()) {
javaMappedClassUseSiteScope.processDeclaredConstructors { symbol ->
val jvmSignature = symbol.fir.computeJvmDescriptor()
.replace("kotlin/Any", "java/lang/Object")
.replace("kotlin/String", "java/lang/String")
if (jvmSignature !in constructorBlackList) {
processor(symbol)
}
}
}
declaredMemberScope.processDeclaredConstructors(processor)
}
override fun processPropertiesByName(name: Name, processor: (FirVariableSymbol<*>) -> Unit) {
declaredMemberScope.processPropertiesByName(name, processor)
}
@@ -45,15 +62,27 @@ class JvmMappedScope(
}
companion object {
fun prepareSignatures(klass: FirRegularClass): Map<Name, List<String>> {
data class Signatures(val whiteListSignaturesByName: Map<Name, Set<String>>, val constructorBlackList: Set<String>) {
fun isEmpty() = whiteListSignaturesByName.isEmpty() && constructorBlackList.isEmpty()
fun isNotEmpty() = !isEmpty()
}
fun prepareSignatures(klass: FirRegularClass): Signatures {
val signaturePrefix = klass.symbol.classId.toString()
val filteredSignatures = JvmBuiltInsSettings.WHITE_LIST_METHOD_SIGNATURES.filter { signature ->
val whiteListSignaturesByName = mutableMapOf<Name, MutableSet<String>>()
JvmBuiltInsSettings.WHITE_LIST_METHOD_SIGNATURES.filter { signature ->
signature.startsWith(signaturePrefix)
}.map { signature ->
// +1 to delete dot before function name
signature.substring(signaturePrefix.length + 1)
}.forEach {
whiteListSignaturesByName.getOrPut(Name.identifier(it.substringBefore("("))) { mutableSetOf() }.add(it)
}
return filteredSignatures.groupBy { Name.identifier(it.substringBefore("(")) }
val constructorBlackList = JvmBuiltInsSettings.BLACK_LIST_CONSTRUCTOR_SIGNATURES
.filter { it.startsWith(signaturePrefix) }
.mapTo(mutableSetOf()) { it.substring(signaturePrefix.length + 1) }
return Signatures(whiteListSignaturesByName, constructorBlackList)
}
}
}