From 5713298108bd3af1fd59a776f4b49a72a3524a53 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 24 Sep 2018 19:13:57 +0200 Subject: [PATCH] Fix FQ name usage of experimental marker in UseExperimental #KT-26366 Fixed --- .../resolve/checkers/ExperimentalUsageChecker.kt | 8 ++++++-- .../experimental/fullFqNameUsage.kt | 12 ++++++++++++ .../experimental/fullFqNameUsage.txt | 16 ++++++++++++++++ .../DiagnosticsTestWithStdLibGenerated.java | 5 +++++ ...nosticsTestWithStdLibUsingJavacGenerated.java | 5 +++++ 5 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/diagnostics/testsWithStdLib/experimental/fullFqNameUsage.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/experimental/fullFqNameUsage.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker.kt index 27006af6f3e..2afe47f7906 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker.kt @@ -306,8 +306,11 @@ class ExperimentalUsageChecker(project: Project) : CallChecker { return false } - private fun PsiElement.isUsageAsUseExperimentalArgument(bindingContext: BindingContext): Boolean = - parent is KtClassLiteralExpression && + private fun PsiElement.isUsageAsUseExperimentalArgument(bindingContext: BindingContext): Boolean { + val qualifier = (this as? KtSimpleNameExpression)?.getTopmostParentQualifiedExpressionForSelector() ?: this + val parent = qualifier.parent + + return parent is KtClassLiteralExpression && parent.parent is KtValueArgument && parent.parent.parent is KtValueArgumentList && parent.parent.parent.parent.let { entry -> @@ -315,6 +318,7 @@ class ExperimentalUsageChecker(project: Project) : CallChecker { annotation.fqName == USE_EXPERIMENTAL_FQ_NAME || annotation.fqName == WAS_EXPERIMENTAL_FQ_NAME } == true } + } } class Overrides(project: Project) : DeclarationChecker { diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/fullFqNameUsage.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/fullFqNameUsage.kt new file mode 100644 index 00000000000..f3ef9111d2c --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/fullFqNameUsage.kt @@ -0,0 +1,12 @@ +// !USE_EXPERIMENTAL: kotlin.Experimental + +package test.abc + +@Experimental +annotation class E + +@UseExperimental(test.abc.E::class) +fun f() {} + +@test.abc.E +fun g() {} diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/fullFqNameUsage.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/fullFqNameUsage.txt new file mode 100644 index 00000000000..a7d408f9197 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/fullFqNameUsage.txt @@ -0,0 +1,16 @@ +package + +package test { + + package test.abc { + @kotlin.UseExperimental(markerClass = {test.abc.E::class}) public fun f(): kotlin.Unit + @test.abc.E public fun g(): kotlin.Unit + + @kotlin.Experimental public final annotation class E : kotlin.Annotation { + public constructor E() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + } +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java index 4bdb7d16cb0..a76a3accc14 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java @@ -2422,6 +2422,11 @@ public class DiagnosticsTestWithStdLibGenerated extends AbstractDiagnosticsTestW runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalUnsignedLiterals.kt"); } + @TestMetadata("fullFqNameUsage.kt") + public void testFullFqNameUsage() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/fullFqNameUsage.kt"); + } + @TestMetadata("importStatement.kt") public void testImportStatement() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/importStatement.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java index 2844d0f53fb..db83ebe2408 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java @@ -2422,6 +2422,11 @@ public class DiagnosticsTestWithStdLibUsingJavacGenerated extends AbstractDiagno runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalUnsignedLiterals.kt"); } + @TestMetadata("fullFqNameUsage.kt") + public void testFullFqNameUsage() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/fullFqNameUsage.kt"); + } + @TestMetadata("importStatement.kt") public void testImportStatement() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/importStatement.kt");