diff --git a/idea/idea-android/src/org/jetbrains/kotlin/android/intention/KotlinAndroidAddStringResource.kt b/idea/idea-android/src/org/jetbrains/kotlin/android/intention/KotlinAndroidAddStringResource.kt index b64001e7c9c..4e1fbb253c4 100644 --- a/idea/idea-android/src/org/jetbrains/kotlin/android/intention/KotlinAndroidAddStringResource.kt +++ b/idea/idea-android/src/org/jetbrains/kotlin/android/intention/KotlinAndroidAddStringResource.kt @@ -54,6 +54,7 @@ class KotlinAndroidAddStringResource : SelfTargetingIntention { + AndroidContainerType.ACTIVITY, AndroidContainerType.ANDROIDX_SUPPORT_FRAGMENT_ACTIVITY, AndroidContainerType.SUPPORT_FRAGMENT_ACTIVITY, AndroidContainerType.VIEW, AndroidContainerType.DIALOG -> { loadId() iv.invokevirtual(containerType.internalClassName, "findViewById", "(I)Landroid/view/View;", false) } - AndroidContainerType.FRAGMENT, AndroidContainerType.SUPPORT_FRAGMENT, LAYOUT_CONTAINER -> { + AndroidContainerType.FRAGMENT, AndroidContainerType.ANDROIDX_SUPPORT_FRAGMENT, AndroidContainerType.SUPPORT_FRAGMENT, LAYOUT_CONTAINER -> { if (containerType == LAYOUT_CONTAINER) { iv.invokeinterface(containerType.internalClassName, "getContainerView", "()Landroid/view/View;") } else { diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/codegen/AndroidContainerType.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/codegen/AndroidContainerType.kt index fed9f8e1e27..6c3c367739c 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/codegen/AndroidContainerType.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/codegen/AndroidContainerType.kt @@ -25,6 +25,8 @@ enum class AndroidContainerType(className: String, val doesSupportCache: Boolean ACTIVITY(AndroidConst.ACTIVITY_FQNAME, doesSupportCache = true), FRAGMENT(AndroidConst.FRAGMENT_FQNAME, doesSupportCache = true, isFragment = true), DIALOG(AndroidConst.DIALOG_FQNAME, doesSupportCache = false), + ANDROIDX_SUPPORT_FRAGMENT_ACTIVITY(AndroidConst.ANDROIDX_SUPPORT_FRAGMENT_ACTIVITY_FQNAME, doesSupportCache = true), + ANDROIDX_SUPPORT_FRAGMENT(AndroidConst.ANDROIDX_SUPPORT_FRAGMENT_FQNAME, doesSupportCache = true, isFragment = true), SUPPORT_FRAGMENT_ACTIVITY(AndroidConst.SUPPORT_FRAGMENT_ACTIVITY_FQNAME, doesSupportCache = true), SUPPORT_FRAGMENT(AndroidConst.SUPPORT_FRAGMENT_FQNAME, doesSupportCache = true, isFragment = true), VIEW(AndroidConst.VIEW_FQNAME, doesSupportCache = true), @@ -41,6 +43,8 @@ enum class AndroidContainerType(className: String, val doesSupportCache: Boolean AndroidConst.ACTIVITY_FQNAME -> AndroidContainerType.ACTIVITY AndroidConst.FRAGMENT_FQNAME -> AndroidContainerType.FRAGMENT AndroidConst.DIALOG_FQNAME -> AndroidContainerType.DIALOG + AndroidConst.ANDROIDX_SUPPORT_FRAGMENT_ACTIVITY_FQNAME -> AndroidContainerType.ANDROIDX_SUPPORT_FRAGMENT_ACTIVITY + AndroidConst.ANDROIDX_SUPPORT_FRAGMENT_FQNAME -> AndroidContainerType.ANDROIDX_SUPPORT_FRAGMENT AndroidConst.SUPPORT_FRAGMENT_ACTIVITY_FQNAME -> AndroidContainerType.SUPPORT_FRAGMENT_ACTIVITY AndroidConst.SUPPORT_FRAGMENT_FQNAME -> AndroidContainerType.SUPPORT_FRAGMENT AndroidConst.VIEW_FQNAME -> AndroidContainerType.VIEW diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/codegen/ResourcePropertyStackValue.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/codegen/ResourcePropertyStackValue.kt index b3a345b4273..16b729ddeb1 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/codegen/ResourcePropertyStackValue.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/codegen/ResourcePropertyStackValue.kt @@ -38,7 +38,7 @@ class ResourcePropertyStackValue( override fun putSelector(type: Type, kotlinType: KotlinType?, v: InstructionAdapter) { val returnTypeString = typeMapper.mapType(resource.type.lowerIfFlexible()).className - if (AndroidConst.FRAGMENT_FQNAME == returnTypeString || AndroidConst.SUPPORT_FRAGMENT_FQNAME == returnTypeString) { + if (AndroidConst.FRAGMENT_FQNAME == returnTypeString || AndroidConst.SUPPORT_FRAGMENT_FQNAME == returnTypeString || AndroidConst.ANDROIDX_SUPPORT_FRAGMENT_FQNAME == returnTypeString) { return putSelectorForFragment(v) } @@ -56,12 +56,12 @@ class ResourcePropertyStackValue( } else { when (containerType) { - AndroidContainerType.ACTIVITY, AndroidContainerType.SUPPORT_FRAGMENT_ACTIVITY, AndroidContainerType.VIEW, AndroidContainerType.DIALOG -> { + AndroidContainerType.ACTIVITY, AndroidContainerType.ANDROIDX_SUPPORT_FRAGMENT_ACTIVITY, AndroidContainerType.SUPPORT_FRAGMENT_ACTIVITY, AndroidContainerType.VIEW, AndroidContainerType.DIALOG -> { receiver.put(Type.getType("L${containerType.internalClassName};"), v) getResourceId(v) v.invokevirtual(containerType.internalClassName, "findViewById", "(I)Landroid/view/View;", false) } - AndroidContainerType.FRAGMENT, AndroidContainerType.SUPPORT_FRAGMENT -> { + AndroidContainerType.FRAGMENT, AndroidContainerType.ANDROIDX_SUPPORT_FRAGMENT, AndroidContainerType.SUPPORT_FRAGMENT -> { receiver.put(Type.getType("L${containerType.internalClassName};"), v) v.invokevirtual(containerType.internalClassName, "getView", "()Landroid/view/View;", false) getResourceId(v) @@ -99,6 +99,16 @@ class ResourcePropertyStackValue( getResourceId(v) v.invokevirtual("android/support/v4/app/FragmentManager", "findFragmentById", "(I)Landroid/support/v4/app/Fragment;", false) } + AndroidContainerType.ANDROIDX_SUPPORT_FRAGMENT -> { + v.invokevirtual(containerType.internalClassName, "getFragmentManager", "()Landroidx/fragment/app/FragmentManager;", false) + getResourceId(v) + v.invokevirtual("androidx/fragment/app/FragmentManager", "findFragmentById", "(I)Landroidx/fragment/app/Fragment;", false) + } + AndroidContainerType.ANDROIDX_SUPPORT_FRAGMENT_ACTIVITY -> { + v.invokevirtual(containerType.internalClassName, "getSupportFragmentManager", "()Landroidx/fragment/app/FragmentManager;", false) + getResourceId(v) + v.invokevirtual("androidx/fragment/app/FragmentManager", "findFragmentById", "(I)Landroidx/fragment/app/Fragment;", false) + } else -> throw IllegalStateException("Invalid Android class type: $containerType") // Should never occur } diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/descriptors/LazySyntheticElementResolveContext.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/descriptors/LazySyntheticElementResolveContext.kt index d7825b6b9cf..8f9ddad2aa3 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/descriptors/LazySyntheticElementResolveContext.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/descriptors/LazySyntheticElementResolveContext.kt @@ -42,8 +42,8 @@ class LazySyntheticElementResolveContext(private val module: ModuleDescriptor, s val activityDescriptor = find(AndroidConst.ACTIVITY_FQNAME) ?: return SyntheticElementResolveContext.ERROR_CONTEXT val fragmentDescriptor = find(AndroidConst.FRAGMENT_FQNAME) val dialogDescriptor = find(AndroidConst.DIALOG_FQNAME) ?: return SyntheticElementResolveContext.ERROR_CONTEXT - val supportActivityDescriptor = find(AndroidConst.SUPPORT_FRAGMENT_ACTIVITY_FQNAME) - val supportFragmentDescriptor = find(AndroidConst.SUPPORT_FRAGMENT_FQNAME) + val supportActivityDescriptor = find(AndroidConst.ANDROIDX_SUPPORT_FRAGMENT_ACTIVITY_FQNAME) ?: find(AndroidConst.SUPPORT_FRAGMENT_ACTIVITY_FQNAME) + val supportFragmentDescriptor = find(AndroidConst.ANDROIDX_SUPPORT_FRAGMENT_FQNAME) ?: find(AndroidConst.SUPPORT_FRAGMENT_FQNAME) val layoutContainerDescriptor = find(LayoutContainer::class.java.canonicalName) return SyntheticElementResolveContext( diff --git a/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/kotlin/android/synthetic/test/AndroidBytecodeShapeTestGenerated.java b/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/kotlin/android/synthetic/test/AndroidBytecodeShapeTestGenerated.java index 1091b1ea598..0be0db66183 100644 --- a/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/kotlin/android/synthetic/test/AndroidBytecodeShapeTestGenerated.java +++ b/plugins/android-extensions/android-extensions-compiler/test/org/jetbrains/kotlin/android/synthetic/test/AndroidBytecodeShapeTestGenerated.java @@ -169,18 +169,36 @@ public class AndroidBytecodeShapeTestGenerated extends AbstractAndroidBytecodeSh doTest(fileName); } + @TestMetadata("supportExtensionFunctionsFragmentAndroidx") + public void testSupportExtensionFunctionsFragmentAndroidx() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("plugins/android-extensions/android-extensions-compiler/testData/codegen/bytecodeShape/supportExtensionFunctionsFragmentAndroidx/"); + doTest(fileName); + } + @TestMetadata("supportSimpleFragment") public void testSupportSimpleFragment() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("plugins/android-extensions/android-extensions-compiler/testData/codegen/bytecodeShape/supportSimpleFragment/"); doTest(fileName); } + @TestMetadata("supportSimpleFragmentAndroidx") + public void testSupportSimpleFragmentAndroidx() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("plugins/android-extensions/android-extensions-compiler/testData/codegen/bytecodeShape/supportSimpleFragmentAndroidx/"); + doTest(fileName); + } + @TestMetadata("supportSimpleFragmentProperty") public void testSupportSimpleFragmentProperty() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("plugins/android-extensions/android-extensions-compiler/testData/codegen/bytecodeShape/supportSimpleFragmentProperty/"); doTest(fileName); } + @TestMetadata("supportSimpleFragmentPropertyAndroidx") + public void testSupportSimpleFragmentPropertyAndroidx() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("plugins/android-extensions/android-extensions-compiler/testData/codegen/bytecodeShape/supportSimpleFragmentPropertyAndroidx/"); + doTest(fileName); + } + @TestMetadata("viewStub") public void testViewStub() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("plugins/android-extensions/android-extensions-compiler/testData/codegen/bytecodeShape/viewStub/"); diff --git a/plugins/android-extensions/android-extensions-compiler/testData/codegen/bytecodeShape/supportExtensionFunctionsFragmentAndroidx/res/layout/layout.xml b/plugins/android-extensions/android-extensions-compiler/testData/codegen/bytecodeShape/supportExtensionFunctionsFragmentAndroidx/res/layout/layout.xml new file mode 100644 index 00000000000..4d73173b521 --- /dev/null +++ b/plugins/android-extensions/android-extensions-compiler/testData/codegen/bytecodeShape/supportExtensionFunctionsFragmentAndroidx/res/layout/layout.xml @@ -0,0 +1,17 @@ + + + + +