[FIR] Eliminate isNotSAM optimization as ineffective (see dc4f332c)

This commit is contained in:
Mikhail Glukhikh
2020-02-19 11:15:02 +03:00
parent 9017654b9d
commit 82c8b5f368
11 changed files with 7 additions and 49 deletions
@@ -11,7 +11,7 @@ import com.intellij.psi.PsiElement
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.declarations.addDefaultBoundIfNecessary
@@ -19,6 +19,9 @@ import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParameterBuilder
import org.jetbrains.kotlin.fir.java.declarations.*
import org.jetbrains.kotlin.fir.resolve.AbstractFirSymbolProvider
import org.jetbrains.kotlin.fir.resolve.constructType
import org.jetbrains.kotlin.fir.generateValueOfFunction
import org.jetbrains.kotlin.fir.generateValuesFunction
import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass
import org.jetbrains.kotlin.fir.resolve.scopes.wrapScopeWithJvmMapped
import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.impl.lazyNestedClassifierScope
@@ -27,6 +30,7 @@ import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.ConeNullability
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
import org.jetbrains.kotlin.fir.toFirSourceElement
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
import org.jetbrains.kotlin.load.java.JavaClassFinder
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
@@ -259,7 +263,6 @@ class JavaSymbolProvider(
generateValuesFunction(session, classId.packageFqName, classId.relativeClassName)
generateValueOfFunction(session, classId.packageFqName, classId.relativeClassName)
}
isNotSam = isNotSam()
parentClassTypeParameterStackCache.remove(firSymbol)
}
firJavaClass.replaceSuperTypeRefs(
@@ -9,7 +9,6 @@ import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.FirPureAbstractElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
@@ -119,7 +118,6 @@ internal class FirJavaClassBuilder : AbstractFirRegularClassBuilder, FirAnnotati
isCompanion = false
isData = false
isInline = false
isNotSAM = this@FirJavaClassBuilder.isNotSam
}
return FirJavaClass(
@@ -458,7 +458,6 @@ class DeclarationsConverter(
generateValuesFunction(baseSession, context.packageFqName, context.className)
generateValueOfFunction(baseSession, context.packageFqName, context.className)
}
calculateSAM()
}.build()
}
}
@@ -635,7 +635,6 @@ class RawFirBuilder(session: FirSession, val baseScopeProvider: FirScopeProvider
generateValuesFunction(baseSession, context.packageFqName, context.className)
generateValueOfFunction(baseSession, context.packageFqName, context.className)
}
calculateSAM()
}.build()
}
}
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.fir.deserialization
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.calculateSAM
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.addDeclarations
import org.jetbrains.kotlin.fir.declarations.builder.FirClassImplBuilder
@@ -134,7 +133,6 @@ fun deserializeClassToSymbol(
ClassId.fromString(nameResolver.getQualifiedClassName(it))
}
}
calculateSAM()
}.build().also {
(it.annotations as MutableList<FirAnnotationCall>) += context.annotationDeserializer.loadClassAnnotations(classProto, context.nameResolver)
}
@@ -252,8 +252,6 @@ private fun FirRegularClass.findSingleAbstractMethodByNames(
scopeSession: ScopeSession,
samCandidateNames: Set<Name>,
): FirSimpleFunction? {
if (status.isNotSAM) return null
var resultMethod: FirSimpleFunction? = null
var metIncorrectMember = false
@@ -35,7 +35,6 @@ interface FirDeclarationStatus : FirElement {
val isData: Boolean
val isSuspend: Boolean
val isStatic: Boolean
val isNotSAM: Boolean
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitDeclarationStatus(this, data)
}
@@ -34,7 +34,6 @@ interface FirResolvedDeclarationStatus : FirDeclarationStatus {
override val isData: Boolean
override val isSuspend: Boolean
override val isStatic: Boolean
override val isNotSAM: Boolean
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitResolvedDeclarationStatus(this, data)
}
@@ -6,10 +6,6 @@
package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.builder.AbstractFirRegularClassBuilder
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.expressions.FirExpression
@@ -20,26 +16,3 @@ fun FirBlock.returnExpressions(): List<FirExpression> = listOfNotNull(statements
private val PUBLIC_METHOD_NAMES_IN_OBJECT = setOf("equals", "hashCode", "getClass", "wait", "notify", "notifyAll", "toString")
fun AbstractFirRegularClassBuilder.calculateSAM() {
val status = status as FirDeclarationStatusImpl
status.isNotSAM = isNotSam()
}
fun AbstractFirRegularClassBuilder.isNotSam(): Boolean {
var counter = 0
for (declaration in declarations) {
if (declaration is FirProperty && declaration.modality == Modality.ABSTRACT) {
return true
}
if (declaration is FirSimpleFunction) {
if (declaration.modality != Modality.ABSTRACT || declaration.name.asString() in PUBLIC_METHOD_NAMES_IN_OBJECT) {
continue
}
counter++
if (counter > 1) {
return true
}
}
}
return false
}
@@ -121,12 +121,6 @@ open class FirDeclarationStatusImpl(
this[STATIC] = value
}
override var isNotSAM: Boolean
get() = this[NOT_SAM]
set(value) {
this[NOT_SAM] = value
}
private enum class Modifier(val mask: Int) {
EXPECT(0x1),
ACTUAL(0x2),
@@ -142,8 +136,7 @@ open class FirDeclarationStatusImpl(
COMPANION(0x800),
DATA(0x1000),
SUSPEND(0x2000),
STATIC(0x4000),
NOT_SAM(0x8000)
STATIC(0x4000)
}
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {}
@@ -296,8 +296,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
+modality
generateBooleanFields(
"expect", "actual", "override", "operator", "infix", "inline", "tailRec",
"external", "const", "lateInit", "inner", "companion", "data", "suspend",
"static", "notSAM"
"external", "const", "lateInit", "inner", "companion", "data", "suspend", "static"
)
}