From edf567541561e1890f4fe93c2248cc56bbbc0b96 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 10 Dec 2019 12:41:58 +0300 Subject: [PATCH] [FIR TEST]: add problematic test with covariant array as receiver --- .../problems/covariantArrayAsReceiver.kt | 24 ++++++++++++++ .../problems/covariantArrayAsReceiver.txt | 33 +++++++++++++++++++ .../fir/FirDiagnosticsTestGenerated.java | 5 +++ 3 files changed, 62 insertions(+) create mode 100644 compiler/fir/resolve/testData/resolve/problems/covariantArrayAsReceiver.kt create mode 100644 compiler/fir/resolve/testData/resolve/problems/covariantArrayAsReceiver.txt diff --git a/compiler/fir/resolve/testData/resolve/problems/covariantArrayAsReceiver.kt b/compiler/fir/resolve/testData/resolve/problems/covariantArrayAsReceiver.kt new file mode 100644 index 00000000000..49c18d0a705 --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/problems/covariantArrayAsReceiver.kt @@ -0,0 +1,24 @@ +interface UsageInfo { + val usage: PsiElement +} + +interface PsiElement + +interface KtParameter : PsiElement + +interface KtLightMethod : PsiElement + +// With covariant array here we do not visit lambda (it.usage is KtLightMethod) below +// Problem disappears if 'out' is removed +fun Array.filterNot(f: (T) -> Boolean): List { + return this +} + +fun Array.toList(): List? = null + +fun foo(element: PsiElement, usages: Array) { + element is KtLightMethod + val adjusted = if (element is KtParameter) usages.filterNot { + it.usage is KtLightMethod + } else usages.toList() +} \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolve/problems/covariantArrayAsReceiver.txt b/compiler/fir/resolve/testData/resolve/problems/covariantArrayAsReceiver.txt new file mode 100644 index 00000000000..0b432d1b524 --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/problems/covariantArrayAsReceiver.txt @@ -0,0 +1,33 @@ +FILE: covariantArrayAsReceiver.kt + public abstract interface UsageInfo : R|kotlin/Any| { + public abstract val usage: R|PsiElement| + public get(): R|PsiElement| + + } + public abstract interface PsiElement : R|kotlin/Any| { + } + public abstract interface KtParameter : R|PsiElement| { + } + public abstract interface KtLightMethod : R|PsiElement| { + } + public final fun R|kotlin/Array|.filterNot(f: R|(T) -> kotlin/Boolean|): R|kotlin/collections/List| { + ^filterNot this@R|/filterNot| + } + public final fun R|kotlin/Array|.toList(): R|kotlin/collections/List?| { + ^toList Null(null) + } + public final fun foo(element: R|PsiElement|, usages: R|kotlin/Array|): R|kotlin/Unit| { + (R|/element| is R|KtLightMethod|) + lval adjusted: R|kotlin/collections/List?| = when () { + (R|/element| is R|KtParameter|) -> { + R|/usages|.R|/filterNot|( = filterNot@fun .(): { + (it#.usage# is KtLightMethod) + } + ) + } + else -> { + R|/usages|.R|/toList|() + } + } + + } diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java index 283bdeeabdc..acd416ad2d4 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java @@ -941,6 +941,11 @@ public class FirDiagnosticsTestGenerated extends AbstractFirDiagnosticsTest { runTest("compiler/fir/resolve/testData/resolve/problems/asImports.kt"); } + @TestMetadata("covariantArrayAsReceiver.kt") + public void testCovariantArrayAsReceiver() throws Exception { + runTest("compiler/fir/resolve/testData/resolve/problems/covariantArrayAsReceiver.kt"); + } + @TestMetadata("defaultJavaImportHiding.kt") public void testDefaultJavaImportHiding() throws Exception { runTest("compiler/fir/resolve/testData/resolve/problems/defaultJavaImportHiding.kt");