From 8813ebd950dada6b2cd18834db0522b4160abc44 Mon Sep 17 00:00:00 2001 From: vldf Date: Wed, 29 Jul 2020 14:47:17 +0300 Subject: [PATCH] [FIR] Add RedundantSetterParameterType Checker --- .../RedundantSetterParameterTypeChecker.kt | 28 +++++++++++++ .../RedundantSetterParameterTypeChecker.txt | 40 +++++++++++++++++++ .../ExtendedFirDiagnosticsTestGenerated.java | 5 +++ .../ExtendedDeclarationCheckers.kt | 3 +- .../RedundantSetterParameterTypeChecker.kt | 28 +++++++++++++ .../fir/analysis/diagnostics/FirErrors.kt | 1 + 6 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 compiler/fir/analysis-tests/testData/extendedCheckers/RedundantSetterParameterTypeChecker.kt create mode 100644 compiler/fir/analysis-tests/testData/extendedCheckers/RedundantSetterParameterTypeChecker.txt create mode 100644 compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantSetterParameterTypeChecker.kt diff --git a/compiler/fir/analysis-tests/testData/extendedCheckers/RedundantSetterParameterTypeChecker.kt b/compiler/fir/analysis-tests/testData/extendedCheckers/RedundantSetterParameterTypeChecker.kt new file mode 100644 index 00000000000..566e938613b --- /dev/null +++ b/compiler/fir/analysis-tests/testData/extendedCheckers/RedundantSetterParameterTypeChecker.kt @@ -0,0 +1,28 @@ + +@Target(AnnotationTarget.CLASS) +annotation class Ann + +var x: Int + get() = 1 + set(@Ann private x) { } + + +var x: String = "" + set(param: String) { + field = "$param " + } + +class My { + var y: Int = 1 + set(param: Int) { + field = param - 1 + } + + var z: Double = 3.14 + private set + + var w: Boolean = true + set(param) { + field = !param + } +} \ No newline at end of file diff --git a/compiler/fir/analysis-tests/testData/extendedCheckers/RedundantSetterParameterTypeChecker.txt b/compiler/fir/analysis-tests/testData/extendedCheckers/RedundantSetterParameterTypeChecker.txt new file mode 100644 index 00000000000..05347b16ce9 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/extendedCheckers/RedundantSetterParameterTypeChecker.txt @@ -0,0 +1,40 @@ +FILE: RedundantSetterParameterTypeChecker.kt + @R|kotlin/annotation/Target|(vararg(Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.CLASS|)) public final annotation class Ann : R|kotlin/Annotation| { + public constructor(): R|Ann| { + super() + } + + } + public final var x: R|kotlin/Int| + public get(): R|kotlin/Int| { + ^ Int(1) + } + public set(@R|Ann|() x: R|kotlin/Int|): R|kotlin/Unit| { + } + public final var x: R|kotlin/String| = String() + public get(): R|kotlin/String| + public set(param: R|kotlin/String|): R|kotlin/Unit| { + F|/x| = (R|/param|.R|kotlin/Any.toString|(), String( )) + } + public final class My : R|kotlin/Any| { + public constructor(): R|My| { + super() + } + + public final var y: R|kotlin/Int| = Int(1) + public get(): R|kotlin/Int| + public set(param: R|kotlin/Int|): R|kotlin/Unit| { + this@R|/My|.F|/My.y| = R|/param|.R|kotlin/Int.minus|(Int(1)) + } + + public final var z: R|kotlin/Double| = Double(3.14) + public get(): R|kotlin/Double| + private set(value: R|kotlin/Double|): R|kotlin/Unit| + + public final var w: R|kotlin/Boolean| = Boolean(true) + public get(): R|kotlin/Boolean| + public set(param: R|kotlin/Boolean|): R|kotlin/Unit| { + this@R|/My|.F|/My.w| = R|/param|.R|kotlin/Boolean.not|() + } + + } diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/ExtendedFirDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/ExtendedFirDiagnosticsTestGenerated.java index b92ee170343..ef47be63868 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/ExtendedFirDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/ExtendedFirDiagnosticsTestGenerated.java @@ -48,6 +48,11 @@ public class ExtendedFirDiagnosticsTestGenerated extends AbstractExtendedFirDiag runTest("compiler/fir/analysis-tests/testData/extendedCheckers/RedundantReturnUnitTypeChecker.kt"); } + @TestMetadata("RedundantSetterParameterTypeChecker.kt") + public void testRedundantSetterParameterTypeChecker() throws Exception { + runTest("compiler/fir/analysis-tests/testData/extendedCheckers/RedundantSetterParameterTypeChecker.kt"); + } + @TestMetadata("RedundantSingleExpressionStringTemplateChecker.kt") public void testRedundantSingleExpressionStringTemplateChecker() throws Exception { runTest("compiler/fir/analysis-tests/testData/extendedCheckers/RedundantSingleExpressionStringTemplateChecker.kt"); 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 index 1877d167c90..c23c1772aa3 100644 --- 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 @@ -16,7 +16,8 @@ object ExtendedDeclarationCheckers : DeclarationCheckers() { override val memberDeclarationCheckers = listOf( RedundantModalityModifierChecker, - RedundantExplicitTypeChecker + RedundantExplicitTypeChecker, + RedundantSetterParameterTypeChecker ) override val controlFlowAnalyserCheckers: List = listOf( diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantSetterParameterTypeChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantSetterParameterTypeChecker.kt new file mode 100644 index 00000000000..a68b158051a --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantSetterParameterTypeChecker.kt @@ -0,0 +1,28 @@ +/* + * 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.extended + +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirMemberDeclarationChecker +import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_SETTER_PARAMETER_TYPE +import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration +import org.jetbrains.kotlin.fir.declarations.FirProperty +import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor + +object RedundantSetterParameterTypeChecker : FirMemberDeclarationChecker() { + override fun check(declaration: FirMemberDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { + if (declaration !is FirProperty) return + val setter = declaration.setter ?: return + if (setter is FirDefaultPropertyAccessor) return + val valueParameter = setter.valueParameters.firstOrNull() ?: return + val propertyTypeSource = declaration.returnTypeRef.source + val setterParameterTypeSource = valueParameter.returnTypeRef.source ?: return + if (setterParameterTypeSource != propertyTypeSource) { + reporter.report(setterParameterTypeSource, REDUNDANT_SETTER_PARAMETER_TYPE) + } + } +} \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index 49712c5d754..8313deebc89 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -107,4 +107,5 @@ object FirErrors { val REDUNDANT_CALL_OF_CONVERSION_METHOD by warning0() val ARRAY_EQUALITY_OPERATOR_CAN_BE_REPLACED_WITH_EQUALS by warning0() val EMPTY_RANGE by warning0() + val REDUNDANT_SETTER_PARAMETER_TYPE by warning0() }