From 2c184066321c107e78ce9436b9c909196322fd00 Mon Sep 17 00:00:00 2001 From: Mark Punzalan Date: Thu, 20 May 2021 20:59:44 +0000 Subject: [PATCH] IDE: Add test for message of VAL_OR_VAR_ON_*_PARAMETER diagnostic. Also fall back to getting parameter descriptor if property descriptor not found for `val/var` parameters. ^KTIJ-13030 Fixed --- .../idea/caches/resolve/extendedResolutionApi.kt | 3 +++ .../FirKotlinHighlightingPassTestGenerated.java | 5 +++++ .../diagnosticsMessage/valOrVarOnParameter.fir.kt | 14 ++++++++++++++ .../diagnosticsMessage/valOrVarOnParameter.kt | 14 ++++++++++++++ .../KotlinHighlightingPassTestGenerated.java | 5 +++++ 5 files changed, 41 insertions(+) create mode 100644 idea/testData/checker/diagnosticsMessage/valOrVarOnParameter.fir.kt create mode 100644 idea/testData/checker/diagnosticsMessage/valOrVarOnParameter.kt diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/caches/resolve/extendedResolutionApi.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/caches/resolve/extendedResolutionApi.kt index 9f3bb3206e6..0ffdadad0bb 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/caches/resolve/extendedResolutionApi.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/caches/resolve/extendedResolutionApi.kt @@ -39,6 +39,9 @@ fun KtDeclaration.resolveToDescriptorIfAny( val context = analyze(resolutionFacade, bodyResolveMode) return if (this is KtParameter && hasValOrVar()) { context.get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, this) + // It is incorrect to have `val/var` parameters outside the primary constructor (e.g., `fun foo(val x: Int)`) + // but we still want to try to resolve in such cases. + ?: context.get(BindingContext.DECLARATION_TO_DESCRIPTOR, this) } else { context.get(BindingContext.DECLARATION_TO_DESCRIPTOR, this) } diff --git a/idea/idea-fir/tests/org/jetbrains/kotlin/checkers/FirKotlinHighlightingPassTestGenerated.java b/idea/idea-fir/tests/org/jetbrains/kotlin/checkers/FirKotlinHighlightingPassTestGenerated.java index c85c7b94d27..a4fee864c51 100644 --- a/idea/idea-fir/tests/org/jetbrains/kotlin/checkers/FirKotlinHighlightingPassTestGenerated.java +++ b/idea/idea-fir/tests/org/jetbrains/kotlin/checkers/FirKotlinHighlightingPassTestGenerated.java @@ -795,5 +795,10 @@ public class FirKotlinHighlightingPassTestGenerated extends AbstractFirKotlinHig public void testOperatorCallDiagnosticsOnInOperator() throws Exception { runTest("idea/testData/checker/diagnosticsMessage/operatorCallDiagnosticsOnInOperator.kt"); } + + @TestMetadata("valOrVarOnParameter.kt") + public void testValOrVarOnParameter() throws Exception { + runTest("idea/testData/checker/diagnosticsMessage/valOrVarOnParameter.kt"); + } } } diff --git a/idea/testData/checker/diagnosticsMessage/valOrVarOnParameter.fir.kt b/idea/testData/checker/diagnosticsMessage/valOrVarOnParameter.fir.kt new file mode 100644 index 00000000000..0998b6a7ee9 --- /dev/null +++ b/idea/testData/checker/diagnosticsMessage/valOrVarOnParameter.fir.kt @@ -0,0 +1,14 @@ +// WITH_RUNTIME + +class A { + constructor(val x: Int) { + for (val z in 1..4) {} + } + + fun foo(var y: Int) { + try { + for (var (i, j) in listOf(1 to 4)) {} + } catch (val e: Exception) { + } + } +} \ No newline at end of file diff --git a/idea/testData/checker/diagnosticsMessage/valOrVarOnParameter.kt b/idea/testData/checker/diagnosticsMessage/valOrVarOnParameter.kt new file mode 100644 index 00000000000..6d0e3613da4 --- /dev/null +++ b/idea/testData/checker/diagnosticsMessage/valOrVarOnParameter.kt @@ -0,0 +1,14 @@ +// WITH_RUNTIME + +class A { + constructor(val x: Int) { + for (val z in 1..4) {} + } + + fun foo(var y: Int) { + try { + for (var (i, j) in listOf(1 to 4)) {} + } catch (val e: Exception) { + } + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/checkers/KotlinHighlightingPassTestGenerated.java b/idea/tests/org/jetbrains/kotlin/checkers/KotlinHighlightingPassTestGenerated.java index fd8c7c4397c..f3a9ccdd3ce 100644 --- a/idea/tests/org/jetbrains/kotlin/checkers/KotlinHighlightingPassTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/checkers/KotlinHighlightingPassTestGenerated.java @@ -940,5 +940,10 @@ public class KotlinHighlightingPassTestGenerated extends AbstractKotlinHighlight public void testOperatorCallDiagnosticsOnInOperator() throws Exception { runTest("idea/testData/checker/diagnosticsMessage/operatorCallDiagnosticsOnInOperator.kt"); } + + @TestMetadata("valOrVarOnParameter.kt") + public void testValOrVarOnParameter() throws Exception { + runTest("idea/testData/checker/diagnosticsMessage/valOrVarOnParameter.kt"); + } } }