From dd20dd9806abb87515bed309f25b98537a92ccc4 Mon Sep 17 00:00:00 2001 From: Mark Punzalan Date: Fri, 19 Feb 2021 22:10:26 +0000 Subject: [PATCH] Report WRONG_MODIFIER_TARGET on the modifier instead of the declaration in ExternalFunChecker. This allows RemoveModifierFix to provide a quickfix to remove it. --- .../kotlin/resolve/jvm/checkers/ExternalFunChecker.kt | 6 ++++-- .../diagnostics/testsWithStdLib/native/nonFunction.kt | 10 +++++----- .../idea/quickfix/HighLevelQuickFixTestGenerated.java | 5 +++++ .../quickfix/modifiers/removeExternalModifier.kt | 5 +++++ .../quickfix/modifiers/removeExternalModifier.kt.after | 5 +++++ .../kotlin/idea/quickfix/QuickFixTestGenerated.java | 5 +++++ 6 files changed, 29 insertions(+), 7 deletions(-) create mode 100644 idea/testData/quickfix/modifiers/removeExternalModifier.kt create mode 100644 idea/testData/quickfix/modifiers/removeExternalModifier.kt.after diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/ExternalFunChecker.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/ExternalFunChecker.kt index c1b7a221c2a..f863e7643e3 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/ExternalFunChecker.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/ExternalFunChecker.kt @@ -23,8 +23,8 @@ import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtDeclarationWithBody import org.jetbrains.kotlin.psi.KtPropertyAccessor import org.jetbrains.kotlin.resolve.DescriptorUtils -import org.jetbrains.kotlin.resolve.checkers.DeclarationCheckerContext import org.jetbrains.kotlin.resolve.checkers.DeclarationChecker +import org.jetbrains.kotlin.resolve.checkers.DeclarationCheckerContext import org.jetbrains.kotlin.resolve.inline.InlineUtil import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm @@ -39,7 +39,9 @@ class ExternalFunChecker : DeclarationChecker { is ClassDescriptor -> "class" else -> "non-function declaration" } - trace.report(Errors.WRONG_MODIFIER_TARGET.on(declaration, KtTokens.EXTERNAL_KEYWORD, target)) + declaration.modifierList?.getModifier(KtTokens.EXTERNAL_KEYWORD)?.let { + trace.report(Errors.WRONG_MODIFIER_TARGET.on(it, KtTokens.EXTERNAL_KEYWORD, target)) + } return } diff --git a/compiler/testData/diagnostics/testsWithStdLib/native/nonFunction.kt b/compiler/testData/diagnostics/testsWithStdLib/native/nonFunction.kt index d6d31540478..60590cbd458 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/native/nonFunction.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/native/nonFunction.kt @@ -1,9 +1,9 @@ -external class A +external class A -external val foo: Int = 23 +external val foo: Int = 23 class B { - external class A + external class A - external val foo: Int = 23 -} \ No newline at end of file + external val foo: Int = 23 +} diff --git a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/quickfix/HighLevelQuickFixTestGenerated.java b/idea/idea-fir/tests/org/jetbrains/kotlin/idea/quickfix/HighLevelQuickFixTestGenerated.java index c61e1d6eca9..2c59755eaef 100644 --- a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/quickfix/HighLevelQuickFixTestGenerated.java +++ b/idea/idea-fir/tests/org/jetbrains/kotlin/idea/quickfix/HighLevelQuickFixTestGenerated.java @@ -650,6 +650,11 @@ public class HighLevelQuickFixTestGenerated extends AbstractHighLevelQuickFixTes runTest("idea/testData/quickfix/modifiers/removeConst.kt"); } + @TestMetadata("removeExternalModifier.kt") + public void testRemoveExternalModifier() throws Exception { + runTest("idea/testData/quickfix/modifiers/removeExternalModifier.kt"); + } + @TestMetadata("removeIncompatibleModifier.kt") public void testRemoveIncompatibleModifier() throws Exception { runTest("idea/testData/quickfix/modifiers/removeIncompatibleModifier.kt"); diff --git a/idea/testData/quickfix/modifiers/removeExternalModifier.kt b/idea/testData/quickfix/modifiers/removeExternalModifier.kt new file mode 100644 index 00000000000..4281aac13cc --- /dev/null +++ b/idea/testData/quickfix/modifiers/removeExternalModifier.kt @@ -0,0 +1,5 @@ +// "Remove 'external' modifier" "true" + +class B { + external val foo: Int = 23 +} \ No newline at end of file diff --git a/idea/testData/quickfix/modifiers/removeExternalModifier.kt.after b/idea/testData/quickfix/modifiers/removeExternalModifier.kt.after new file mode 100644 index 00000000000..67e909ab0ab --- /dev/null +++ b/idea/testData/quickfix/modifiers/removeExternalModifier.kt.after @@ -0,0 +1,5 @@ +// "Remove 'external' modifier" "true" + +class B { + val foo: Int = 23 +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 3831e252bd1..8455ad864ed 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -9432,6 +9432,11 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { runTest("idea/testData/quickfix/modifiers/removeConst.kt"); } + @TestMetadata("removeExternalModifier.kt") + public void testRemoveExternalModifier() throws Exception { + runTest("idea/testData/quickfix/modifiers/removeExternalModifier.kt"); + } + @TestMetadata("removeIncompatibleModifier.kt") public void testRemoveIncompatibleModifier() throws Exception { runTest("idea/testData/quickfix/modifiers/removeIncompatibleModifier.kt"); -- GitLab