[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 com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Visibility 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.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.declarations.addDefaultBoundIfNecessary 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.java.declarations.*
import org.jetbrains.kotlin.fir.resolve.AbstractFirSymbolProvider import org.jetbrains.kotlin.fir.resolve.AbstractFirSymbolProvider
import org.jetbrains.kotlin.fir.resolve.constructType 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.resolve.scopes.wrapScopeWithJvmMapped
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.impl.lazyNestedClassifierScope 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.symbols.impl.*
import org.jetbrains.kotlin.fir.types.ConeNullability import org.jetbrains.kotlin.fir.types.ConeNullability
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef 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.fir.types.impl.ConeTypeParameterTypeImpl
import org.jetbrains.kotlin.load.java.JavaClassFinder import org.jetbrains.kotlin.load.java.JavaClassFinder
import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.load.java.JvmAnnotationNames
@@ -259,7 +263,6 @@ class JavaSymbolProvider(
generateValuesFunction(session, classId.packageFqName, classId.relativeClassName) generateValuesFunction(session, classId.packageFqName, classId.relativeClassName)
generateValueOfFunction(session, classId.packageFqName, classId.relativeClassName) generateValueOfFunction(session, classId.packageFqName, classId.relativeClassName)
} }
isNotSam = isNotSam()
parentClassTypeParameterStackCache.remove(firSymbol) parentClassTypeParameterStackCache.remove(firSymbol)
} }
firJavaClass.replaceSuperTypeRefs( firJavaClass.replaceSuperTypeRefs(
@@ -9,7 +9,6 @@ import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirImplementationDetail import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.FirPureAbstractElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
@@ -119,7 +118,6 @@ internal class FirJavaClassBuilder : AbstractFirRegularClassBuilder, FirAnnotati
isCompanion = false isCompanion = false
isData = false isData = false
isInline = false isInline = false
isNotSAM = this@FirJavaClassBuilder.isNotSam
} }
return FirJavaClass( return FirJavaClass(
@@ -458,7 +458,6 @@ class DeclarationsConverter(
generateValuesFunction(baseSession, context.packageFqName, context.className) generateValuesFunction(baseSession, context.packageFqName, context.className)
generateValueOfFunction(baseSession, context.packageFqName, context.className) generateValueOfFunction(baseSession, context.packageFqName, context.className)
} }
calculateSAM()
}.build() }.build()
} }
} }
@@ -635,7 +635,6 @@ class RawFirBuilder(session: FirSession, val baseScopeProvider: FirScopeProvider
generateValuesFunction(baseSession, context.packageFqName, context.className) generateValuesFunction(baseSession, context.packageFqName, context.className)
generateValueOfFunction(baseSession, context.packageFqName, context.className) generateValueOfFunction(baseSession, context.packageFqName, context.className)
} }
calculateSAM()
}.build() }.build()
} }
} }
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.fir.deserialization
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.FirSession 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.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.addDeclarations import org.jetbrains.kotlin.fir.declarations.addDeclarations
import org.jetbrains.kotlin.fir.declarations.builder.FirClassImplBuilder import org.jetbrains.kotlin.fir.declarations.builder.FirClassImplBuilder
@@ -134,7 +133,6 @@ fun deserializeClassToSymbol(
ClassId.fromString(nameResolver.getQualifiedClassName(it)) ClassId.fromString(nameResolver.getQualifiedClassName(it))
} }
} }
calculateSAM()
}.build().also { }.build().also {
(it.annotations as MutableList<FirAnnotationCall>) += context.annotationDeserializer.loadClassAnnotations(classProto, context.nameResolver) (it.annotations as MutableList<FirAnnotationCall>) += context.annotationDeserializer.loadClassAnnotations(classProto, context.nameResolver)
} }
@@ -252,8 +252,6 @@ private fun FirRegularClass.findSingleAbstractMethodByNames(
scopeSession: ScopeSession, scopeSession: ScopeSession,
samCandidateNames: Set<Name>, samCandidateNames: Set<Name>,
): FirSimpleFunction? { ): FirSimpleFunction? {
if (status.isNotSAM) return null
var resultMethod: FirSimpleFunction? = null var resultMethod: FirSimpleFunction? = null
var metIncorrectMember = false var metIncorrectMember = false
@@ -35,7 +35,6 @@ interface FirDeclarationStatus : FirElement {
val isData: Boolean val isData: Boolean
val isSuspend: Boolean val isSuspend: Boolean
val isStatic: Boolean val isStatic: Boolean
val isNotSAM: Boolean
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitDeclarationStatus(this, data) 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 isData: Boolean
override val isSuspend: Boolean override val isSuspend: Boolean
override val isStatic: 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) 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 package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.analyzer.ModuleInfo 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.FirBlock
import org.jetbrains.kotlin.fir.expressions.FirExpression 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") 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 this[STATIC] = value
} }
override var isNotSAM: Boolean
get() = this[NOT_SAM]
set(value) {
this[NOT_SAM] = value
}
private enum class Modifier(val mask: Int) { private enum class Modifier(val mask: Int) {
EXPECT(0x1), EXPECT(0x1),
ACTUAL(0x2), ACTUAL(0x2),
@@ -142,8 +136,7 @@ open class FirDeclarationStatusImpl(
COMPANION(0x800), COMPANION(0x800),
DATA(0x1000), DATA(0x1000),
SUSPEND(0x2000), SUSPEND(0x2000),
STATIC(0x4000), STATIC(0x4000)
NOT_SAM(0x8000)
} }
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {} override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {}
@@ -296,8 +296,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
+modality +modality
generateBooleanFields( generateBooleanFields(
"expect", "actual", "override", "operator", "infix", "inline", "tailRec", "expect", "actual", "override", "operator", "infix", "inline", "tailRec",
"external", "const", "lateInit", "inner", "companion", "data", "suspend", "external", "const", "lateInit", "inner", "companion", "data", "suspend", "static"
"static", "notSAM"
) )
} }