From a8ff5d17dc3fa55f3a4e7fe8991c9fb5f63dfe3c Mon Sep 17 00:00:00 2001 From: "vladislavf7@gmail.com" Date: Fri, 17 Jul 2020 17:22:08 +0300 Subject: [PATCH] [FIR] Fix redundant modality modifier checker Fixed function FirDeclaration.hasBody() and some others improvement --- .../RedundantModalityModifierChecker.kt | 34 +++++++++----- .../RedundantModalityModifierChecker.txt | 45 ++++++++++++++----- .../fir/analysis/checkers/FirHelpers.kt | 5 ++- .../ExtendedDeclarationCheckers.kt | 16 +++++++ .../RedundantModalityModifierChecker.kt | 1 + 5 files changed, 77 insertions(+), 24 deletions(-) create mode 100644 compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/ExtendedDeclarationCheckers.kt diff --git a/compiler/fir/analysis-tests/testData/extendedCheckers/RedundantModalityModifierChecker.kt b/compiler/fir/analysis-tests/testData/extendedCheckers/RedundantModalityModifierChecker.kt index a29cc746cbd..b5abdd454fe 100644 --- a/compiler/fir/analysis-tests/testData/extendedCheckers/RedundantModalityModifierChecker.kt +++ b/compiler/fir/analysis-tests/testData/extendedCheckers/RedundantModalityModifierChecker.kt @@ -1,3 +1,27 @@ +// Interface +interface Interface { + // Redundant + open val gav: Int + get() = 42 + // Redundant + abstract fun foo() + // Redundant + private final fun bar() {} +} +interface B { + abstract var bar: Unit + abstract fun foo() +} + +expect abstract class AbstractClass : Foo { + abstract override fun foo() + + abstract fun bar() + + abstract val baz: Int +} + + // Abstract abstract class Base { // Redundant final @@ -23,16 +47,6 @@ open class OpenDerived : Base() { } // Redundant final final class Final -// Interface -interface Interface { - // Redundant - abstract fun foo() - // Redundant - private final fun bar() {} - // Redundant - open val gav: Int - get() = 42 -} // Derived interface interface Derived : Interface { // Redundant diff --git a/compiler/fir/analysis-tests/testData/extendedCheckers/RedundantModalityModifierChecker.txt b/compiler/fir/analysis-tests/testData/extendedCheckers/RedundantModalityModifierChecker.txt index 56077911f63..7d637da8e61 100644 --- a/compiler/fir/analysis-tests/testData/extendedCheckers/RedundantModalityModifierChecker.txt +++ b/compiler/fir/analysis-tests/testData/extendedCheckers/RedundantModalityModifierChecker.txt @@ -1,4 +1,37 @@ FILE: RedundantModalityModifierChecker.kt + public abstract interface Interface : R|kotlin/Any| { + public open val gav: R|kotlin/Int| + public get(): R|kotlin/Int| { + ^ Int(42) + } + + public abstract fun foo(): R|kotlin/Unit| + + private final fun bar(): R|kotlin/Unit| { + } + + } + public abstract interface B : R|kotlin/Any| { + public abstract var bar: R|kotlin/Unit| + public get(): R|kotlin/Unit| + public set(value: R|kotlin/Unit|): R|kotlin/Unit| + + public abstract fun foo(): R|kotlin/Unit| + + } + public abstract expect class AbstractClass : R|ERROR CLASS: Symbol not found, for `Foo`| { + public expect constructor(): R|AbstractClass| { + super() + } + + public abstract expect override fun foo(): R|kotlin/Unit| + + public abstract expect fun bar(): R|kotlin/Unit| + + public abstract expect val baz: R|kotlin/Int| + public get(): R|kotlin/Int| + + } public abstract class Base : R|kotlin/Any| { public constructor(): R|Base| { super() @@ -42,18 +75,6 @@ FILE: RedundantModalityModifierChecker.kt super() } - } - public abstract interface Interface : R|kotlin/Any| { - public abstract fun foo(): R|kotlin/Unit| - - private final fun bar(): R|kotlin/Unit| { - } - - public open val gav: R|kotlin/Int| - public get(): R|kotlin/Int| { - ^ Int(42) - } - } public abstract interface Derived : R|Interface| { public open override fun foo(): R|kotlin/Unit| { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt index 56633113373..7136b4d52b0 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.FirSymbolOwner import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression +import org.jetbrains.kotlin.fir.expressions.impl.FirEmptyExpressionBlock import org.jetbrains.kotlin.fir.expressions.impl.FirSingleExpressionBlock import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.resolve.firSymbolProvider @@ -268,7 +269,7 @@ fun FirMemberDeclaration.implicitModality(context: CheckerContext): KtModifierKe private fun FirDeclaration.modifierListOrNull() = (this.source.getModifierList() as? FirPsiModifierList)?.modifierList private fun FirDeclaration.hasBody(): Boolean = when (this) { - is FirSimpleFunction -> this.body != null && this.body !is FirSingleExpressionBlock - is FirProperty -> this.setter != null || this.getter != null + is FirSimpleFunction -> this.body != null && this.body !is FirEmptyExpressionBlock + is FirProperty -> this.setter?.body !is FirEmptyExpressionBlock? || this.getter?.body !is FirEmptyExpressionBlock? else -> false } \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/ExtendedDeclarationCheckers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/ExtendedDeclarationCheckers.kt new file mode 100644 index 00000000000..ca8929c3949 --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/ExtendedDeclarationCheckers.kt @@ -0,0 +1,16 @@ +/* + * 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.checkers.extended.RedundantModalityModifierChecker +import org.jetbrains.kotlin.fir.analysis.checkers.extended.RedundantVisibilityModifierChecker + +object ExtendedDeclarationCheckers : DeclarationCheckers() { + override val declarationCheckers = listOf(RedundantVisibilityModifierChecker, RedundantVisibilityModifierChecker) + + override val memberDeclarationCheckers = listOf(RedundantModalityModifierChecker) + +} diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantModalityModifierChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantModalityModifierChecker.kt index 2dcc2a5bb41..734bd6d8f0c 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantModalityModifierChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantModalityModifierChecker.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.toFirPsiSourceElement import org.jetbrains.kotlin.lexer.KtModifierKeywordToken +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.psiUtil.modalityModifier