From 2f859f6996e341d936863ac36c9380571ed22875 Mon Sep 17 00:00:00 2001 From: Vyacheslav Gerasimov Date: Sun, 30 Oct 2016 22:38:12 +0300 Subject: [PATCH] fix KotlinAndroidAddStringResource: correct generic extension function processing + minor refactoring --- idea/idea-android/idea-android.iml | 1 + .../KotlinAndroidAddStringResource.kt | 53 +++++++++++-------- ...AndroidResourceIntentionTestGenerated.java | 6 +++ .../description.html | 2 +- .../expected/main.kt | 5 ++ .../expected/res/values/strings.xml | 3 ++ .../genericContextExtensionFunction.test | 5 ++ .../genericContextExtensionFunction/main.kt | 5 ++ 8 files changed, 56 insertions(+), 24 deletions(-) create mode 100644 idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/genericContextExtensionFunction/expected/main.kt create mode 100644 idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/genericContextExtensionFunction/expected/res/values/strings.xml create mode 100644 idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/genericContextExtensionFunction/genericContextExtensionFunction.test create mode 100644 idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/genericContextExtensionFunction/main.kt diff --git a/idea/idea-android/idea-android.iml b/idea/idea-android/idea-android.iml index cab9a35a6e2..e77992da27e 100644 --- a/idea/idea-android/idea-android.iml +++ b/idea/idea-android/idea-android.iml @@ -19,5 +19,6 @@ + \ No newline at end of file diff --git a/idea/idea-android/src/org/jetbrains/kotlin/android/intentions/KotlinAndroidAddStringResource.kt b/idea/idea-android/src/org/jetbrains/kotlin/android/intentions/KotlinAndroidAddStringResource.kt index d2c50f10c8f..f308d4fae4c 100644 --- a/idea/idea-android/src/org/jetbrains/kotlin/android/intentions/KotlinAndroidAddStringResource.kt +++ b/idea/idea-android/src/org/jetbrains/kotlin/android/intentions/KotlinAndroidAddStringResource.kt @@ -21,24 +21,22 @@ import com.intellij.CommonBundle import com.intellij.codeInsight.template.* import com.intellij.codeInsight.template.impl.* import com.intellij.codeInsight.template.macro.VariableOfTypeMacro -import com.intellij.openapi.application.Application import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.command.undo.UndoUtil import com.intellij.openapi.editor.Editor import com.intellij.openapi.module.Module import com.intellij.openapi.ui.Messages import com.intellij.psi.* -import com.intellij.psi.codeStyle.JavaCodeStyleManager import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.android.actions.CreateXmlResourceDialog import org.jetbrains.android.facet.AndroidFacet import org.jetbrains.android.util.AndroidBundle import org.jetbrains.android.util.AndroidResourceUtil import org.jetbrains.kotlin.builtins.isExtensionFunctionType -import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor +import org.jetbrains.kotlin.idea.core.ShortenReferences import org.jetbrains.kotlin.idea.intentions.SelfTargetingIntention import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.BindingContext @@ -48,15 +46,24 @@ import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode class KotlinAndroidAddStringResource : SelfTargetingIntention(KtLiteralStringTemplateEntry::class.java, "Extract string resource") { - private val GET_STRING_METHOD = "getString" - private val EXTRACT_RESOURCE_DIALOG_TITLE = "Extract Resource" - private val PACKAGE_NOT_FOUND_ERROR = "package.not.found.error" + private companion object { + private val CLASS_CONTEXT = "android.content.Context" + private val CLASS_FRAGMENT = "android.app.Fragment" + private val CLASS_SUPPORT_FRAGMENT = "android.support.v4.app.Fragment" + private val CLASS_VIEW = "android.view.View" + + private val GET_STRING_METHOD = "getString" + private val EXTRACT_RESOURCE_DIALOG_TITLE = "Extract Resource" + private val PACKAGE_NOT_FOUND_ERROR = "package.not.found.error" + } override fun isApplicableTo(element: KtLiteralStringTemplateEntry, caretOffset: Int): Boolean { if (AndroidFacet.getInstance(element.containingFile) == null) { return false } + // Should not be available to strings with template expressions + // only to strings with single KtLiteralStringTemplateEntry inside return element.parent.children.size == 1 } @@ -70,7 +77,7 @@ class KotlinAndroidAddStringResource : SelfTargetingIntention): Boolean { val descriptor = resolveToDescriptor() as FunctionDescriptor - val extendedTypeDescriptor = descriptor.extensionReceiverParameter?.type?.constructor?.declarationDescriptor as? ClassDescriptor + val extendedTypeDescriptor = descriptor.extensionReceiverParameter?.type?.constructor?.declarationDescriptor return extendedTypeDescriptor != null && baseClasses.any { extendedTypeDescriptor.isSubclassOf(it) } } @@ -197,7 +202,7 @@ class KotlinAndroidAddStringResource : SelfTargetingIntention -This intention extracts string literal to android resources. +This intention extracts string literal to Android resources. \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/genericContextExtensionFunction/expected/main.kt b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/genericContextExtensionFunction/expected/main.kt new file mode 100644 index 00000000000..fe59bd20421 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/genericContextExtensionFunction/expected/main.kt @@ -0,0 +1,5 @@ +package com.myapp + +import android.content.Context + +fun T.getText(): String? = getString(R.string.resource_id) diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/genericContextExtensionFunction/expected/res/values/strings.xml b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/genericContextExtensionFunction/expected/res/values/strings.xml new file mode 100644 index 00000000000..f52210bc2d5 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/genericContextExtensionFunction/expected/res/values/strings.xml @@ -0,0 +1,3 @@ + + some text + \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/genericContextExtensionFunction/genericContextExtensionFunction.test b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/genericContextExtensionFunction/genericContextExtensionFunction.test new file mode 100644 index 00000000000..8d736982924 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/genericContextExtensionFunction/genericContextExtensionFunction.test @@ -0,0 +1,5 @@ +{ + "rFile": "../../R.kt", + "resDirectory": "../../res", + "intentionClass": "org.jetbrains.kotlin.android.intentions.KotlinAndroidAddStringResource" +} \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/genericContextExtensionFunction/main.kt b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/genericContextExtensionFunction/main.kt new file mode 100644 index 00000000000..b60071fc3b1 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/genericContextExtensionFunction/main.kt @@ -0,0 +1,5 @@ +package com.myapp + +import android.content.Context + +fun T.getText(): String? = "some text"