[FIR] Skip annotations resolve phase if no extensions registered

This commit is contained in:
Dmitriy Novozhilov
2020-04-28 16:06:18 +03:00
parent 4ed6d7fddb
commit b31981619e
2 changed files with 11 additions and 2 deletions
@@ -52,6 +52,7 @@ class FirExtensionPointService(
get() = Companion
fun <P : FirExtensionPoint> registerExtensions(extensionClass: KClass<P>, extensionFactories: List<FirExtensionPoint.Factory<P>>) {
registeredExtensionsSize += extensionFactories.size
val extensions = extensionFactories.map { it.create(session) }
val extensionsWithAllMode = mutableListOf<P>()
@@ -116,6 +117,9 @@ class FirExtensionPointService(
private val extensionsWithMetaAnnotations: Multimap<AnnotationFqn, FirExtensionPoint> = createMultimap()
var registeredExtensionsSize: Int = 0
private set
class ExtensionsAccessor<P : FirExtensionPoint>(
private val session: FirSession,
private val extensions: FirRegisteredExtension<P>
@@ -152,4 +156,7 @@ val FirSession.extensionPointService: FirExtensionPointService by FirSession.ses
fun FirAnnotationCall.fqName(session: FirSession): FqName? {
val symbol = session.firSymbolProvider.getSymbolByTypeRef<FirRegularClassSymbol>(annotationTypeRef) ?: return null
return symbol.classId.asSingleFqName()
}
}
val FirExtensionPointService.hasExtensions: Boolean
get() = registeredExtensionsSize > 0
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.extensions.AnnotationFqn
import org.jetbrains.kotlin.fir.extensions.extensionPointService
import org.jetbrains.kotlin.fir.extensions.fqName
import org.jetbrains.kotlin.fir.extensions.hasExtensions
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.FirImportResolveTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.FirSpecificTypeResolverTransformer
@@ -28,8 +29,9 @@ class FirPluginAnnotationsResolveTransformer(private val scopeSession: ScopeSess
}
override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult<FirDeclaration> {
file.replaceResolvePhase(FirResolvePhase.ANNOTATIONS_FOR_PLUGINS)
val extensionPointService = file.session.extensionPointService
if (!extensionPointService.hasExtensions) return file.compose()
file.replaceResolvePhase(FirResolvePhase.ANNOTATIONS_FOR_PLUGINS)
val newAnnotations = file.resolveAnnotations(extensionPointService.annotations, extensionPointService.metaAnnotations)
if (newAnnotations.isNotEmpty()) {
for (annotationClass in newAnnotations) {