[FIR] Add generator for checkers aliases and sets of checkers
This commit is contained in:
+60
@@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* 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.checkers.generator
|
||||||
|
|
||||||
|
import kotlin.reflect.KClass
|
||||||
|
import kotlin.reflect.full.superclasses
|
||||||
|
|
||||||
|
class CheckersConfiguration(
|
||||||
|
val aliases: Map<KClass<*>, String>,
|
||||||
|
val additionalCheckers: MutableMap<String, String>
|
||||||
|
) {
|
||||||
|
val parentsMap: Map<KClass<*>, List<KClass<*>>>
|
||||||
|
|
||||||
|
init {
|
||||||
|
val parents: MutableMap<KClass<*>, List<KClass<*>>> = mutableMapOf()
|
||||||
|
for (firKClass in aliases.keys) {
|
||||||
|
val directParents = mutableListOf<KClass<*>>()
|
||||||
|
bfs(
|
||||||
|
firKClass,
|
||||||
|
childrenExtractor = { it.superclasses }
|
||||||
|
) {
|
||||||
|
if (it in aliases) {
|
||||||
|
directParents += it
|
||||||
|
false
|
||||||
|
} else {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
parents[firKClass] = directParents
|
||||||
|
}
|
||||||
|
parentsMap = parents
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun <T> bfs(start: T, childrenExtractor: (T) -> Collection<T>, process: (T) -> Boolean) {
|
||||||
|
val queue = ArrayDeque<T>()
|
||||||
|
val visited = mutableSetOf<T>()
|
||||||
|
val levels = mutableMapOf(start to 0)
|
||||||
|
queue.addLast(start)
|
||||||
|
var levelToStop: Int? = null
|
||||||
|
while (queue.isNotEmpty()) {
|
||||||
|
val element = queue.removeFirst()
|
||||||
|
if (!visited.add(element)) continue
|
||||||
|
val level = levels.getValue(element)
|
||||||
|
if (levelToStop != null && level > levelToStop) continue
|
||||||
|
val shouldContinue = if (level > 0) process(element) else true
|
||||||
|
if (shouldContinue) {
|
||||||
|
val children = childrenExtractor(element)
|
||||||
|
for (child in children) {
|
||||||
|
levels[child] = level + 1
|
||||||
|
queue.addLast(child)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
levelToStop = level
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+42
@@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* 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.checkers.generator
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.FirElement
|
||||||
|
import java.io.File
|
||||||
|
import kotlin.reflect.KClass
|
||||||
|
|
||||||
|
class CheckersConfigurator {
|
||||||
|
private val registeredAliases: MutableMap<KClass<*>, String> = LinkedHashMap()
|
||||||
|
private val additionalCheckers: MutableMap<String, String> = LinkedHashMap()
|
||||||
|
|
||||||
|
inline fun <reified T : FirElement> alias(name: String) {
|
||||||
|
alias(T::class, name)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun alias(kClass: KClass<out FirElement>, name: String) {
|
||||||
|
val realName = name.takeIf { it.startsWith("Fir") } ?: "Fir$name"
|
||||||
|
registeredAliases[kClass] = realName
|
||||||
|
}
|
||||||
|
|
||||||
|
fun additional(fieldName: String, classFqn: String) {
|
||||||
|
additionalCheckers[fieldName] = classFqn
|
||||||
|
}
|
||||||
|
|
||||||
|
fun build(): CheckersConfiguration {
|
||||||
|
return CheckersConfiguration(registeredAliases, additionalCheckers)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun generateCheckersComponents(
|
||||||
|
generationPath: File,
|
||||||
|
packageName: String,
|
||||||
|
abstractCheckerName: String,
|
||||||
|
init: CheckersConfigurator.() -> Unit
|
||||||
|
) {
|
||||||
|
val configuration = CheckersConfigurator().apply(init).build()
|
||||||
|
Generator(configuration, generationPath, packageName, abstractCheckerName).generate()
|
||||||
|
}
|
||||||
+186
@@ -0,0 +1,186 @@
|
|||||||
|
/*
|
||||||
|
* 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.checkers.generator
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.tree.generator.printer.*
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
private typealias Alias = String
|
||||||
|
private typealias Fqn = String
|
||||||
|
|
||||||
|
private const val CHECKERS_COMPONENT_INTERNAL_ANNOTATION = "@CheckersComponentInternal"
|
||||||
|
private const val CHECKERS_COMPONENT_INTERNAL_FQN = "org.jetbrains.kotlin.fir.analysis.CheckersComponentInternal"
|
||||||
|
|
||||||
|
class Generator(
|
||||||
|
private val configuration: CheckersConfiguration,
|
||||||
|
generationPath: File,
|
||||||
|
private val packageName: String,
|
||||||
|
private val abstractCheckerName: String
|
||||||
|
) {
|
||||||
|
private val generationPath: File
|
||||||
|
|
||||||
|
init {
|
||||||
|
var path = generationPath
|
||||||
|
packageName.split(".").forEach {
|
||||||
|
path = path.resolve(it)
|
||||||
|
}
|
||||||
|
path.mkdirs()
|
||||||
|
this.generationPath = path
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun generateAliases() {
|
||||||
|
val filename = "${abstractCheckerName}Aliases.kt"
|
||||||
|
generationPath.resolve(filename).useSmartPrinter {
|
||||||
|
printPackageAndCopyright()
|
||||||
|
printGeneratedMessage()
|
||||||
|
configuration.aliases.keys
|
||||||
|
.mapNotNull { it.qualifiedName }
|
||||||
|
.sorted()
|
||||||
|
.forEach { println("import $it") }
|
||||||
|
println()
|
||||||
|
for ((kClass, alias) in configuration.aliases) {
|
||||||
|
println("typealias $alias = $abstractCheckerName<${kClass.simpleName}>")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun generateAbstractCheckersComponent() {
|
||||||
|
val filename = "${checkersComponentName}.kt"
|
||||||
|
generationPath.resolve(filename).useSmartPrinter {
|
||||||
|
printPackageAndCopyright()
|
||||||
|
printImports()
|
||||||
|
printGeneratedMessage()
|
||||||
|
|
||||||
|
println("abstract class $checkersComponentName {")
|
||||||
|
withIndent {
|
||||||
|
println("companion object {")
|
||||||
|
withIndent {
|
||||||
|
println("val EMPTY: $checkersComponentName = object : $checkersComponentName() {}")
|
||||||
|
}
|
||||||
|
println("}")
|
||||||
|
println()
|
||||||
|
|
||||||
|
for (alias in configuration.aliases.values) {
|
||||||
|
println("open ${alias.valDeclaration} = emptySet()")
|
||||||
|
}
|
||||||
|
println()
|
||||||
|
|
||||||
|
for ((fieldName, classFqn) in configuration.additionalCheckers) {
|
||||||
|
val fieldClassName = classFqn.simpleName
|
||||||
|
println("open val $fieldName: ${fieldClassName.setType} = emptySet()")
|
||||||
|
}
|
||||||
|
if (configuration.additionalCheckers.isNotEmpty()) {
|
||||||
|
println()
|
||||||
|
}
|
||||||
|
|
||||||
|
for ((kClass, alias) in configuration.aliases) {
|
||||||
|
print("$CHECKERS_COMPONENT_INTERNAL_ANNOTATION internal val ${alias.allFieldName}: ${alias.setType} get() = ${alias.fieldName}")
|
||||||
|
for (parent in configuration.parentsMap.getValue(kClass)) {
|
||||||
|
val parentAlias = configuration.aliases.getValue(parent)
|
||||||
|
print(" + ${parentAlias.allFieldName}")
|
||||||
|
}
|
||||||
|
println()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println("}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun generateComposedComponent() {
|
||||||
|
val composedComponentName = "Composed$checkersComponentName"
|
||||||
|
val filename = "${composedComponentName}.kt"
|
||||||
|
generationPath.resolve(filename).useSmartPrinter {
|
||||||
|
printPackageAndCopyright()
|
||||||
|
printImports()
|
||||||
|
printGeneratedMessage()
|
||||||
|
println("internal class $composedComponentName : $checkersComponentName() {")
|
||||||
|
withIndent {
|
||||||
|
// public overrides
|
||||||
|
for (alias in configuration.aliases.values) {
|
||||||
|
println("override ${alias.valDeclaration}")
|
||||||
|
withIndent {
|
||||||
|
println("get() = _${alias.fieldName}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for ((fieldName, classFqn) in configuration.additionalCheckers) {
|
||||||
|
println("override val $fieldName: ${classFqn.simpleName.setType}")
|
||||||
|
withIndent {
|
||||||
|
println("get() = _$fieldName")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println()
|
||||||
|
|
||||||
|
// private mutable delegates
|
||||||
|
for (alias in configuration.aliases.values) {
|
||||||
|
println("private val _${alias.fieldName}: ${alias.mutableSetType} = mutableSetOf()")
|
||||||
|
}
|
||||||
|
for ((fieldName, classFqn) in configuration.additionalCheckers) {
|
||||||
|
println("private val _$fieldName: ${classFqn.simpleName.mutableSetType} = mutableSetOf()")
|
||||||
|
}
|
||||||
|
println()
|
||||||
|
|
||||||
|
// register function
|
||||||
|
println(CHECKERS_COMPONENT_INTERNAL_ANNOTATION)
|
||||||
|
println("internal fun register(checkers: $checkersComponentName) {")
|
||||||
|
withIndent {
|
||||||
|
for (alias in configuration.aliases.values) {
|
||||||
|
println("_${alias.fieldName} += checkers.${alias.allFieldName}")
|
||||||
|
}
|
||||||
|
for (fieldName in configuration.additionalCheckers.keys) {
|
||||||
|
println("_$fieldName += checkers.$fieldName")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println("}")
|
||||||
|
}
|
||||||
|
println("}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun SmartPrinter.printPackageAndCopyright() {
|
||||||
|
printCopyright()
|
||||||
|
println("package $packageName")
|
||||||
|
println()
|
||||||
|
}
|
||||||
|
|
||||||
|
@OptIn(ExperimentalStdlibApi::class)
|
||||||
|
private fun SmartPrinter.printImports() {
|
||||||
|
val imports = buildList {
|
||||||
|
addAll(configuration.additionalCheckers.values)
|
||||||
|
add(CHECKERS_COMPONENT_INTERNAL_FQN)
|
||||||
|
}.sorted()
|
||||||
|
|
||||||
|
for (fqn in imports) {
|
||||||
|
println("import $fqn")
|
||||||
|
}
|
||||||
|
println()
|
||||||
|
}
|
||||||
|
|
||||||
|
private val Alias.valDeclaration: String
|
||||||
|
get() = "val $fieldName: $setType"
|
||||||
|
|
||||||
|
private val Alias.fieldName: String
|
||||||
|
get() = removePrefix("Fir").decapitalize() + "s"
|
||||||
|
|
||||||
|
private val Alias.allFieldName: String
|
||||||
|
get() = "all${fieldName.capitalize()}"
|
||||||
|
|
||||||
|
private val Alias.setType: String
|
||||||
|
get() = "Set<$this>"
|
||||||
|
|
||||||
|
private val Alias.mutableSetType: String
|
||||||
|
get() = "MutableSet<$this>"
|
||||||
|
|
||||||
|
private val Fqn.simpleName: String
|
||||||
|
get() = this.split(".").last()
|
||||||
|
|
||||||
|
private val checkersComponentName = abstractCheckerName.removePrefix("Fir") + "s"
|
||||||
|
|
||||||
|
fun generate() {
|
||||||
|
generateAliases()
|
||||||
|
generateAbstractCheckersComponent()
|
||||||
|
generateComposedComponent()
|
||||||
|
}
|
||||||
|
}
|
||||||
+46
-1
@@ -5,4 +5,49 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.checkers.generator
|
package org.jetbrains.kotlin.fir.checkers.generator
|
||||||
|
|
||||||
fun main() {}
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirStatement
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
val generationPath = args.firstOrNull()?.let { File(it) } ?: File("compiler/fir/checkers/gen").absoluteFile
|
||||||
|
|
||||||
|
val expressionPackage = "org.jetbrains.kotlin.fir.analysis.checkers.expression"
|
||||||
|
generateCheckersComponents(generationPath, expressionPackage, "FirExpressionChecker") {
|
||||||
|
alias<FirStatement>("BasicExpressionChecker")
|
||||||
|
alias<FirQualifiedAccessExpression>("QualifiedAccessChecker")
|
||||||
|
alias<FirFunctionCall>("FunctionCallChecker")
|
||||||
|
alias<FirVariableAssignment>("VariableAssignmentChecker")
|
||||||
|
}
|
||||||
|
|
||||||
|
val declarationPackage = "org.jetbrains.kotlin.fir.analysis.checkers.declaration"
|
||||||
|
generateCheckersComponents(generationPath, declarationPackage, "FirDeclarationChecker") {
|
||||||
|
alias<FirDeclaration>("BasicDeclarationChecker")
|
||||||
|
alias<FirMemberDeclaration>("MemberDeclarationChecker")
|
||||||
|
alias<FirRegularClass>("RegularClassChecker")
|
||||||
|
alias<FirConstructor>("ConstructorChecker")
|
||||||
|
alias<FirFile>("FileChecker")
|
||||||
|
|
||||||
|
additional(
|
||||||
|
fieldName = "controlFlowAnalyserCheckers",
|
||||||
|
classFqn = "org.jetbrains.kotlin.fir.analysis.checkers.cfa.FirControlFlowChecker"
|
||||||
|
)
|
||||||
|
|
||||||
|
additional(
|
||||||
|
fieldName = "variableAssignmentCfaBasedCheckers",
|
||||||
|
classFqn = "org.jetbrains.kotlin.fir.analysis.cfa.AbstractFirPropertyInitializationChecker"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Stages:
|
||||||
|
* 1. associate aliases with fir statements
|
||||||
|
* 2. build inheritance hierarchy for all mentioned fir elements
|
||||||
|
* 3. generate aliases
|
||||||
|
* 4. generate abstract "DeclarationCheckers"
|
||||||
|
* 5. generate "ComposedDeclarationCheckers" with OptIn annotation
|
||||||
|
*/
|
||||||
|
|||||||
+51
@@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
* 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.checkers.declaration
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.CheckersComponentInternal
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.cfa.AbstractFirPropertyInitializationChecker
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.checkers.cfa.FirControlFlowChecker
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
internal class ComposedDeclarationCheckers : DeclarationCheckers() {
|
||||||
|
override val basicDeclarationCheckers: Set<FirBasicDeclarationChecker>
|
||||||
|
get() = _basicDeclarationCheckers
|
||||||
|
override val memberDeclarationCheckers: Set<FirMemberDeclarationChecker>
|
||||||
|
get() = _memberDeclarationCheckers
|
||||||
|
override val regularClassCheckers: Set<FirRegularClassChecker>
|
||||||
|
get() = _regularClassCheckers
|
||||||
|
override val constructorCheckers: Set<FirConstructorChecker>
|
||||||
|
get() = _constructorCheckers
|
||||||
|
override val fileCheckers: Set<FirFileChecker>
|
||||||
|
get() = _fileCheckers
|
||||||
|
override val controlFlowAnalyserCheckers: Set<FirControlFlowChecker>
|
||||||
|
get() = _controlFlowAnalyserCheckers
|
||||||
|
override val variableAssignmentCfaBasedCheckers: Set<AbstractFirPropertyInitializationChecker>
|
||||||
|
get() = _variableAssignmentCfaBasedCheckers
|
||||||
|
|
||||||
|
private val _basicDeclarationCheckers: MutableSet<FirBasicDeclarationChecker> = mutableSetOf()
|
||||||
|
private val _memberDeclarationCheckers: MutableSet<FirMemberDeclarationChecker> = mutableSetOf()
|
||||||
|
private val _regularClassCheckers: MutableSet<FirRegularClassChecker> = mutableSetOf()
|
||||||
|
private val _constructorCheckers: MutableSet<FirConstructorChecker> = mutableSetOf()
|
||||||
|
private val _fileCheckers: MutableSet<FirFileChecker> = mutableSetOf()
|
||||||
|
private val _controlFlowAnalyserCheckers: MutableSet<FirControlFlowChecker> = mutableSetOf()
|
||||||
|
private val _variableAssignmentCfaBasedCheckers: MutableSet<AbstractFirPropertyInitializationChecker> = mutableSetOf()
|
||||||
|
|
||||||
|
@CheckersComponentInternal
|
||||||
|
internal fun register(checkers: DeclarationCheckers) {
|
||||||
|
_basicDeclarationCheckers += checkers.allBasicDeclarationCheckers
|
||||||
|
_memberDeclarationCheckers += checkers.allMemberDeclarationCheckers
|
||||||
|
_regularClassCheckers += checkers.allRegularClassCheckers
|
||||||
|
_constructorCheckers += checkers.allConstructorCheckers
|
||||||
|
_fileCheckers += checkers.allFileCheckers
|
||||||
|
_controlFlowAnalyserCheckers += checkers.controlFlowAnalyserCheckers
|
||||||
|
_variableAssignmentCfaBasedCheckers += checkers.variableAssignmentCfaBasedCheckers
|
||||||
|
}
|
||||||
|
}
|
||||||
+36
@@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* 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.checkers.declaration
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.CheckersComponentInternal
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.cfa.AbstractFirPropertyInitializationChecker
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.checkers.cfa.FirControlFlowChecker
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
abstract class DeclarationCheckers {
|
||||||
|
companion object {
|
||||||
|
val EMPTY: DeclarationCheckers = object : DeclarationCheckers() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
open val basicDeclarationCheckers: Set<FirBasicDeclarationChecker> = emptySet()
|
||||||
|
open val memberDeclarationCheckers: Set<FirMemberDeclarationChecker> = emptySet()
|
||||||
|
open val regularClassCheckers: Set<FirRegularClassChecker> = emptySet()
|
||||||
|
open val constructorCheckers: Set<FirConstructorChecker> = emptySet()
|
||||||
|
open val fileCheckers: Set<FirFileChecker> = emptySet()
|
||||||
|
|
||||||
|
open val controlFlowAnalyserCheckers: Set<FirControlFlowChecker> = emptySet()
|
||||||
|
open val variableAssignmentCfaBasedCheckers: Set<AbstractFirPropertyInitializationChecker> = emptySet()
|
||||||
|
|
||||||
|
@CheckersComponentInternal internal val allBasicDeclarationCheckers: Set<FirBasicDeclarationChecker> get() = basicDeclarationCheckers
|
||||||
|
@CheckersComponentInternal internal val allMemberDeclarationCheckers: Set<FirMemberDeclarationChecker> get() = memberDeclarationCheckers + allBasicDeclarationCheckers
|
||||||
|
@CheckersComponentInternal internal val allRegularClassCheckers: Set<FirRegularClassChecker> get() = regularClassCheckers + allMemberDeclarationCheckers
|
||||||
|
@CheckersComponentInternal internal val allConstructorCheckers: Set<FirConstructorChecker> get() = constructorCheckers + allMemberDeclarationCheckers
|
||||||
|
@CheckersComponentInternal internal val allFileCheckers: Set<FirFileChecker> get() = fileCheckers + allBasicDeclarationCheckers
|
||||||
|
}
|
||||||
+23
@@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* 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.checkers.declaration
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirConstructor
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||||
|
|
||||||
|
typealias FirBasicDeclarationChecker = FirDeclarationChecker<FirDeclaration>
|
||||||
|
typealias FirMemberDeclarationChecker = FirDeclarationChecker<FirMemberDeclaration>
|
||||||
|
typealias FirRegularClassChecker = FirDeclarationChecker<FirRegularClass>
|
||||||
|
typealias FirConstructorChecker = FirDeclarationChecker<FirConstructor>
|
||||||
|
typealias FirFileChecker = FirDeclarationChecker<FirFile>
|
||||||
+37
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* 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.checkers.expression
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.CheckersComponentInternal
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
internal class ComposedExpressionCheckers : ExpressionCheckers() {
|
||||||
|
override val basicExpressionCheckers: Set<FirBasicExpressionChecker>
|
||||||
|
get() = _basicExpressionCheckers
|
||||||
|
override val qualifiedAccessCheckers: Set<FirQualifiedAccessChecker>
|
||||||
|
get() = _qualifiedAccessCheckers
|
||||||
|
override val functionCallCheckers: Set<FirFunctionCallChecker>
|
||||||
|
get() = _functionCallCheckers
|
||||||
|
override val variableAssignmentCheckers: Set<FirVariableAssignmentChecker>
|
||||||
|
get() = _variableAssignmentCheckers
|
||||||
|
|
||||||
|
private val _basicExpressionCheckers: MutableSet<FirBasicExpressionChecker> = mutableSetOf()
|
||||||
|
private val _qualifiedAccessCheckers: MutableSet<FirQualifiedAccessChecker> = mutableSetOf()
|
||||||
|
private val _functionCallCheckers: MutableSet<FirFunctionCallChecker> = mutableSetOf()
|
||||||
|
private val _variableAssignmentCheckers: MutableSet<FirVariableAssignmentChecker> = mutableSetOf()
|
||||||
|
|
||||||
|
@CheckersComponentInternal
|
||||||
|
internal fun register(checkers: ExpressionCheckers) {
|
||||||
|
_basicExpressionCheckers += checkers.allBasicExpressionCheckers
|
||||||
|
_qualifiedAccessCheckers += checkers.allQualifiedAccessCheckers
|
||||||
|
_functionCallCheckers += checkers.allFunctionCallCheckers
|
||||||
|
_variableAssignmentCheckers += checkers.allVariableAssignmentCheckers
|
||||||
|
}
|
||||||
|
}
|
||||||
+29
@@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* 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.checkers.expression
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.CheckersComponentInternal
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
abstract class ExpressionCheckers {
|
||||||
|
companion object {
|
||||||
|
val EMPTY: ExpressionCheckers = object : ExpressionCheckers() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
open val basicExpressionCheckers: Set<FirBasicExpressionChecker> = emptySet()
|
||||||
|
open val qualifiedAccessCheckers: Set<FirQualifiedAccessChecker> = emptySet()
|
||||||
|
open val functionCallCheckers: Set<FirFunctionCallChecker> = emptySet()
|
||||||
|
open val variableAssignmentCheckers: Set<FirVariableAssignmentChecker> = emptySet()
|
||||||
|
|
||||||
|
@CheckersComponentInternal internal val allBasicExpressionCheckers: Set<FirBasicExpressionChecker> get() = basicExpressionCheckers
|
||||||
|
@CheckersComponentInternal internal val allQualifiedAccessCheckers: Set<FirQualifiedAccessChecker> get() = qualifiedAccessCheckers + allBasicExpressionCheckers
|
||||||
|
@CheckersComponentInternal internal val allFunctionCallCheckers: Set<FirFunctionCallChecker> get() = functionCallCheckers + allQualifiedAccessCheckers
|
||||||
|
@CheckersComponentInternal internal val allVariableAssignmentCheckers: Set<FirVariableAssignmentChecker> get() = variableAssignmentCheckers + allBasicExpressionCheckers
|
||||||
|
}
|
||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* 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.checkers.expression
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirStatement
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment
|
||||||
|
|
||||||
|
typealias FirBasicExpressionChecker = FirExpressionChecker<FirStatement>
|
||||||
|
typealias FirQualifiedAccessChecker = FirExpressionChecker<FirQualifiedAccessExpression>
|
||||||
|
typealias FirFunctionCallChecker = FirExpressionChecker<FirFunctionCall>
|
||||||
|
typealias FirVariableAssignmentChecker = FirExpressionChecker<FirVariableAssignment>
|
||||||
@@ -8,12 +8,13 @@ package org.jetbrains.kotlin.fir.analysis
|
|||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.FirSessionComponent
|
import org.jetbrains.kotlin.fir.FirSessionComponent
|
||||||
import org.jetbrains.kotlin.fir.SessionConfiguration
|
import org.jetbrains.kotlin.fir.SessionConfiguration
|
||||||
import org.jetbrains.kotlin.fir.analysis.cfa.AbstractFirPropertyInitializationChecker
|
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.cfa.FirControlFlowChecker
|
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.*
|
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.*
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.expression.*
|
import org.jetbrains.kotlin.fir.analysis.checkers.expression.*
|
||||||
import org.jetbrains.kotlin.fir.analysis.extensions.FirAdditionalCheckersExtension
|
import org.jetbrains.kotlin.fir.analysis.extensions.FirAdditionalCheckersExtension
|
||||||
|
|
||||||
|
@RequiresOptIn
|
||||||
|
annotation class CheckersComponentInternal
|
||||||
|
|
||||||
class CheckersComponent : FirSessionComponent {
|
class CheckersComponent : FirSessionComponent {
|
||||||
val declarationCheckers: DeclarationCheckers get() = _declarationCheckers
|
val declarationCheckers: DeclarationCheckers get() = _declarationCheckers
|
||||||
private val _declarationCheckers = ComposedDeclarationCheckers()
|
private val _declarationCheckers = ComposedDeclarationCheckers()
|
||||||
@@ -22,11 +23,13 @@ class CheckersComponent : FirSessionComponent {
|
|||||||
private val _expressionCheckers = ComposedExpressionCheckers()
|
private val _expressionCheckers = ComposedExpressionCheckers()
|
||||||
|
|
||||||
@SessionConfiguration
|
@SessionConfiguration
|
||||||
|
@OptIn(CheckersComponentInternal::class)
|
||||||
fun register(checkers: DeclarationCheckers) {
|
fun register(checkers: DeclarationCheckers) {
|
||||||
_declarationCheckers.register(checkers)
|
_declarationCheckers.register(checkers)
|
||||||
}
|
}
|
||||||
|
|
||||||
@SessionConfiguration
|
@SessionConfiguration
|
||||||
|
@OptIn(CheckersComponentInternal::class)
|
||||||
fun register(checkers: ExpressionCheckers) {
|
fun register(checkers: ExpressionCheckers) {
|
||||||
_expressionCheckers.register(checkers)
|
_expressionCheckers.register(checkers)
|
||||||
}
|
}
|
||||||
@@ -39,61 +42,3 @@ class CheckersComponent : FirSessionComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val FirSession.checkersComponent: CheckersComponent by FirSession.sessionComponentAccessor()
|
val FirSession.checkersComponent: CheckersComponent by FirSession.sessionComponentAccessor()
|
||||||
|
|
||||||
private class ComposedDeclarationCheckers : DeclarationCheckers() {
|
|
||||||
override val fileCheckers: List<FirFileChecker>
|
|
||||||
get() = _fileCheckers
|
|
||||||
override val declarationCheckers: List<FirBasicDeclarationChecker>
|
|
||||||
get() = _declarationCheckers
|
|
||||||
override val memberDeclarationCheckers: List<FirMemberDeclarationChecker>
|
|
||||||
get() = _memberDeclarationCheckers
|
|
||||||
override val regularClassCheckers: List<FirRegularClassChecker>
|
|
||||||
get() = _regularClassCheckers
|
|
||||||
override val constructorCheckers: List<FirConstructorChecker>
|
|
||||||
get() = _constructorCheckers
|
|
||||||
override val controlFlowAnalyserCheckers: List<FirControlFlowChecker>
|
|
||||||
get() = _controlFlowAnalyserCheckers
|
|
||||||
override val variableAssignmentCfaBasedCheckers: List<AbstractFirPropertyInitializationChecker>
|
|
||||||
get() = _variableAssignmentCfaBasedCheckers
|
|
||||||
|
|
||||||
private val _fileCheckers: MutableList<FirFileChecker> = mutableListOf()
|
|
||||||
private val _declarationCheckers: MutableList<FirBasicDeclarationChecker> = mutableListOf()
|
|
||||||
private val _memberDeclarationCheckers: MutableList<FirMemberDeclarationChecker> = mutableListOf()
|
|
||||||
private val _regularClassCheckers: MutableList<FirRegularClassChecker> = mutableListOf()
|
|
||||||
private val _constructorCheckers: MutableList<FirConstructorChecker> = mutableListOf()
|
|
||||||
private val _controlFlowAnalyserCheckers: MutableList<FirControlFlowChecker> = mutableListOf()
|
|
||||||
private val _variableAssignmentCfaBasedCheckers: MutableList<AbstractFirPropertyInitializationChecker> = mutableListOf()
|
|
||||||
|
|
||||||
fun register(checkers: DeclarationCheckers) {
|
|
||||||
_fileCheckers += checkers.allFileCheckers
|
|
||||||
_declarationCheckers += checkers.declarationCheckers
|
|
||||||
_memberDeclarationCheckers += checkers.allMemberDeclarationCheckers
|
|
||||||
_regularClassCheckers += checkers.allRegularClassCheckers
|
|
||||||
_constructorCheckers += checkers.allConstructorCheckers
|
|
||||||
_controlFlowAnalyserCheckers += checkers.controlFlowAnalyserCheckers
|
|
||||||
_variableAssignmentCfaBasedCheckers += checkers.variableAssignmentCfaBasedCheckers
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class ComposedExpressionCheckers : ExpressionCheckers() {
|
|
||||||
override val expressionCheckers: List<FirBasicExpressionChecker>
|
|
||||||
get() = _expressionCheckers
|
|
||||||
override val qualifiedAccessCheckers: List<FirQualifiedAccessChecker>
|
|
||||||
get() = _qualifiedAccessCheckers
|
|
||||||
override val functionCallCheckers: List<FirFunctionCallChecker>
|
|
||||||
get() = _functionCallCheckers
|
|
||||||
override val variableAssignmentCheckers: List<FirVariableAssignmentChecker>
|
|
||||||
get() = _variableAssignmentCheckers
|
|
||||||
|
|
||||||
private val _expressionCheckers: MutableList<FirBasicExpressionChecker> = mutableListOf()
|
|
||||||
private val _qualifiedAccessCheckers: MutableList<FirQualifiedAccessChecker> = mutableListOf()
|
|
||||||
private val _functionCallCheckers: MutableList<FirFunctionCallChecker> = mutableListOf()
|
|
||||||
private val _variableAssignmentCheckers: MutableList<FirVariableAssignmentChecker> = mutableListOf()
|
|
||||||
|
|
||||||
fun register(checkers: ExpressionCheckers) {
|
|
||||||
_expressionCheckers += checkers.allExpressionCheckers
|
|
||||||
_qualifiedAccessCheckers += checkers.allQualifiedAccessCheckers
|
|
||||||
_functionCallCheckers += checkers.allFunctionCallCheckers
|
|
||||||
_variableAssignmentCheckers += checkers.variableAssignmentCheckers
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
-28
@@ -1,28 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.checkers.declaration
|
|
||||||
|
|
||||||
import org.jetbrains.kotlin.fir.analysis.cfa.AbstractFirPropertyInitializationChecker
|
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.cfa.FirControlFlowChecker
|
|
||||||
|
|
||||||
abstract class DeclarationCheckers {
|
|
||||||
companion object {
|
|
||||||
val EMPTY: DeclarationCheckers = object : DeclarationCheckers() {}
|
|
||||||
}
|
|
||||||
|
|
||||||
open val fileCheckers: List<FirFileChecker> = emptyList()
|
|
||||||
open val declarationCheckers: List<FirBasicDeclarationChecker> = emptyList()
|
|
||||||
open val memberDeclarationCheckers: List<FirMemberDeclarationChecker> = emptyList()
|
|
||||||
open val regularClassCheckers: List<FirRegularClassChecker> = emptyList()
|
|
||||||
open val constructorCheckers: List<FirConstructorChecker> = emptyList()
|
|
||||||
open val controlFlowAnalyserCheckers: List<FirControlFlowChecker> = emptyList()
|
|
||||||
open val variableAssignmentCfaBasedCheckers: List<AbstractFirPropertyInitializationChecker> = emptyList()
|
|
||||||
|
|
||||||
internal val allFileCheckers: List<FirFileChecker> get() = fileCheckers + declarationCheckers
|
|
||||||
internal val allMemberDeclarationCheckers: List<FirMemberDeclarationChecker> get() = memberDeclarationCheckers + declarationCheckers
|
|
||||||
internal val allRegularClassCheckers: List<FirRegularClassChecker> get() = regularClassCheckers + allMemberDeclarationCheckers
|
|
||||||
internal val allConstructorCheckers: List<FirConstructorChecker> get() = constructorCheckers + allMemberDeclarationCheckers
|
|
||||||
}
|
|
||||||
-6
@@ -12,9 +12,3 @@ import org.jetbrains.kotlin.fir.declarations.*
|
|||||||
abstract class FirDeclarationChecker<in D : FirDeclaration> {
|
abstract class FirDeclarationChecker<in D : FirDeclaration> {
|
||||||
abstract fun check(declaration: D, context: CheckerContext, reporter: DiagnosticReporter)
|
abstract fun check(declaration: D, context: CheckerContext, reporter: DiagnosticReporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
typealias FirFileChecker = FirDeclarationChecker<FirFile>
|
|
||||||
typealias FirBasicDeclarationChecker = FirDeclarationChecker<FirDeclaration>
|
|
||||||
typealias FirMemberDeclarationChecker = FirDeclarationChecker<FirMemberDeclaration>
|
|
||||||
typealias FirRegularClassChecker = FirDeclarationChecker<FirRegularClass>
|
|
||||||
typealias FirConstructorChecker = FirDeclarationChecker<FirConstructor>
|
|
||||||
|
|||||||
-21
@@ -1,21 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.checkers.expression
|
|
||||||
|
|
||||||
abstract class ExpressionCheckers {
|
|
||||||
companion object {
|
|
||||||
val EMPTY: ExpressionCheckers = object : ExpressionCheckers() {}
|
|
||||||
}
|
|
||||||
|
|
||||||
open val expressionCheckers: List<FirBasicExpressionChecker> = emptyList()
|
|
||||||
open val qualifiedAccessCheckers: List<FirQualifiedAccessChecker> = emptyList()
|
|
||||||
open val functionCallCheckers: List<FirFunctionCallChecker> = emptyList()
|
|
||||||
open val variableAssignmentCheckers: List<FirVariableAssignmentChecker> = emptyList()
|
|
||||||
|
|
||||||
internal val allExpressionCheckers get() = expressionCheckers
|
|
||||||
internal val allQualifiedAccessCheckers get() = qualifiedAccessCheckers + allExpressionCheckers
|
|
||||||
internal val allFunctionCallCheckers get() = functionCallCheckers + allQualifiedAccessCheckers
|
|
||||||
}
|
|
||||||
-8
@@ -7,16 +7,8 @@ package org.jetbrains.kotlin.fir.analysis.checkers.expression
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
|
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirStatement
|
import org.jetbrains.kotlin.fir.expressions.FirStatement
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment
|
|
||||||
|
|
||||||
abstract class FirExpressionChecker<in E : FirStatement> {
|
abstract class FirExpressionChecker<in E : FirStatement> {
|
||||||
abstract fun check(expression: E, context: CheckerContext, reporter: DiagnosticReporter)
|
abstract fun check(expression: E, context: CheckerContext, reporter: DiagnosticReporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
typealias FirBasicExpressionChecker = FirExpressionChecker<FirStatement>
|
|
||||||
typealias FirQualifiedAccessChecker = FirExpressionChecker<FirQualifiedAccessExpression>
|
|
||||||
typealias FirFunctionCallChecker = FirExpressionChecker<FirFunctionCall>
|
|
||||||
typealias FirVariableAssignmentChecker = FirExpressionChecker<FirVariableAssignment>
|
|
||||||
|
|||||||
+8
-8
@@ -42,34 +42,34 @@ class DeclarationCheckersDiagnosticComponent(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction, data: CheckerContext) {
|
override fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction, data: CheckerContext) {
|
||||||
checkers.declarationCheckers.check(anonymousFunction, data, reporter)
|
checkers.basicDeclarationCheckers.check(anonymousFunction, data, reporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitPropertyAccessor(propertyAccessor: FirPropertyAccessor, data: CheckerContext) {
|
override fun visitPropertyAccessor(propertyAccessor: FirPropertyAccessor, data: CheckerContext) {
|
||||||
checkers.declarationCheckers.check(propertyAccessor, data, reporter)
|
checkers.basicDeclarationCheckers.check(propertyAccessor, data, reporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitValueParameter(valueParameter: FirValueParameter, data: CheckerContext) {
|
override fun visitValueParameter(valueParameter: FirValueParameter, data: CheckerContext) {
|
||||||
checkers.declarationCheckers.check(valueParameter, data, reporter)
|
checkers.basicDeclarationCheckers.check(valueParameter, data, reporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitTypeParameter(typeParameter: FirTypeParameter, data: CheckerContext) {
|
override fun visitTypeParameter(typeParameter: FirTypeParameter, data: CheckerContext) {
|
||||||
checkers.declarationCheckers.check(typeParameter, data, reporter)
|
checkers.basicDeclarationCheckers.check(typeParameter, data, reporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitEnumEntry(enumEntry: FirEnumEntry, data: CheckerContext) {
|
override fun visitEnumEntry(enumEntry: FirEnumEntry, data: CheckerContext) {
|
||||||
checkers.declarationCheckers.check(enumEntry, data, reporter)
|
checkers.basicDeclarationCheckers.check(enumEntry, data, reporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitAnonymousObject(anonymousObject: FirAnonymousObject, data: CheckerContext) {
|
override fun visitAnonymousObject(anonymousObject: FirAnonymousObject, data: CheckerContext) {
|
||||||
checkers.declarationCheckers.check(anonymousObject, data, reporter)
|
checkers.basicDeclarationCheckers.check(anonymousObject, data, reporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitAnonymousInitializer(anonymousInitializer: FirAnonymousInitializer, data: CheckerContext) {
|
override fun visitAnonymousInitializer(anonymousInitializer: FirAnonymousInitializer, data: CheckerContext) {
|
||||||
checkers.declarationCheckers.check(anonymousInitializer, data, reporter)
|
checkers.basicDeclarationCheckers.check(anonymousInitializer, data, reporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun <D : FirDeclaration> List<FirDeclarationChecker<D>>.check(
|
private fun <D : FirDeclaration> Collection<FirDeclarationChecker<D>>.check(
|
||||||
declaration: D,
|
declaration: D,
|
||||||
context: CheckerContext,
|
context: CheckerContext,
|
||||||
reporter: DiagnosticReporter
|
reporter: DiagnosticReporter
|
||||||
|
|||||||
+19
-15
@@ -16,15 +16,15 @@ class ExpressionCheckersDiagnosticComponent(collector: AbstractDiagnosticCollect
|
|||||||
private val checkers = session.checkersComponent.expressionCheckers
|
private val checkers = session.checkersComponent.expressionCheckers
|
||||||
|
|
||||||
override fun visitTypeOperatorCall(typeOperatorCall: FirTypeOperatorCall, data: CheckerContext) {
|
override fun visitTypeOperatorCall(typeOperatorCall: FirTypeOperatorCall, data: CheckerContext) {
|
||||||
checkers.expressionCheckers.check(typeOperatorCall, data, reporter)
|
checkers.basicExpressionCheckers.check(typeOperatorCall, data, reporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun <T> visitConstExpression(constExpression: FirConstExpression<T>, data: CheckerContext) {
|
override fun <T> visitConstExpression(constExpression: FirConstExpression<T>, data: CheckerContext) {
|
||||||
checkers.expressionCheckers.check(constExpression, data, reporter)
|
checkers.basicExpressionCheckers.check(constExpression, data, reporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitAnnotationCall(annotationCall: FirAnnotationCall, data: CheckerContext) {
|
override fun visitAnnotationCall(annotationCall: FirAnnotationCall, data: CheckerContext) {
|
||||||
checkers.expressionCheckers.check(annotationCall, data, reporter)
|
checkers.basicExpressionCheckers.check(annotationCall, data, reporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression, data: CheckerContext) {
|
override fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression, data: CheckerContext) {
|
||||||
@@ -40,54 +40,58 @@ class ExpressionCheckersDiagnosticComponent(collector: AbstractDiagnosticCollect
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun visitThisReceiverExpression(thisReceiverExpression: FirThisReceiverExpression, data: CheckerContext) {
|
override fun visitThisReceiverExpression(thisReceiverExpression: FirThisReceiverExpression, data: CheckerContext) {
|
||||||
checkers.expressionCheckers.check(thisReceiverExpression, data, reporter)
|
checkers.basicExpressionCheckers.check(thisReceiverExpression, data, reporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitResolvedQualifier(resolvedQualifier: FirResolvedQualifier, data: CheckerContext) {
|
override fun visitResolvedQualifier(resolvedQualifier: FirResolvedQualifier, data: CheckerContext) {
|
||||||
checkers.expressionCheckers.check(resolvedQualifier, data, reporter)
|
checkers.basicExpressionCheckers.check(resolvedQualifier, data, reporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitWhenExpression(whenExpression: FirWhenExpression, data: CheckerContext) {
|
override fun visitWhenExpression(whenExpression: FirWhenExpression, data: CheckerContext) {
|
||||||
checkers.expressionCheckers.check(whenExpression, data, reporter)
|
checkers.basicExpressionCheckers.check(whenExpression, data, reporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitBinaryLogicExpression(binaryLogicExpression: FirBinaryLogicExpression, data: CheckerContext) {
|
override fun visitBinaryLogicExpression(binaryLogicExpression: FirBinaryLogicExpression, data: CheckerContext) {
|
||||||
checkers.expressionCheckers.check(binaryLogicExpression, data, reporter)
|
checkers.basicExpressionCheckers.check(binaryLogicExpression, data, reporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitArrayOfCall(arrayOfCall: FirArrayOfCall, data: CheckerContext) {
|
override fun visitArrayOfCall(arrayOfCall: FirArrayOfCall, data: CheckerContext) {
|
||||||
checkers.expressionCheckers.check(arrayOfCall, data, reporter)
|
checkers.basicExpressionCheckers.check(arrayOfCall, data, reporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitStringConcatenationCall(stringConcatenationCall: FirStringConcatenationCall, data: CheckerContext) {
|
override fun visitStringConcatenationCall(stringConcatenationCall: FirStringConcatenationCall, data: CheckerContext) {
|
||||||
checkers.expressionCheckers.check(stringConcatenationCall, data, reporter)
|
checkers.basicExpressionCheckers.check(stringConcatenationCall, data, reporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitCheckNotNullCall(checkNotNullCall: FirCheckNotNullCall, data: CheckerContext) {
|
override fun visitCheckNotNullCall(checkNotNullCall: FirCheckNotNullCall, data: CheckerContext) {
|
||||||
checkers.expressionCheckers.check(checkNotNullCall, data, reporter)
|
checkers.basicExpressionCheckers.check(checkNotNullCall, data, reporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitTryExpression(tryExpression: FirTryExpression, data: CheckerContext) {
|
override fun visitTryExpression(tryExpression: FirTryExpression, data: CheckerContext) {
|
||||||
checkers.expressionCheckers.check(tryExpression, data, reporter)
|
checkers.basicExpressionCheckers.check(tryExpression, data, reporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitClassReferenceExpression(classReferenceExpression: FirClassReferenceExpression, data: CheckerContext) {
|
override fun visitClassReferenceExpression(classReferenceExpression: FirClassReferenceExpression, data: CheckerContext) {
|
||||||
checkers.expressionCheckers.check(classReferenceExpression, data, reporter)
|
checkers.basicExpressionCheckers.check(classReferenceExpression, data, reporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitGetClassCall(getClassCall: FirGetClassCall, data: CheckerContext) {
|
override fun visitGetClassCall(getClassCall: FirGetClassCall, data: CheckerContext) {
|
||||||
checkers.expressionCheckers.check(getClassCall, data, reporter)
|
checkers.basicExpressionCheckers.check(getClassCall, data, reporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitEqualityOperatorCall(equalityOperatorCall: FirEqualityOperatorCall, data: CheckerContext) {
|
override fun visitEqualityOperatorCall(equalityOperatorCall: FirEqualityOperatorCall, data: CheckerContext) {
|
||||||
checkers.expressionCheckers.check(equalityOperatorCall, data, reporter)
|
checkers.basicExpressionCheckers.check(equalityOperatorCall, data, reporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitVariableAssignment(variableAssignment: FirVariableAssignment, data: CheckerContext) {
|
override fun visitVariableAssignment(variableAssignment: FirVariableAssignment, data: CheckerContext) {
|
||||||
checkers.variableAssignmentCheckers.check(variableAssignment, data, reporter)
|
checkers.variableAssignmentCheckers.check(variableAssignment, data, reporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun <E : FirStatement> List<FirExpressionChecker<E>>.check(expression: E, context: CheckerContext, reporter: DiagnosticReporter) {
|
private fun <E : FirStatement> Collection<FirExpressionChecker<E>>.check(
|
||||||
|
expression: E,
|
||||||
|
context: CheckerContext,
|
||||||
|
reporter: DiagnosticReporter
|
||||||
|
) {
|
||||||
for (checker in this) {
|
for (checker in this) {
|
||||||
checker.check(expression, context, reporter)
|
checker.check(expression, context, reporter)
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-10
@@ -13,9 +13,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.cfa.FirControlFlowChecker
|
|||||||
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.*
|
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.*
|
||||||
|
|
||||||
object CommonDeclarationCheckers : DeclarationCheckers() {
|
object CommonDeclarationCheckers : DeclarationCheckers() {
|
||||||
override val fileCheckers: List<FirFileChecker> = listOf()
|
override val basicDeclarationCheckers: Set<FirBasicDeclarationChecker> = setOf(
|
||||||
|
|
||||||
override val declarationCheckers: List<FirBasicDeclarationChecker> = listOf(
|
|
||||||
FirAnnotationClassDeclarationChecker,
|
FirAnnotationClassDeclarationChecker,
|
||||||
FirModifierChecker,
|
FirModifierChecker,
|
||||||
FirManyCompanionObjectsChecker,
|
FirManyCompanionObjectsChecker,
|
||||||
@@ -26,7 +24,7 @@ object CommonDeclarationCheckers : DeclarationCheckers() {
|
|||||||
FirConflictingProjectionChecker,
|
FirConflictingProjectionChecker,
|
||||||
)
|
)
|
||||||
|
|
||||||
override val memberDeclarationCheckers: List<FirMemberDeclarationChecker> = listOf(
|
override val memberDeclarationCheckers: Set<FirMemberDeclarationChecker> = setOf(
|
||||||
FirInfixFunctionDeclarationChecker,
|
FirInfixFunctionDeclarationChecker,
|
||||||
FirExposedVisibilityDeclarationChecker,
|
FirExposedVisibilityDeclarationChecker,
|
||||||
FirCommonConstructorDelegationIssuesChecker,
|
FirCommonConstructorDelegationIssuesChecker,
|
||||||
@@ -42,20 +40,20 @@ object CommonDeclarationCheckers : DeclarationCheckers() {
|
|||||||
FirInapplicableLateinitChecker,
|
FirInapplicableLateinitChecker,
|
||||||
)
|
)
|
||||||
|
|
||||||
override val regularClassCheckers: List<FirRegularClassChecker> = listOf(
|
override val regularClassCheckers: Set<FirRegularClassChecker> = setOf(
|
||||||
FirTypeMismatchOnOverrideChecker,
|
FirTypeMismatchOnOverrideChecker,
|
||||||
)
|
)
|
||||||
|
|
||||||
override val constructorCheckers: List<FirConstructorChecker> = listOf(
|
override val constructorCheckers: Set<FirConstructorChecker> = setOf(
|
||||||
FirConstructorAllowedChecker,
|
FirConstructorAllowedChecker,
|
||||||
)
|
)
|
||||||
|
|
||||||
override val controlFlowAnalyserCheckers: List<FirControlFlowChecker> = listOf(
|
override val controlFlowAnalyserCheckers: Set<FirControlFlowChecker> = setOf(
|
||||||
FirCallsEffectAnalyzer,
|
FirCallsEffectAnalyzer,
|
||||||
FirReturnsImpliesAnalyzer
|
FirReturnsImpliesAnalyzer,
|
||||||
)
|
)
|
||||||
|
|
||||||
override val variableAssignmentCfaBasedCheckers: List<AbstractFirPropertyInitializationChecker> = listOf(
|
override val variableAssignmentCfaBasedCheckers: Set<AbstractFirPropertyInitializationChecker> = setOf(
|
||||||
FirPropertyInitializationAnalyzer
|
FirPropertyInitializationAnalyzer,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-3
@@ -9,8 +9,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirSealedClassCons
|
|||||||
import org.jetbrains.kotlin.fir.analysis.checkers.expression.*
|
import org.jetbrains.kotlin.fir.analysis.checkers.expression.*
|
||||||
|
|
||||||
object CommonExpressionCheckers : ExpressionCheckers() {
|
object CommonExpressionCheckers : ExpressionCheckers() {
|
||||||
override val expressionCheckers: List<FirBasicExpressionChecker> = listOf()
|
override val qualifiedAccessCheckers: Set<FirQualifiedAccessChecker> = setOf(
|
||||||
override val qualifiedAccessCheckers: List<FirQualifiedAccessChecker> = listOf(
|
|
||||||
FirSuperNotAvailableChecker,
|
FirSuperNotAvailableChecker,
|
||||||
FirNotASupertypeChecker,
|
FirNotASupertypeChecker,
|
||||||
FirSuperclassNotAccessibleFromInterfaceChecker,
|
FirSuperclassNotAccessibleFromInterfaceChecker,
|
||||||
@@ -21,5 +20,5 @@ object CommonExpressionCheckers : ExpressionCheckers() {
|
|||||||
FirTypeArgumentsNotAllowedExpressionChecker,
|
FirTypeArgumentsNotAllowedExpressionChecker,
|
||||||
FirSealedClassConstructorCallChecker,
|
FirSealedClassConstructorCallChecker,
|
||||||
)
|
)
|
||||||
override val functionCallCheckers: List<FirFunctionCallChecker> = listOf()
|
override val functionCallCheckers: Set<FirFunctionCallChecker> = setOf()
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-7
@@ -8,25 +8,29 @@ package org.jetbrains.kotlin.fir.checkers
|
|||||||
import org.jetbrains.kotlin.fir.analysis.cfa.AbstractFirPropertyInitializationChecker
|
import org.jetbrains.kotlin.fir.analysis.cfa.AbstractFirPropertyInitializationChecker
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.cfa.FirControlFlowChecker
|
import org.jetbrains.kotlin.fir.analysis.checkers.cfa.FirControlFlowChecker
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.DeclarationCheckers
|
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.DeclarationCheckers
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirBasicDeclarationChecker
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirDeclarationChecker
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirMemberDeclarationChecker
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.extended.*
|
import org.jetbrains.kotlin.fir.analysis.checkers.extended.*
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||||
|
|
||||||
object ExtendedDeclarationCheckers : DeclarationCheckers() {
|
object ExtendedDeclarationCheckers : DeclarationCheckers() {
|
||||||
override val declarationCheckers = listOf(
|
override val basicDeclarationCheckers: Set<FirBasicDeclarationChecker> = setOf(
|
||||||
RedundantVisibilityModifierChecker,
|
RedundantVisibilityModifierChecker,
|
||||||
RedundantReturnUnitType
|
RedundantReturnUnitType,
|
||||||
)
|
)
|
||||||
|
|
||||||
override val memberDeclarationCheckers = listOf(
|
override val memberDeclarationCheckers: Set<FirMemberDeclarationChecker> = setOf(
|
||||||
RedundantModalityModifierChecker,
|
RedundantModalityModifierChecker,
|
||||||
RedundantExplicitTypeChecker,
|
RedundantExplicitTypeChecker,
|
||||||
RedundantSetterParameterTypeChecker
|
RedundantSetterParameterTypeChecker,
|
||||||
)
|
)
|
||||||
|
|
||||||
override val variableAssignmentCfaBasedCheckers: List<AbstractFirPropertyInitializationChecker> = listOf(
|
override val variableAssignmentCfaBasedCheckers: Set<AbstractFirPropertyInitializationChecker> = setOf(
|
||||||
CanBeValChecker,
|
CanBeValChecker,
|
||||||
)
|
)
|
||||||
|
|
||||||
override val controlFlowAnalyserCheckers: List<FirControlFlowChecker> = listOf(
|
override val controlFlowAnalyserCheckers: Set<FirControlFlowChecker> = setOf(
|
||||||
UnusedChecker
|
UnusedChecker,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-6
@@ -12,18 +12,18 @@ import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirVariableAssignme
|
|||||||
import org.jetbrains.kotlin.fir.analysis.checkers.extended.*
|
import org.jetbrains.kotlin.fir.analysis.checkers.extended.*
|
||||||
|
|
||||||
object ExtendedExpressionCheckers : ExpressionCheckers() {
|
object ExtendedExpressionCheckers : ExpressionCheckers() {
|
||||||
override val expressionCheckers: List<FirBasicExpressionChecker> = listOf(
|
override val basicExpressionCheckers: Set<FirBasicExpressionChecker> = setOf(
|
||||||
ArrayEqualityCanBeReplacedWithEquals,
|
ArrayEqualityCanBeReplacedWithEquals,
|
||||||
RedundantSingleExpressionStringTemplateChecker,
|
RedundantSingleExpressionStringTemplateChecker,
|
||||||
EmptyRangeChecker
|
EmptyRangeChecker,
|
||||||
)
|
)
|
||||||
|
|
||||||
override val variableAssignmentCheckers: List<FirVariableAssignmentChecker> = listOf(
|
override val variableAssignmentCheckers: Set<FirVariableAssignmentChecker> = setOf(
|
||||||
CanBeReplacedWithOperatorAssignmentChecker
|
CanBeReplacedWithOperatorAssignmentChecker,
|
||||||
)
|
)
|
||||||
|
|
||||||
override val qualifiedAccessCheckers: List<FirQualifiedAccessChecker> = listOf(
|
override val qualifiedAccessCheckers: Set<FirQualifiedAccessChecker> = setOf(
|
||||||
RedundantCallOfConversionMethod,
|
RedundantCallOfConversionMethod,
|
||||||
UselessCallOnNotNullChecker
|
UselessCallOnNotNullChecker,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -17,6 +17,6 @@ class AllOpenAdditionalCheckers(session: FirSession) : FirAdditionalCheckersExte
|
|||||||
get() = AllOpenPluginKey
|
get() = AllOpenPluginKey
|
||||||
|
|
||||||
override val declarationCheckers: DeclarationCheckers = object : DeclarationCheckers() {
|
override val declarationCheckers: DeclarationCheckers = object : DeclarationCheckers() {
|
||||||
override val memberDeclarationCheckers: List<FirMemberDeclarationChecker> = listOf(DummyNameChecker)
|
override val memberDeclarationCheckers: Set<FirMemberDeclarationChecker> = setOf(DummyNameChecker)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user