diff --git a/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt b/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt index ec50ef73652..68e166d5485 100755 --- a/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt +++ b/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.AbstractDataFlowValueRenderingTest import org.jetbrains.kotlin.addImport.AbstractAddImportTest import org.jetbrains.kotlin.android.* import org.jetbrains.kotlin.android.configure.AbstractConfigureProjectTest +import org.jetbrains.kotlin.android.intentions.AbstractAndroidResourceIntentionTest import org.jetbrains.kotlin.annotation.AbstractAnnotationProcessorBoxTest import org.jetbrains.kotlin.annotation.processing.test.sourceRetention.AbstractBytecodeListingTestForSourceRetention import org.jetbrains.kotlin.annotation.processing.test.wrappers.AbstractAnnotationProcessingTest @@ -1153,6 +1154,10 @@ fun main(args: Array) { testClass() { model("configuration/android-gradle", pattern = """(\w+)_before\.gradle$""", testMethod = "doTestAndroidGradle") } + + testClass { + model("android/resourceIntentions", extension = "test", singleClass = true) + } } testGroup("plugins/plugins-tests/tests", "plugins/android-extensions/android-extensions-jps/testData") { diff --git a/idea/idea-android/idea-android.iml b/idea/idea-android/idea-android.iml index 2342de6914a..cab9a35a6e2 100644 --- a/idea/idea-android/idea-android.iml +++ b/idea/idea-android/idea-android.iml @@ -14,6 +14,7 @@ + diff --git a/idea/idea-android/src/org/jetbrains/kotlin/android/intentions/CreateXmlResourceParameters.kt b/idea/idea-android/src/org/jetbrains/kotlin/android/intentions/CreateXmlResourceParameters.kt new file mode 100644 index 00000000000..ffd0d46b20f --- /dev/null +++ b/idea/idea-android/src/org/jetbrains/kotlin/android/intentions/CreateXmlResourceParameters.kt @@ -0,0 +1,27 @@ +/* + * Copyright 2010-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.android.intentions + +import com.intellij.openapi.util.Key + + +val CREATE_XML_RESOURCE_PARAMETERS_NAME_KEY = Key("CREATE_XML_RESOURCE_PARAMETERS_NAME_KEY") + +class CreateXmlResourceParameters(val name: String, + val value: String, + val fileName: String, + val directoryNames: List) \ 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 new file mode 100644 index 00000000000..d2c50f10c8f --- /dev/null +++ b/idea/idea-android/src/org/jetbrains/kotlin/android/intentions/KotlinAndroidAddStringResource.kt @@ -0,0 +1,218 @@ +/* + * Copyright 2010-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.android.intentions + +import com.android.resources.ResourceType +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.idea.caches.resolve.analyze +import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor +import org.jetbrains.kotlin.idea.intentions.SelfTargetingIntention +import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe +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" + + override fun isApplicableTo(element: KtLiteralStringTemplateEntry, caretOffset: Int): Boolean { + if (AndroidFacet.getInstance(element.containingFile) == null) { + return false + } + + return element.parent.children.size == 1 + } + + override fun applyTo(element: KtLiteralStringTemplateEntry, editor: Editor?) { + val facet = AndroidFacet.getInstance(element.containingFile) + if (editor == null) { + throw IllegalArgumentException("This intention requires an editor.") + } + + if (facet == null) { + throw IllegalStateException("This intention requires android facet.") + } + + val file = element.containingFile + val project = file.project + + val manifestPackage = getManifestPackage(facet) + if (manifestPackage == null) { + Messages.showErrorDialog(project, AndroidBundle.message(PACKAGE_NOT_FOUND_ERROR), CommonBundle.getErrorTitle()) + return + } + + val parameters = getCreateXmlResourceParameters(facet.module, element) ?: + return + + if (!AndroidResourceUtil.createValueResource(facet.module, parameters.name, ResourceType.STRING, + parameters.fileName, parameters.directoryNames, parameters.value)) { + return + } + + createResourceReference(facet.module, editor, file, element, manifestPackage, parameters.name, ResourceType.STRING) + PsiDocumentManager.getInstance(project).commitAllDocuments() + UndoUtil.markPsiFileForUndo(file) + } + + private fun getCreateXmlResourceParameters(module: Module, element: KtLiteralStringTemplateEntry): CreateXmlResourceParameters? { + + val stringValue = element.text + + val showDialog = !ApplicationManager.getApplication().isUnitTestMode + val resourceName = element.getUserData(CREATE_XML_RESOURCE_PARAMETERS_NAME_KEY) + + val dialog = CreateXmlResourceDialog(module, ResourceType.STRING, resourceName, stringValue, true) + dialog.title = EXTRACT_RESOURCE_DIALOG_TITLE + if (showDialog && !dialog.showAndGet()) { + return null + } + + return CreateXmlResourceParameters(dialog.resourceName, + dialog.value, + dialog.fileName, + dialog.dirNames) + } + + private fun createResourceReference(module: Module, editor: Editor, file: PsiFile, element: PsiElement, aPackage: String, + resName: String, resType: ResourceType) { + val rFieldName = AndroidResourceUtil.getRJavaFieldName(resName) + val fieldName = "$aPackage.R.$resType.$rFieldName" + + val template: TemplateImpl + if (!needContextReceiver(element)) { + template = TemplateImpl("", "$GET_STRING_METHOD($fieldName)", "") + } + else { + template = TemplateImpl("", "\$context\$.$GET_STRING_METHOD($fieldName)", "") + val marker = MacroCallNode(VariableOfTypeMacro()) + marker.addParameter(ConstantNode("android.content.Context")) + template.addVariable("context", marker, ConstantNode("context"), true) + } + + val containingLiteralExpression = element.parent + editor.caretModel.moveToOffset(containingLiteralExpression.textOffset) + editor.document.deleteString(containingLiteralExpression.textRange.startOffset, containingLiteralExpression.textRange.endOffset) + val marker = editor.document.createRangeMarker(containingLiteralExpression.textOffset, containingLiteralExpression.textOffset) + marker.isGreedyToLeft = true + marker.isGreedyToRight = true + + TemplateManager.getInstance(module.project).startTemplate(editor, template, false, null, object : TemplateEditingAdapter() { + override fun waitingForInput(template: Template?) { + JavaCodeStyleManager.getInstance(module.project).shortenClassReferences(file, marker.startOffset, marker.endOffset) + } + + override fun beforeTemplateFinished(state: TemplateState?, template: Template?) { + JavaCodeStyleManager.getInstance(module.project).shortenClassReferences(file, marker.startOffset, marker.endOffset) + } + }) + } + + private fun needContextReceiver(element: PsiElement): Boolean { + val classesWithGetSting = listOf("android.content.Context", "android.app.Fragment", "android.support.v4.app.Fragment") + val viewClass = listOf("android.view.View") + var parent = PsiTreeUtil.findFirstParent(element, true) { it is KtClassOrObject || it is KtFunction || it is KtLambdaExpression } + + while (parent != null) { + + if (parent.isSubclassOrSubclassExtension(classesWithGetSting)) { + return false + } + + if (parent.isSubclassOrSubclassExtension(viewClass) || + (parent is KtClassOrObject && !parent.isInnerClass() && !parent.isObjectLiteral())) { + return true + } + + parent = PsiTreeUtil.findFirstParent(parent, true) { it is KtClassOrObject || it is KtFunction || it is KtLambdaExpression } + } + + return true + } + + private fun getManifestPackage(facet: AndroidFacet) = facet.manifest?.`package`?.value + + private fun PsiElement.isSubclassOrSubclassExtension(baseClasses: Collection) = + (this as? KtClassOrObject)?.isSubclassOfAny(baseClasses) ?: + this.isSubclassExtensionOfAny(baseClasses) + + private fun PsiElement.isSubclassExtensionOfAny(baseClasses: Collection) = + (this as? KtLambdaExpression)?.isSubclassExtensionOfAny(baseClasses) ?: + (this as? KtFunction)?.isSubclassExtensionOfAny(baseClasses) ?: + false + + private fun KtClassOrObject.isObjectLiteral() = (this as? KtObjectDeclaration)?.isObjectLiteral() ?: false + + private fun KtClassOrObject.isInnerClass() = (this as? KtClass)?.isInner() ?: false + + private fun KtFunction.isSubclassExtensionOfAny(baseClasses: Collection): Boolean { + val descriptor = resolveToDescriptor() as FunctionDescriptor + val extendedTypeDescriptor = descriptor.extensionReceiverParameter?.type?.constructor?.declarationDescriptor as? ClassDescriptor + return extendedTypeDescriptor != null && baseClasses.any { extendedTypeDescriptor.isSubclassOf(it) } + } + + private fun KtLambdaExpression.isSubclassExtensionOfAny(baseClasses: Collection): Boolean { + val bindingContext = analyze(BodyResolveMode.PARTIAL) + val type = bindingContext.getType(this) + + if (type == null || !type.isExtensionFunctionType) { + return false + } + + val extendedTypeDescriptor = type.arguments.first().type.constructor.declarationDescriptor + if (extendedTypeDescriptor is ClassDescriptor) { + return baseClasses.any { extendedTypeDescriptor.isSubclassOf(it) } + } + + return false + } + + private fun KtClassOrObject.isSubclassOfAny(baseClasses: Collection): Boolean { + val bindingContext = analyze(BodyResolveMode.PARTIAL) + val declarationDescriptor = bindingContext.get(BindingContext.CLASS, this) + return baseClasses.any { declarationDescriptor?.isSubclassOf(it) ?: false } + } + + private fun ClassDescriptor.isSubclassOf(className: String): Boolean { + return fqNameSafe.asString() == className || defaultType.constructor.supertypes.any { + (it.constructor.declarationDescriptor as? ClassDescriptor)?.isSubclassOf(className) ?: false + } + } +} \ No newline at end of file diff --git a/plugins/android-extensions/android-extensions-idea/tests/org/jetbrains/kotlin/android/KotlinAndroidTestCase.java b/idea/idea-android/tests/org/jetbrains/kotlin/android/KotlinAndroidTestCase.java similarity index 100% rename from plugins/android-extensions/android-extensions-idea/tests/org/jetbrains/kotlin/android/KotlinAndroidTestCase.java rename to idea/idea-android/tests/org/jetbrains/kotlin/android/KotlinAndroidTestCase.java diff --git a/plugins/android-extensions/android-extensions-idea/tests/org/jetbrains/kotlin/android/KotlinAndroidTestCaseBase.java b/idea/idea-android/tests/org/jetbrains/kotlin/android/KotlinAndroidTestCaseBase.java similarity index 100% rename from plugins/android-extensions/android-extensions-idea/tests/org/jetbrains/kotlin/android/KotlinAndroidTestCaseBase.java rename to idea/idea-android/tests/org/jetbrains/kotlin/android/KotlinAndroidTestCaseBase.java diff --git a/idea/idea-android/tests/org/jetbrains/kotlin/android/intentions/AbstractAndroidResourceIntentionTest.kt b/idea/idea-android/tests/org/jetbrains/kotlin/android/intentions/AbstractAndroidResourceIntentionTest.kt new file mode 100644 index 00000000000..524d67369a7 --- /dev/null +++ b/idea/idea-android/tests/org/jetbrains/kotlin/android/intentions/AbstractAndroidResourceIntentionTest.kt @@ -0,0 +1,104 @@ +/* + * Copyright 2010-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.android.intentions + +import com.android.SdkConstants +import com.google.gson.JsonObject +import com.google.gson.JsonParser +import com.intellij.codeInsight.intention.IntentionAction +import com.intellij.openapi.fileEditor.FileDocumentManager +import com.intellij.openapi.util.io.FileUtil +import com.intellij.openapi.vfs.LocalFileSystem +import com.intellij.testFramework.PlatformTestUtil +import com.intellij.util.PathUtil +import junit.framework.TestCase +import org.jetbrains.kotlin.android.KotlinAndroidTestCase +import org.jetbrains.kotlin.idea.jsonUtils.getString +import org.jetbrains.kotlin.idea.test.DirectiveBasedActionUtils +import org.jetbrains.kotlin.psi.KtFile +import java.io.File + + +abstract class AbstractAndroidResourceIntentionTest : KotlinAndroidTestCase() { + + fun doTest(path: String) { + val configFile = File(path) + val testDataPath = configFile.parent + + myFixture.testDataPath = testDataPath + + val config = JsonParser().parse(FileUtil.loadFile(File(path), true)) as JsonObject + + val intentionClass = config.getString("intentionClass") + val isApplicableExpected = if (config.has("isApplicable")) config.get("isApplicable").asBoolean else true + val rFile = if (config.has("rFile")) config.get("rFile").asString else null + val resDirectory = if (config.has("resDirectory")) config.get("resDirectory").asString else null + + if (rFile != null) { + myFixture.copyFileToProject(rFile, "gen/" + PathUtil.getFileName(rFile)) + } + else { + if (File(testDataPath + "/R.java").isFile) { + myFixture.copyFileToProject("R.java", "gen/R.java") + } + } + + if (resDirectory != null) { + myFixture.copyDirectoryToProject(resDirectory, "res") + } + else { + if (File(testDataPath + "/res").isDirectory) { + myFixture.copyDirectoryToProject("res", "res") + } + } + + val sourceFile = myFixture.copyFileToProject("main.kt", "src/main.kt") + myFixture.configureFromExistingVirtualFile(sourceFile) + + DirectiveBasedActionUtils.checkForUnexpectedErrors(myFixture.file as KtFile) + + val intentionAction = Class.forName(intentionClass).newInstance() as IntentionAction + + TestCase.assertEquals(isApplicableExpected, intentionAction.isAvailable(myFixture.project, myFixture.editor, myFixture.file)) + if (!isApplicableExpected) { + return + } + + val element = getTargetElement() + element?.putUserData(CREATE_XML_RESOURCE_PARAMETERS_NAME_KEY, "resource_id") + + myFixture.launchAction(intentionAction) + + FileDocumentManager.getInstance().saveAllDocuments() + DirectiveBasedActionUtils.checkForUnexpectedErrors(myFixture.file as KtFile) + + myFixture.checkResultByFile("/expected/main.kt") + assertResourcesEqual(testDataPath + "/expected/res") + } + + fun assertResourcesEqual(expectedPath: String) { + PlatformTestUtil.assertDirectoriesEqual(LocalFileSystem.getInstance().findFileByPath(expectedPath), getResourceDirectory()) + } + + fun getResourceDirectory() = LocalFileSystem.getInstance().findFileByPath(myFixture.tempDirPath + "/res") + + fun getTargetElement() = myFixture.file.findElementAt(myFixture.caretOffset)?.parent + + override fun createManifest() { + myFixture.copyFileToProject("idea/testData/android/AndroidManifest.xml", SdkConstants.FN_ANDROID_MANIFEST_XML) + } +} \ No newline at end of file diff --git a/idea/idea-android/tests/org/jetbrains/kotlin/android/intentions/AndroidResourceIntentionTestGenerated.java b/idea/idea-android/tests/org/jetbrains/kotlin/android/intentions/AndroidResourceIntentionTestGenerated.java new file mode 100644 index 00000000000..31fea7da9dc --- /dev/null +++ b/idea/idea-android/tests/org/jetbrains/kotlin/android/intentions/AndroidResourceIntentionTestGenerated.java @@ -0,0 +1,115 @@ +/* + * Copyright 2010-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.android.intentions; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; +import org.jetbrains.kotlin.test.KotlinTestUtils; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.runner.RunWith; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("idea/testData/android/resourceIntentions") +@TestDataPath("$PROJECT_ROOT") +@RunWith(JUnit3RunnerWithInners.class) +public class AndroidResourceIntentionTestGenerated extends AbstractAndroidResourceIntentionTest { + public void testAllFilesPresentInResourceIntentions() throws Exception { + KotlinTestUtils.assertAllTestsPresentInSingleGeneratedClass(this.getClass(), new File("idea/testData/android/resourceIntentions"), Pattern.compile("^(.+)\\.test$")); + } + + @TestMetadata("kotlinAndroidAddStringResource/activityExtension/activityExtension.test") + public void testKotlinAndroidAddStringResource_activityExtension_ActivityExtension() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/activityExtension/activityExtension.test"); + doTest(fileName); + } + + @TestMetadata("kotlinAndroidAddStringResource/activityMethod/activityMethod.test") + public void testKotlinAndroidAddStringResource_activityMethod_ActivityMethod() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/activityMethod/activityMethod.test"); + doTest(fileName); + } + + @TestMetadata("kotlinAndroidAddStringResource/classInActivity/classInActivity.test") + public void testKotlinAndroidAddStringResource_classInActivity_ClassInActivity() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/classInActivity/classInActivity.test"); + doTest(fileName); + } + + @TestMetadata("kotlinAndroidAddStringResource/extensionLambda/extensionLambda.test") + public void testKotlinAndroidAddStringResource_extensionLambda_ExtensionLambda() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/extensionLambda/extensionLambda.test"); + doTest(fileName); + } + + @TestMetadata("kotlinAndroidAddStringResource/function/function.test") + public void testKotlinAndroidAddStringResource_function_Function() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/function/function.test"); + doTest(fileName); + } + + @TestMetadata("kotlinAndroidAddStringResource/innerClassInActivity/innerClassInActivity.test") + public void testKotlinAndroidAddStringResource_innerClassInActivity_InnerClassInActivity() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/innerClassInActivity/innerClassInActivity.test"); + doTest(fileName); + } + + @TestMetadata("kotlinAndroidAddStringResource/innerViewInActivity/innerViewInActivity.test") + public void testKotlinAndroidAddStringResource_innerViewInActivity_InnerViewInActivity() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/innerViewInActivity/innerViewInActivity.test"); + doTest(fileName); + } + + @TestMetadata("kotlinAndroidAddStringResource/objectInActivity/objectInActivity.test") + public void testKotlinAndroidAddStringResource_objectInActivity_ObjectInActivity() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInActivity/objectInActivity.test"); + doTest(fileName); + } + + @TestMetadata("kotlinAndroidAddStringResource/objectInActivityMethod/objectInActivityMethod.test") + public void testKotlinAndroidAddStringResource_objectInActivityMethod_ObjectInActivityMethod() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInActivityMethod/objectInActivityMethod.test"); + doTest(fileName); + } + + @TestMetadata("kotlinAndroidAddStringResource/objectInFunction/objectInFunction.test") + public void testKotlinAndroidAddStringResource_objectInFunction_ObjectInFunction() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInFunction/objectInFunction.test"); + doTest(fileName); + } + + @TestMetadata("kotlinAndroidAddStringResource/stringTemplate/stringTemplate.test") + public void testKotlinAndroidAddStringResource_stringTemplate_StringTemplate() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/stringTemplate/stringTemplate.test"); + doTest(fileName); + } + + @TestMetadata("kotlinAndroidAddStringResource/viewExtensionActivityMethod/viewExtensionActivityMethod.test") + public void testKotlinAndroidAddStringResource_viewExtensionActivityMethod_ViewExtensionActivityMethod() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/viewExtensionActivityMethod/viewExtensionActivityMethod.test"); + doTest(fileName); + } + + @TestMetadata("kotlinAndroidAddStringResource/viewMethod/viewMethod.test") + public void testKotlinAndroidAddStringResource_viewMethod_ViewMethod() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/viewMethod/viewMethod.test"); + doTest(fileName); + } +} diff --git a/idea/resources/intentionDescriptions/KotlinAndroidAddStringResource/after.kt.template b/idea/resources/intentionDescriptions/KotlinAndroidAddStringResource/after.kt.template new file mode 100644 index 00000000000..56d6c20a907 --- /dev/null +++ b/idea/resources/intentionDescriptions/KotlinAndroidAddStringResource/after.kt.template @@ -0,0 +1 @@ +title = getString(R.string.some_text) \ No newline at end of file diff --git a/idea/resources/intentionDescriptions/KotlinAndroidAddStringResource/before.kt.template b/idea/resources/intentionDescriptions/KotlinAndroidAddStringResource/before.kt.template new file mode 100644 index 00000000000..90fd04c25a5 --- /dev/null +++ b/idea/resources/intentionDescriptions/KotlinAndroidAddStringResource/before.kt.template @@ -0,0 +1 @@ +title = "Some Text" \ No newline at end of file diff --git a/idea/resources/intentionDescriptions/KotlinAndroidAddStringResource/description.html b/idea/resources/intentionDescriptions/KotlinAndroidAddStringResource/description.html new file mode 100644 index 00000000000..c45cec3a9ea --- /dev/null +++ b/idea/resources/intentionDescriptions/KotlinAndroidAddStringResource/description.html @@ -0,0 +1,5 @@ + + +This intention extracts string literal to android resources. + + \ No newline at end of file diff --git a/idea/src/META-INF/android.xml b/idea/src/META-INF/android.xml index 64a80fb1e3f..03e13c3f868 100644 --- a/idea/src/META-INF/android.xml +++ b/idea/src/META-INF/android.xml @@ -17,6 +17,12 @@ level="ERROR"/> + + + org.jetbrains.kotlin.android.intentions.KotlinAndroidAddStringResource + Kotlin Android + + diff --git a/idea/testData/android/AndroidManifest.xml b/idea/testData/android/AndroidManifest.xml new file mode 100644 index 00000000000..c82007dcc87 --- /dev/null +++ b/idea/testData/android/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/R.kt b/idea/testData/android/resourceIntentions/R.kt new file mode 100644 index 00000000000..3e7e62acca1 --- /dev/null +++ b/idea/testData/android/resourceIntentions/R.kt @@ -0,0 +1,8 @@ +package com.myapp + +class R { + object string { + val app_name = 0x7f060021 + val resource_id = 0x7f060022 + } +} \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/activityExtension/activityExtension.test b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/activityExtension/activityExtension.test new file mode 100644 index 00000000000..8d736982924 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/activityExtension/activityExtension.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/activityExtension/expected/main.kt b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/activityExtension/expected/main.kt new file mode 100644 index 00000000000..c5679967271 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/activityExtension/expected/main.kt @@ -0,0 +1,7 @@ +package com.myapp + +import android.app.Activity + +fun Activity.getSomeText() { + getString(R.string.resource_id) +} \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/activityExtension/expected/res/values/strings.xml b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/activityExtension/expected/res/values/strings.xml new file mode 100644 index 00000000000..f52210bc2d5 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/activityExtension/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/activityExtension/main.kt b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/activityExtension/main.kt new file mode 100644 index 00000000000..cef92db176b --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/activityExtension/main.kt @@ -0,0 +1,7 @@ +package com.myapp + +import android.app.Activity + +fun Activity.getSomeText() { + "some text" +} \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/activityMethod/activityMethod.test b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/activityMethod/activityMethod.test new file mode 100644 index 00000000000..8d736982924 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/activityMethod/activityMethod.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/activityMethod/expected/main.kt b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/activityMethod/expected/main.kt new file mode 100644 index 00000000000..c838d28918b --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/activityMethod/expected/main.kt @@ -0,0 +1,9 @@ +package com.myapp + +import android.app.Activity + +class MyActivity: Activity() { + fun foo() { + val a = getString(R.string.resource_id) + } +} \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/activityMethod/expected/res/values/strings.xml b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/activityMethod/expected/res/values/strings.xml new file mode 100644 index 00000000000..02d4f0efd8d --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/activityMethod/expected/res/values/strings.xml @@ -0,0 +1,3 @@ + + some string + \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/activityMethod/main.kt b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/activityMethod/main.kt new file mode 100644 index 00000000000..3e95c03aeea --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/activityMethod/main.kt @@ -0,0 +1,9 @@ +package com.myapp + +import android.app.Activity + +class MyActivity: Activity() { + fun foo() { + val a = "some string" + } +} \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/classInActivity/classInActivity.test b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/classInActivity/classInActivity.test new file mode 100644 index 00000000000..8d736982924 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/classInActivity/classInActivity.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/classInActivity/expected/main.kt b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/classInActivity/expected/main.kt new file mode 100644 index 00000000000..da1222ce83b --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/classInActivity/expected/main.kt @@ -0,0 +1,12 @@ +package com.myapp + +import android.app.Activity +import android.content.Context + +class MyActivity: Activity() { + class Helper { + fun test(context: Context) { + val b = context.getString(R.string.resource_id) + } + } +} \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/classInActivity/expected/res/values/strings.xml b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/classInActivity/expected/res/values/strings.xml new file mode 100644 index 00000000000..02d4f0efd8d --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/classInActivity/expected/res/values/strings.xml @@ -0,0 +1,3 @@ + + some string + \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/classInActivity/main.kt b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/classInActivity/main.kt new file mode 100644 index 00000000000..4ceb4e8db08 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/classInActivity/main.kt @@ -0,0 +1,12 @@ +package com.myapp + +import android.app.Activity +import android.content.Context + +class MyActivity: Activity() { + class Helper { + fun test(context: Context) { + val b = "some string" + } + } +} \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/extensionLambda/expected/main.kt b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/extensionLambda/expected/main.kt new file mode 100644 index 00000000000..7714f5c08d6 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/extensionLambda/expected/main.kt @@ -0,0 +1,13 @@ +package com.myapp + +import android.content.Context + +fun foo(context: Context) { + with (context) { + with (2) { + getString(R.string.resource_id) + } + } +} + +inline fun with(receiver: T, block: T.() -> R): R = receiver.block() diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/extensionLambda/expected/res/values/strings.xml b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/extensionLambda/expected/res/values/strings.xml new file mode 100644 index 00000000000..6a9b93e0f5b --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/extensionLambda/expected/res/values/strings.xml @@ -0,0 +1,3 @@ + + zxc + \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/extensionLambda/extensionLambda.test b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/extensionLambda/extensionLambda.test new file mode 100644 index 00000000000..8d736982924 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/extensionLambda/extensionLambda.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/extensionLambda/main.kt b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/extensionLambda/main.kt new file mode 100644 index 00000000000..f9b756355a2 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/extensionLambda/main.kt @@ -0,0 +1,13 @@ +package com.myapp + +import android.content.Context + +fun foo(context: Context) { + with (context) { + with (2) { + "zxc" + } + } +} + +inline fun with(receiver: T, block: T.() -> R): R = receiver.block() diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/function/expected/main.kt b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/function/expected/main.kt new file mode 100644 index 00000000000..0fa132d1d2d --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/function/expected/main.kt @@ -0,0 +1,7 @@ +package com.myapp + +import android.content.Context + +fun getSomeText(context: Context) { + context.getString(R.string.resource_id) +} \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/function/expected/res/values/strings.xml b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/function/expected/res/values/strings.xml new file mode 100644 index 00000000000..f52210bc2d5 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/function/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/function/function.test b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/function/function.test new file mode 100644 index 00000000000..8d736982924 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/function/function.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/function/main.kt b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/function/main.kt new file mode 100644 index 00000000000..ed90ab0d987 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/function/main.kt @@ -0,0 +1,7 @@ +package com.myapp + +import android.content.Context + +fun getSomeText(context: Context) { + "some text" +} \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/innerClassInActivity/expected/main.kt b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/innerClassInActivity/expected/main.kt new file mode 100644 index 00000000000..9295748ed31 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/innerClassInActivity/expected/main.kt @@ -0,0 +1,13 @@ +package com.myapp + +import android.app.Activity + +class MyActivity: Activity() { + inner class Helper { + fun a(): String = "q" + + inner class HelperOfHelper { + fun b(): String = getString(R.string.resource_id) + } + } +} \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/innerClassInActivity/expected/res/values/strings.xml b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/innerClassInActivity/expected/res/values/strings.xml new file mode 100644 index 00000000000..02d4f0efd8d --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/innerClassInActivity/expected/res/values/strings.xml @@ -0,0 +1,3 @@ + + some string + \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/innerClassInActivity/innerClassInActivity.test b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/innerClassInActivity/innerClassInActivity.test new file mode 100644 index 00000000000..8d736982924 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/innerClassInActivity/innerClassInActivity.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/innerClassInActivity/main.kt b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/innerClassInActivity/main.kt new file mode 100644 index 00000000000..12f8711567c --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/innerClassInActivity/main.kt @@ -0,0 +1,13 @@ +package com.myapp + +import android.app.Activity + +class MyActivity: Activity() { + inner class Helper { + fun a(): String = "q" + + inner class HelperOfHelper { + fun b(): String = "some string" + } + } +} \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/innerViewInActivity/expected/main.kt b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/innerViewInActivity/expected/main.kt new file mode 100644 index 00000000000..7afa3bdf3c5 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/innerViewInActivity/expected/main.kt @@ -0,0 +1,13 @@ +package com.myapp + +import android.app.Activity +import android.content.Context +import android.view.View + +class MyActivity: Activity() { + inner class SubView constructor(context: Context): View(context) { + fun test() { + val b = context.getString(R.string.resource_id) + } + } +} \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/innerViewInActivity/expected/res/values/strings.xml b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/innerViewInActivity/expected/res/values/strings.xml new file mode 100644 index 00000000000..02d4f0efd8d --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/innerViewInActivity/expected/res/values/strings.xml @@ -0,0 +1,3 @@ + + some string + \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/innerViewInActivity/innerViewInActivity.test b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/innerViewInActivity/innerViewInActivity.test new file mode 100644 index 00000000000..8d736982924 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/innerViewInActivity/innerViewInActivity.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/innerViewInActivity/main.kt b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/innerViewInActivity/main.kt new file mode 100644 index 00000000000..ef622aa569f --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/innerViewInActivity/main.kt @@ -0,0 +1,13 @@ +package com.myapp + +import android.app.Activity +import android.content.Context +import android.view.View + +class MyActivity: Activity() { + inner class SubView constructor(context: Context): View(context) { + fun test() { + val b = "some string" + } + } +} \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInActivity/expected/main.kt b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInActivity/expected/main.kt new file mode 100644 index 00000000000..3b128fd8b43 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInActivity/expected/main.kt @@ -0,0 +1,12 @@ +package com.myapp + +import android.app.Activity +import android.content.Context + +class MyActivity: Activity() { + object A { + fun doSomething(context: Context) { + context.getString(R.string.resource_id) + } + } +} \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInActivity/expected/res/values/strings.xml b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInActivity/expected/res/values/strings.xml new file mode 100644 index 00000000000..02d4f0efd8d --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInActivity/expected/res/values/strings.xml @@ -0,0 +1,3 @@ + + some string + \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInActivity/main.kt b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInActivity/main.kt new file mode 100644 index 00000000000..57786293312 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInActivity/main.kt @@ -0,0 +1,12 @@ +package com.myapp + +import android.app.Activity +import android.content.Context + +class MyActivity: Activity() { + object A { + fun doSomething(context: Context) { + "some string" + } + } +} \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInActivity/objectInActivity.test b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInActivity/objectInActivity.test new file mode 100644 index 00000000000..8d736982924 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInActivity/objectInActivity.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/objectInActivityMethod/expected/main.kt b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInActivityMethod/expected/main.kt new file mode 100644 index 00000000000..e5b19068b96 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInActivityMethod/expected/main.kt @@ -0,0 +1,11 @@ +package com.myapp + +import android.app.Activity + +class MyActivity: Activity() { + fun foo() { + object { + val text = getString(R.string.resource_id) + } + } +} \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInActivityMethod/expected/res/values/strings.xml b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInActivityMethod/expected/res/values/strings.xml new file mode 100644 index 00000000000..02d4f0efd8d --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInActivityMethod/expected/res/values/strings.xml @@ -0,0 +1,3 @@ + + some string + \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInActivityMethod/main.kt b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInActivityMethod/main.kt new file mode 100644 index 00000000000..aafaf30cddc --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInActivityMethod/main.kt @@ -0,0 +1,11 @@ +package com.myapp + +import android.app.Activity + +class MyActivity: Activity() { + fun foo() { + object { + val text = "some string" + } + } +} \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInActivityMethod/objectInActivityMethod.test b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInActivityMethod/objectInActivityMethod.test new file mode 100644 index 00000000000..8d736982924 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInActivityMethod/objectInActivityMethod.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/objectInFunction/expected/main.kt b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInFunction/expected/main.kt new file mode 100644 index 00000000000..8f24695dd54 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInFunction/expected/main.kt @@ -0,0 +1,10 @@ +package com.myapp + +import android.app.Activity +import android.content.Context + +fun foo(context: Context) { + object { + val text = context.getString(R.string.resource_id) + } +} \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInFunction/expected/res/values/strings.xml b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInFunction/expected/res/values/strings.xml new file mode 100644 index 00000000000..02d4f0efd8d --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInFunction/expected/res/values/strings.xml @@ -0,0 +1,3 @@ + + some string + \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInFunction/main.kt b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInFunction/main.kt new file mode 100644 index 00000000000..3b4a04cb6a4 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInFunction/main.kt @@ -0,0 +1,10 @@ +package com.myapp + +import android.app.Activity +import android.content.Context + +fun foo(context: Context) { + object { + val text = "some string" + } +} \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInFunction/objectInFunction.test b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInFunction/objectInFunction.test new file mode 100644 index 00000000000..8d736982924 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/objectInFunction/objectInFunction.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/stringTemplate/main.kt b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/stringTemplate/main.kt new file mode 100644 index 00000000000..44468221839 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/stringTemplate/main.kt @@ -0,0 +1,5 @@ +fun foo() { + val a = "some" + val b = "text" + val bar = "$a + $b" +} \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/stringTemplate/stringTemplate.test b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/stringTemplate/stringTemplate.test new file mode 100644 index 00000000000..caafa4f8945 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/stringTemplate/stringTemplate.test @@ -0,0 +1,4 @@ +{ + "intentionClass": "org.jetbrains.kotlin.android.intentions.KotlinAndroidAddStringResource", + "isApplicable": false +} \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/viewExtensionActivityMethod/expected/main.kt b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/viewExtensionActivityMethod/expected/main.kt new file mode 100644 index 00000000000..e090304ea70 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/viewExtensionActivityMethod/expected/main.kt @@ -0,0 +1,10 @@ +package com.myapp + +import android.app.Activity +import android.view.View + +class MyActivity: Activity() { + fun View.foo() { + val a = context.getString(R.string.resource_id) + } +} \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/viewExtensionActivityMethod/expected/res/values/strings.xml b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/viewExtensionActivityMethod/expected/res/values/strings.xml new file mode 100644 index 00000000000..02d4f0efd8d --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/viewExtensionActivityMethod/expected/res/values/strings.xml @@ -0,0 +1,3 @@ + + some string + \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/viewExtensionActivityMethod/main.kt b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/viewExtensionActivityMethod/main.kt new file mode 100644 index 00000000000..6b21c586a30 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/viewExtensionActivityMethod/main.kt @@ -0,0 +1,10 @@ +package com.myapp + +import android.app.Activity +import android.view.View + +class MyActivity: Activity() { + fun View.foo() { + val a = "some string" + } +} \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/viewExtensionActivityMethod/viewExtensionActivityMethod.test b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/viewExtensionActivityMethod/viewExtensionActivityMethod.test new file mode 100644 index 00000000000..8d736982924 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/viewExtensionActivityMethod/viewExtensionActivityMethod.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/viewMethod/expected/main.kt b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/viewMethod/expected/main.kt new file mode 100644 index 00000000000..b5880da88ce --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/viewMethod/expected/main.kt @@ -0,0 +1,10 @@ +package com.myapp + +import android.content.Context +import android.view.View + +class DemoView constructor(context: Context): View(context) { + fun test() { + val b = context.getString(R.string.resource_id) + } +} \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/viewMethod/expected/res/values/strings.xml b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/viewMethod/expected/res/values/strings.xml new file mode 100644 index 00000000000..02d4f0efd8d --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/viewMethod/expected/res/values/strings.xml @@ -0,0 +1,3 @@ + + some string + \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/viewMethod/main.kt b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/viewMethod/main.kt new file mode 100644 index 00000000000..1d281d60e63 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/viewMethod/main.kt @@ -0,0 +1,10 @@ +package com.myapp + +import android.content.Context +import android.view.View + +class DemoView constructor(context: Context): View(context) { + fun test() { + val b = "some string" + } +} \ No newline at end of file diff --git a/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/viewMethod/viewMethod.test b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/viewMethod/viewMethod.test new file mode 100644 index 00000000000..8d736982924 --- /dev/null +++ b/idea/testData/android/resourceIntentions/kotlinAndroidAddStringResource/viewMethod/viewMethod.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/res/values/strings.xml b/idea/testData/android/resourceIntentions/res/values/strings.xml new file mode 100644 index 00000000000..e5f8fdc2aa9 --- /dev/null +++ b/idea/testData/android/resourceIntentions/res/values/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file