From bc14ce740abe9c0b96582a110a018a6667cb6382 Mon Sep 17 00:00:00 2001 From: qx Date: Fri, 19 May 2017 21:00:58 +0300 Subject: [PATCH] KT-15309 Don't apply "Fix with 'asDynamic'" to member extension funcitons --- .../idea/quickfix/migration/MigrateExternalExtensionFix.kt | 4 ++-- .../quickfix/migration/jsExternal/nativeMemberAll03.kt | 3 +++ .../migration/jsExternal/nativeMemberAll03.kt.after | 3 +++ .../kotlin/idea/quickfix/QuickFixTestGenerated.java | 6 ++++++ .../semantics/SourceMapGenerationSmokeTestGenerated.java | 1 - 5 files changed, 14 insertions(+), 3 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/migration/MigrateExternalExtensionFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/migration/MigrateExternalExtensionFix.kt index 4730151286a..6c0a97469f4 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/migration/MigrateExternalExtensionFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/migration/MigrateExternalExtensionFix.kt @@ -65,7 +65,7 @@ class MigrateExternalExtensionFix(declaration: KtNamedDeclaration) } private fun fixNativeClass(containingClass: KtClassOrObject) { - val membersToFix = containingClass.declarations.filterIsInstance().filter { isMemberDeclaration(it) }. map { + val membersToFix = containingClass.declarations.filterIsInstance().filter { isMemberDeclaration(it) && !isMemberExtensionDeclaration(it) }. map { it to fetchJsNativeAnnotations(it) }.filter { it.second.annotations.isNotEmpty() @@ -251,7 +251,7 @@ class MigrateExternalExtensionFix(declaration: KtNamedDeclaration) val e = diagnostic.psiElement when (diagnostic.factory) { ErrorsJs.WRONG_EXTERNAL_DECLARATION -> { - if (isMemberExtensionDeclaration(e)) { + if (isMemberExtensionDeclaration(e) && e.getParentOfType(true) == null) { return MigrateExternalExtensionFix(e as KtNamedDeclaration) } } diff --git a/idea/testData/quickfix/migration/jsExternal/nativeMemberAll03.kt b/idea/testData/quickfix/migration/jsExternal/nativeMemberAll03.kt index 48885f578da..342e9b53bf1 100644 --- a/idea/testData/quickfix/migration/jsExternal/nativeMemberAll03.kt +++ b/idea/testData/quickfix/migration/jsExternal/nativeMemberAll03.kt @@ -1,5 +1,6 @@ // "Fix with 'asDynamic'" "true" // JS +// ERROR: Declaration of such kind (extension function) cant be external external class B { @nativeGetter @@ -15,4 +16,6 @@ external class B { fun exp(t: T) fun dontTouch(): Nothing = definedExternally + + fun B.doNotTouchNestedExtensionMembers(): Nothing = definedExternally } \ No newline at end of file diff --git a/idea/testData/quickfix/migration/jsExternal/nativeMemberAll03.kt.after b/idea/testData/quickfix/migration/jsExternal/nativeMemberAll03.kt.after index 2a043e3205e..308ceb034cb 100644 --- a/idea/testData/quickfix/migration/jsExternal/nativeMemberAll03.kt.after +++ b/idea/testData/quickfix/migration/jsExternal/nativeMemberAll03.kt.after @@ -1,9 +1,12 @@ // "Fix with 'asDynamic'" "true" // JS +// ERROR: Declaration of such kind (extension function) cant be external external class B { fun dontTouch(): Nothing = definedExternally + + fun B.doNotTouchNestedExtensionMembers(): Nothing = definedExternally } @Suppress("NOTHING_TO_INLINE") diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 3c9517d35b8..bf71a68ad90 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -6558,6 +6558,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/migration/jsExternal/nativeSetterExtensionFunJsRuntime.kt"); doTest(fileName); } + + @TestMetadata("nestedExtension01.kt") + public void testNestedExtension01() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/migration/jsExternal/nestedExtension01.kt"); + doTest(fileName); + } } @TestMetadata("idea/testData/quickfix/migration/missingConstructorKeyword") diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/SourceMapGenerationSmokeTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/SourceMapGenerationSmokeTestGenerated.java index dccfefd35fb..d9470ebf8c7 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/SourceMapGenerationSmokeTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/SourceMapGenerationSmokeTestGenerated.java @@ -53,5 +53,4 @@ public class SourceMapGenerationSmokeTestGenerated extends AbstractSourceMapGene String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/sourcemap/methodCallInMethod.kt"); doTest(fileName); } - }