FIR checkers: simplify hasPrimaryConstructor by source element check
This commit is contained in:
@@ -10,7 +10,7 @@ interface C {
|
|||||||
fun baz()
|
fun baz()
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Inv<K, T>() {
|
interface <!CONSTRUCTOR_IN_INTERFACE!>Inv<K, T>()<!> {
|
||||||
fun k(): K
|
fun k(): K
|
||||||
fun t(): T
|
fun t(): T
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-37
@@ -5,22 +5,14 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.analysis.checkers.declaration
|
package org.jetbrains.kotlin.fir.analysis.checkers.declaration
|
||||||
|
|
||||||
import com.intellij.lang.LighterASTNode
|
|
||||||
import com.intellij.openapi.util.Ref
|
|
||||||
import com.intellij.psi.PsiElement
|
|
||||||
import com.intellij.psi.PsiErrorElement
|
|
||||||
import com.intellij.util.diff.FlyweightCapableTreeStructure
|
|
||||||
import org.jetbrains.kotlin.KtNodeTypes.PRIMARY_CONSTRUCTOR
|
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.fir.FirLightSourceElement
|
|
||||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
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.analysis.diagnostics.FirErrors
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.hasPrimaryConstructor
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirClass
|
import org.jetbrains.kotlin.fir.declarations.FirClass
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||||
import org.jetbrains.kotlin.fir.psi
|
|
||||||
import org.jetbrains.kotlin.psi.KtPrimaryConstructor
|
|
||||||
|
|
||||||
object FirConstructorInInterfaceChecker : FirBasicDeclarationChecker() {
|
object FirConstructorInInterfaceChecker : FirBasicDeclarationChecker() {
|
||||||
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
|
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||||
@@ -33,34 +25,6 @@ object FirConstructorInInterfaceChecker : FirBasicDeclarationChecker() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun FirSourceElement.hasPrimaryConstructor(): Boolean {
|
|
||||||
val localPsi = psi
|
|
||||||
val localLightNode = lighterASTNode
|
|
||||||
|
|
||||||
if (localPsi != null && localPsi !is PsiErrorElement) {
|
|
||||||
return localPsi.hasPrimaryConstructor()
|
|
||||||
} else if (this is FirLightSourceElement) {
|
|
||||||
return localLightNode.hasPrimaryConstructor(treeStructure)
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun PsiElement.hasPrimaryConstructor(): Boolean {
|
|
||||||
return lastChild !is PsiErrorElement && lastChild is KtPrimaryConstructor
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun LighterASTNode.hasPrimaryConstructor(tree: FlyweightCapableTreeStructure<LighterASTNode>): Boolean {
|
|
||||||
val children = getChildren(tree)
|
|
||||||
return children.lastOrNull()?.tokenType == PRIMARY_CONSTRUCTOR
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun LighterASTNode.getChildren(tree: FlyweightCapableTreeStructure<LighterASTNode>): List<LighterASTNode> {
|
|
||||||
val children = Ref<Array<LighterASTNode?>>()
|
|
||||||
val count = tree.getChildren(this, children)
|
|
||||||
return if (count > 0) children.get().filterNotNull() else emptyList()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun DiagnosticReporter.report(source: FirSourceElement?) {
|
private fun DiagnosticReporter.report(source: FirSourceElement?) {
|
||||||
source?.let { report(FirErrors.CONSTRUCTOR_IN_INTERFACE.on(it)) }
|
source?.let { report(FirErrors.CONSTRUCTOR_IN_INTERFACE.on(it)) }
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -150,6 +150,9 @@ fun FirSourceElement.hasValOrVar(): Boolean =
|
|||||||
fun FirSourceElement.hasVar(): Boolean =
|
fun FirSourceElement.hasVar(): Boolean =
|
||||||
treeStructure.findChildByType(lighterASTNode, KtTokens.VAR_KEYWORD) != null
|
treeStructure.findChildByType(lighterASTNode, KtTokens.VAR_KEYWORD) != null
|
||||||
|
|
||||||
|
fun FirSourceElement.hasPrimaryConstructor(): Boolean =
|
||||||
|
treeStructure.primaryConstructor(lighterASTNode) != null
|
||||||
|
|
||||||
private fun FlyweightCapableTreeStructure<LighterASTNode>.constructorKeyword(node: LighterASTNode): LighterASTNode? =
|
private fun FlyweightCapableTreeStructure<LighterASTNode>.constructorKeyword(node: LighterASTNode): LighterASTNode? =
|
||||||
findChildByType(node, KtTokens.CONSTRUCTOR_KEYWORD)
|
findChildByType(node, KtTokens.CONSTRUCTOR_KEYWORD)
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ interface T1 {}
|
|||||||
|
|
||||||
interface T2<T> {}
|
interface T2<T> {}
|
||||||
|
|
||||||
interface Test() {
|
interface <!CONSTRUCTOR_IN_INTERFACE!>Test()<!> {
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Test1 : <!INTERFACE_WITH_SUPERCLASS, SUPERTYPE_INITIALIZED_IN_INTERFACE!>C2<!>() {}
|
interface Test1 : <!INTERFACE_WITH_SUPERCLASS, SUPERTYPE_INITIALIZED_IN_INTERFACE!>C2<!>() {}
|
||||||
|
|||||||
@@ -2,11 +2,11 @@
|
|||||||
|
|
||||||
class C(val a: String) {}
|
class C(val a: String) {}
|
||||||
|
|
||||||
interface T1(val x: String) {}
|
interface <!CONSTRUCTOR_IN_INTERFACE!>T1(val x: String)<!> {}
|
||||||
|
|
||||||
interface T2 constructor() {}
|
interface <!CONSTRUCTOR_IN_INTERFACE!>T2 constructor()<!> {}
|
||||||
|
|
||||||
interface T3 private constructor(a: Int) {}
|
interface <!CONSTRUCTOR_IN_INTERFACE!>T3 private constructor(a: Int)<!> {}
|
||||||
|
|
||||||
interface T4 {
|
interface T4 {
|
||||||
<!CONSTRUCTOR_IN_INTERFACE!>constructor(a: Int)<!> {
|
<!CONSTRUCTOR_IN_INTERFACE!>constructor(a: Int)<!> {
|
||||||
@@ -14,5 +14,5 @@ interface T4 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
interface T5 private () : T4 {}
|
interface <!CONSTRUCTOR_IN_INTERFACE!>T5 private ()<!> : T4 {}
|
||||||
interface T6 private<!SYNTAX!><!> : T5 {}
|
interface <!CONSTRUCTOR_IN_INTERFACE!>T6<!> private<!SYNTAX!><!> : T5 {}
|
||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
open class bar()
|
open class bar()
|
||||||
|
|
||||||
interface Foo() : <!INTERFACE_WITH_SUPERCLASS!>bar<!>(), bar, bar {
|
interface <!CONSTRUCTOR_IN_INTERFACE!>Foo()<!> : <!INTERFACE_WITH_SUPERCLASS!>bar<!>(), bar, bar {
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Foo2 : <!INTERFACE_WITH_SUPERCLASS!>bar<!>, Foo {
|
interface Foo2 : <!INTERFACE_WITH_SUPERCLASS!>bar<!>, Foo {
|
||||||
|
|||||||
Reference in New Issue
Block a user