From eb90bd0e89e80cc0d7c397c6ff70185f6914a82a Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 28 Nov 2019 17:59:35 +0300 Subject: [PATCH] FIR: correctly process accessor symbols in derived classes --- .../java/scopes/JavaClassEnhancementScope.kt | 2 +- .../java/scopes/JavaClassUseSiteMemberScope.kt | 2 +- .../stdlib/j+k/SyntheticAfterFiltering.kt | 18 ++++++++++++++++++ .../stdlib/j+k/SyntheticAfterFiltering.txt | 8 ++++++++ .../FirDiagnosticsWithStdlibTestGenerated.java | 5 +++++ 5 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 compiler/fir/resolve/testData/resolve/stdlib/j+k/SyntheticAfterFiltering.kt create mode 100644 compiler/fir/resolve/testData/resolve/stdlib/j+k/SyntheticAfterFiltering.txt diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassEnhancementScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassEnhancementScope.kt index 6a99fac3c72..0953942d45f 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassEnhancementScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassEnhancementScope.kt @@ -111,7 +111,7 @@ class JavaClassEnhancementScope( ) as FirAccessorSymbol } else -> { - if (original is FirPropertySymbol) return original + if (original is FirPropertySymbol || original is FirAccessorSymbol) return original error("Can't make enhancement for $original: `${firElement.render()}`") } } diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt index 05c21b44307..02e6cba990e 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt @@ -100,7 +100,7 @@ class JavaClassUseSiteMemberScope( processor(it) } else { val overriddenBy = it.getOverridden(overrideCandidates) - if (overriddenBy == null && it is FirVariableSymbol<*>) { + if (overriddenBy == null) { processor(it) } else { NEXT diff --git a/compiler/fir/resolve/testData/resolve/stdlib/j+k/SyntheticAfterFiltering.kt b/compiler/fir/resolve/testData/resolve/stdlib/j+k/SyntheticAfterFiltering.kt new file mode 100644 index 00000000000..ba6ae8a9f31 --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/stdlib/j+k/SyntheticAfterFiltering.kt @@ -0,0 +1,18 @@ +// FILE: PsiElement.java + +public interface PsiElement { + PsiElement[] getChildren(); +} + +// FILE: XmlTag.java + +public interface XmlTag extends PsiElement { + String getLocalName(); +} + +// FILE: test.kt + +fun foo(tag: XmlTag, name: String): List { + val result = tag.children.filterIsInstance().filter { it.localName == name } + return result +} \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolve/stdlib/j+k/SyntheticAfterFiltering.txt b/compiler/fir/resolve/testData/resolve/stdlib/j+k/SyntheticAfterFiltering.txt new file mode 100644 index 00000000000..004c4b6d5fe --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/stdlib/j+k/SyntheticAfterFiltering.txt @@ -0,0 +1,8 @@ +FILE: test.kt + public final fun foo(tag: R|XmlTag|, name: R|kotlin/String|): R|kotlin/collections/List| { + lval result: R|kotlin/collections/List| = R|/tag|.R|/PsiElement.children|.R|kotlin/collections/filterIsInstance|().R|kotlin/collections/filter|( = filter@fun (it: R|XmlTag|): R|kotlin/Boolean| { + ==(R|/it|.R|/XmlTag.localName|, R|/name|) + } + ) + ^foo R|/result| + } diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithStdlibTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithStdlibTestGenerated.java index 69e96231254..24fba135acb 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithStdlibTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithStdlibTestGenerated.java @@ -529,6 +529,11 @@ public class FirDiagnosticsWithStdlibTestGenerated extends AbstractFirDiagnostic runTest("compiler/fir/resolve/testData/resolve/stdlib/j+k/StaticGenericMethod.kt"); } + @TestMetadata("SyntheticAfterFiltering.kt") + public void testSyntheticAfterFiltering() throws Exception { + runTest("compiler/fir/resolve/testData/resolve/stdlib/j+k/SyntheticAfterFiltering.kt"); + } + @TestMetadata("SyntheticWithForEach.kt") public void testSyntheticWithForEach() throws Exception { runTest("compiler/fir/resolve/testData/resolve/stdlib/j+k/SyntheticWithForEach.kt");