[FIR] Add extension with additional checkers
This commit is contained in:
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSessionComponent
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.*
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.expression.*
|
||||
import org.jetbrains.kotlin.fir.analysis.extensions.FirAdditionalCheckersExtension
|
||||
|
||||
class CheckersComponent : FirSessionComponent {
|
||||
companion object {
|
||||
@@ -33,6 +34,11 @@ class CheckersComponent : FirSessionComponent {
|
||||
fun register(checkers: ExpressionCheckers) {
|
||||
_expressionCheckers.register(checkers)
|
||||
}
|
||||
|
||||
fun register(checkers: FirAdditionalCheckersExtension) {
|
||||
register(checkers.declarationCheckers)
|
||||
register(checkers.expressionCheckers)
|
||||
}
|
||||
}
|
||||
|
||||
val FirSession.checkersComponent: CheckersComponent by FirSession.sessionComponentAccessor()
|
||||
|
||||
+9
@@ -6,9 +6,13 @@
|
||||
package org.jetbrains.kotlin.fir.analysis.collectors
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.analysis.checkersComponent
|
||||
import org.jetbrains.kotlin.fir.analysis.extensions.additionalCheckers
|
||||
import org.jetbrains.kotlin.fir.extensions.extensionsService
|
||||
|
||||
object FirDiagnosticsCollector {
|
||||
fun create(session: FirSession): AbstractDiagnosticCollector {
|
||||
session.registerAdditionalCheckers()
|
||||
val collector = SimpleDiagnosticsCollector(session)
|
||||
collector.registerAllComponents()
|
||||
return collector
|
||||
@@ -17,8 +21,13 @@ object FirDiagnosticsCollector {
|
||||
// Use in CLI compiler
|
||||
@Suppress("unused")
|
||||
fun createParallel(session: FirSession): AbstractDiagnosticCollector {
|
||||
session.registerAdditionalCheckers()
|
||||
val collector = ParallelDiagnosticsCollector(session, numberOfThreads = 4)
|
||||
collector.registerAllComponents()
|
||||
return collector
|
||||
}
|
||||
|
||||
private fun FirSession.registerAdditionalCheckers() {
|
||||
extensionsService.additionalCheckers.forEach(checkersComponent::register)
|
||||
}
|
||||
}
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.fir.analysis.extensions
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.DeclarationCheckers
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.expression.ExpressionCheckers
|
||||
import org.jetbrains.kotlin.fir.extensions.*
|
||||
import kotlin.properties.ReadOnlyProperty
|
||||
import kotlin.reflect.KProperty
|
||||
|
||||
abstract class FirAdditionalCheckersExtension(session: FirSession) : AbstractFirAdditionalCheckersExtension(session) {
|
||||
companion object {
|
||||
val NAME = FirExtensionPointName("ExtensionCheckers")
|
||||
}
|
||||
|
||||
open val declarationCheckers: DeclarationCheckers = DeclarationCheckers.EMPTY
|
||||
open val expressionCheckers: ExpressionCheckers = ExpressionCheckers.EMPTY
|
||||
|
||||
final override val name: FirExtensionPointName
|
||||
get() = NAME
|
||||
|
||||
final override val directlyApplicableAnnotations: Set<AnnotationFqn>
|
||||
get() = emptySet()
|
||||
|
||||
final override val childrenApplicableAnnotations: Set<AnnotationFqn>
|
||||
get() = emptySet()
|
||||
|
||||
final override val metaAnnotations: Map<AnnotationFqn, MetaAnnotationMode>
|
||||
get() = emptyMap()
|
||||
|
||||
final override val mode: Mode
|
||||
get() = Mode.ALL
|
||||
}
|
||||
|
||||
val FirExtensionsService.additionalCheckers: List<FirAdditionalCheckersExtension> by FirExtensionsService.additionalCheckers()
|
||||
|
||||
private fun FirExtensionsService.Companion.additionalCheckers(): ReadOnlyProperty<FirExtensionsService, List<FirAdditionalCheckersExtension>> {
|
||||
val accessor = generateAccessor<FirRegisteredExtension<AbstractFirAdditionalCheckersExtension>, AbstractFirAdditionalCheckersExtension>(
|
||||
AbstractFirAdditionalCheckersExtension::class
|
||||
)
|
||||
return object : ReadOnlyProperty<FirExtensionsService, List<FirAdditionalCheckersExtension>> {
|
||||
override fun getValue(thisRef: FirExtensionsService, property: KProperty<*>): List<FirAdditionalCheckersExtension> {
|
||||
val extensions = accessor.getValue(thisRef, property)
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
return extensions.extensionsWithAllMode as List<FirAdditionalCheckersExtension>
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user