[FIR] Cleanup and refactoring for checkers

This commit is contained in:
vladislavf7@gmail.com
2020-07-21 10:06:55 +03:00
committed by Mikhail Glukhikh
parent fb946a6a3f
commit 2b0639d4ad
5 changed files with 42 additions and 9 deletions
@@ -1,12 +1,22 @@
object O {
fun foo() {}
}
// Interface
interface Interface {
// Redundant
// Questionable cuz compiler reports warning here in FE 1.0
<!REDUNDANT_MODALITY_MODIFIER!>open<!> val gav: Int
get() = 42
// Redundant
<!REDUNDANT_MODALITY_MODIFIER!>abstract<!> fun foo()
// Redundant
private <!REDUNDANT_MODALITY_MODIFIER!>final<!> fun bar() {}
// error
private final fun bar() {}
<!REDUNDANT_MODALITY_MODIFIER!>open<!> fun goo() {}
<!REDUNDANT_MODALITY_MODIFIER!>abstract<!> fun tar()
// error
abstract fun too() {}
}
interface B {
<!REDUNDANT_MODALITY_MODIFIER!>abstract<!> var bar: Unit
@@ -51,8 +61,8 @@ open class OpenDerived : Base() {
interface Derived : Interface {
// Redundant
override <!REDUNDANT_MODALITY_MODIFIER!>open<!> fun foo() {}
// Redundant
<!REDUNDANT_MODALITY_MODIFIER!>final<!> class Nested
// error
final class Nested
}
// Derived abstract class
abstract class AbstractDerived1(override final val gav: Int) : Interface {
@@ -1,4 +1,13 @@
FILE: RedundantModalityModifierChecker.kt
public final object O : R|kotlin/Any| {
private constructor(): R|O| {
super<R|kotlin/Any|>()
}
public final fun foo(): R|kotlin/Unit| {
}
}
public abstract interface Interface : R|kotlin/Any| {
public open val gav: R|kotlin/Int|
public get(): R|kotlin/Int| {
@@ -10,6 +19,14 @@ FILE: RedundantModalityModifierChecker.kt
private final fun bar(): R|kotlin/Unit| {
}
public open fun goo(): R|kotlin/Unit| {
}
public abstract fun tar(): R|kotlin/Unit|
public abstract fun too(): R|kotlin/Unit| {
}
}
public abstract interface B : R|kotlin/Any| {
public abstract var bar: R|kotlin/Unit|
@@ -22,7 +22,6 @@ import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.classId
import org.jetbrains.kotlin.fir.types.coneType
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
import org.jetbrains.kotlin.name.ClassId
object RedundantExplicitTypeChecker : FirMemberDeclarationChecker() {
@@ -6,12 +6,14 @@
package org.jetbrains.kotlin.fir.analysis.checkers.extended
import com.intellij.psi.impl.source.tree.LeafPsiElement
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.FirFakeSourceElement
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirMemberDeclarationChecker
import org.jetbrains.kotlin.fir.analysis.checkers.implicitModality
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_MODALITY_MODIFIER
import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.toFirPsiSourceElement
@@ -26,6 +28,11 @@ object RedundantModalityModifierChecker : FirMemberDeclarationChecker() {
val modalityModifier = (declaration.psi as? KtDeclaration)?.modalityModifier() ?: return
val modality = (modalityModifier as? LeafPsiElement)?.elementType as? KtModifierKeywordToken ?: return
if (
modality == KtTokens.FINAL_KEYWORD
&& (context.containingDeclarations.last() as? FirClass<*>)?.classKind == ClassKind.INTERFACE
) return
val implicitModality = declaration.implicitModality(context)
if (modality != implicitModality) return
@@ -26,7 +26,7 @@ object RedundantVisibilityModifierChecker : FirBasicDeclarationChecker() {
if (declaration.source is FirFakeSourceElement<*>) return
if (
declaration !is FirMemberDeclaration
&& !(declaration is FirPropertyAccessor && declaration.visibility == context.lastInContainingDeclarationsVisibility)
&& !(declaration is FirPropertyAccessor && declaration.visibility == context.containingPropertyVisibility)
) return
val modifierList = (declaration.source.getModifierList() as? FirPsiModifierList)?.modifierList ?: return
@@ -122,6 +122,6 @@ object RedundantVisibilityModifierChecker : FirBasicDeclarationChecker() {
else -> false
}
private val CheckerContext.lastInContainingDeclarationsVisibility
get() = (this.containingDeclarations.last() as FirProperty).visibility
private val CheckerContext.containingPropertyVisibility
get() = (this.containingDeclarations.last() as? FirProperty)?.visibility
}