From 98af866417fa1d30cb31215ef7d9f2762e7f064b Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Mon, 25 Nov 2019 12:14:46 +0300 Subject: [PATCH] [FIR] Fix stopping in AbstractFirUseSiteMemberScope --- .../impl/AbstractFirUseSiteMemberScope.kt | 2 +- .../testData/resolve/nestedClassNameClash.kt | 41 ++++++++++ .../testData/resolve/nestedClassNameClash.txt | 80 +++++++++++++++++++ .../fir/FirDiagnosticsTestGenerated.java | 5 ++ 4 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 compiler/fir/resolve/testData/resolve/nestedClassNameClash.kt create mode 100644 compiler/fir/resolve/testData/resolve/nestedClassNameClash.txt diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirUseSiteMemberScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirUseSiteMemberScope.kt index 191d9deac51..e4029dfcdf8 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirUseSiteMemberScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirUseSiteMemberScope.kt @@ -43,7 +43,7 @@ abstract class AbstractFirUseSiteMemberScope( processor: (FirClassifierSymbol<*>) -> ProcessorAction ): ProcessorAction { if (!declaredMemberScope.processClassifiersByName(name, processor)) { - return ProcessorAction.NEXT + return ProcessorAction.STOP } return superTypesScope.processClassifiersByName(name, processor) } diff --git a/compiler/fir/resolve/testData/resolve/nestedClassNameClash.kt b/compiler/fir/resolve/testData/resolve/nestedClassNameClash.kt new file mode 100644 index 00000000000..02430f4c70b --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/nestedClassNameClash.kt @@ -0,0 +1,41 @@ +fun listOf(): List = null!! + +fun materialize(): T = null!! + +class Result + +class Foo { + fun test_0() { + val result = materialize() + saveResult(result) + } + + fun test_1() { + val results = listOf() + saveResults(results) + } + + fun test_2(results: List) { + saveResults(results) + } + + fun test_3(result: Result) { + saveResult(result) + } + + fun test_4() { + val result = getResult() + saveResult(result) + } + + fun test_5() { + val result = Result() + saveResult(result) + } + + private fun getResult(): Result = Result() + private fun saveResults(results: List) {} + private fun saveResult(result: Result) {} + + class Result +} \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolve/nestedClassNameClash.txt b/compiler/fir/resolve/testData/resolve/nestedClassNameClash.txt new file mode 100644 index 00000000000..bb5e6f31cfb --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/nestedClassNameClash.txt @@ -0,0 +1,80 @@ +FILE: nestedClassNameClash.kt + public final fun listOf(): R|kotlin/collections/List| { + ^listOf when (lval : R|kotlin/Nothing?| = Null(null)) { + ==($subj$, Null(null)) -> { + throw #() + } + else -> { + R|/| + } + } + + } + public final fun materialize(): R|T| { + ^materialize when (lval : R|kotlin/Nothing?| = Null(null)) { + ==($subj$, Null(null)) -> { + throw #() + } + else -> { + R|/| + } + } + + } + public final class Result : R|kotlin/Any| { + public constructor(): R|Result| { + super() + } + + } + public final class Foo : R|kotlin/Any| { + public constructor(): R|Foo| { + super() + } + + public final fun test_0(): R|kotlin/Unit| { + lval result: R|Foo.Result| = R|/materialize|() + this@R|/Foo|.R|/Foo.saveResult|(R|/result|) + } + + public final fun test_1(): R|kotlin/Unit| { + lval results: R|kotlin/collections/List| = R|/listOf|() + this@R|/Foo|.R|/Foo.saveResults|(R|/results|) + } + + public final fun test_2(results: R|kotlin/collections/List|): R|kotlin/Unit| { + this@R|/Foo|.R|/Foo.saveResults|(R|/results|) + } + + public final fun test_3(result: R|Foo.Result|): R|kotlin/Unit| { + this@R|/Foo|.R|/Foo.saveResult|(R|/result|) + } + + public final fun test_4(): R|kotlin/Unit| { + lval result: R|Foo.Result| = this@R|/Foo|.R|/Foo.getResult|() + this@R|/Foo|.R|/Foo.saveResult|(R|/result|) + } + + public final fun test_5(): R|kotlin/Unit| { + lval result: R|Foo.Result| = R|/Foo.Result.Result|() + this@R|/Foo|.R|/Foo.saveResult|(R|/result|) + } + + private final fun getResult(): R|Foo.Result| { + ^getResult R|/Foo.Result.Result|() + } + + private final fun saveResults(results: R|kotlin/collections/List|): R|kotlin/Unit| { + } + + private final fun saveResult(result: R|Foo.Result|): R|kotlin/Unit| { + } + + public final class Result : R|kotlin/Any| { + public constructor(): R|Foo.Result| { + super() + } + + } + + } 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 c12b3526af3..0e2650c115b 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java @@ -133,6 +133,11 @@ public class FirDiagnosticsTestGenerated extends AbstractFirDiagnosticsTest { runTest("compiler/fir/resolve/testData/resolve/nestedClass.kt"); } + @TestMetadata("nestedClassNameClash.kt") + public void testNestedClassNameClash() throws Exception { + runTest("compiler/fir/resolve/testData/resolve/nestedClassNameClash.kt"); + } + @TestMetadata("NestedOfAliasedType.kt") public void testNestedOfAliasedType() throws Exception { runTest("compiler/fir/resolve/testData/resolve/NestedOfAliasedType.kt");