From 12a05e00068436831a01d85b807a38549be8698b Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Thu, 1 Nov 2018 14:42:07 +0900 Subject: [PATCH] Android Extensions: Use smart pointers in 'AndroidResource' --- .../synthetic/res/AndroidLayoutXmlFileManager.kt | 8 +++++--- .../kotlin/android/synthetic/res/androidResources.kt | 11 ++++++++--- .../synthetic/res/syntheticDescriptorGeneration.kt | 4 ++-- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/res/AndroidLayoutXmlFileManager.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/res/AndroidLayoutXmlFileManager.kt index 5ca2bfba0fa..b9865fb42fd 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/res/AndroidLayoutXmlFileManager.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/res/AndroidLayoutXmlFileManager.kt @@ -27,6 +27,7 @@ import com.intellij.psi.PsiManager import org.jetbrains.kotlin.android.synthetic.AndroidConst import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor +import org.jetbrains.kotlin.psi.psiUtil.createSmartPointer import java.util.* class AndroidVariantData(val variant: AndroidVariant, val layouts: Map>) @@ -93,10 +94,11 @@ abstract class AndroidLayoutXmlFileManager(val project: Project) { protected abstract fun doExtractResources(layoutGroup: AndroidLayoutGroupData, module: ModuleDescriptor): AndroidLayoutGroup protected fun parseAndroidResource(id: ResourceIdentifier, tag: String, sourceElement: PsiElement?): AndroidResource { + val sourceElementPointer = sourceElement?.createSmartPointer() return when (tag) { - "fragment" -> AndroidResource.Fragment(id, sourceElement) - "include" -> AndroidResource.Widget(id, AndroidConst.VIEW_FQNAME, sourceElement) - else -> AndroidResource.Widget(id, tag, sourceElement) + "fragment" -> AndroidResource.Fragment(id, sourceElementPointer) + "include" -> AndroidResource.Widget(id, AndroidConst.VIEW_FQNAME, sourceElementPointer) + else -> AndroidResource.Widget(id, tag, sourceElementPointer) } } diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/res/androidResources.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/res/androidResources.kt index ae90deb22a2..66440b182d7 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/res/androidResources.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/res/androidResources.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.android.synthetic.res import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement +import com.intellij.psi.SmartPsiElementPointer import com.intellij.psi.util.CachedValue import com.intellij.psi.util.CachedValueProvider import com.intellij.psi.util.CachedValuesManager @@ -65,14 +66,18 @@ class AndroidLayoutGroup(val name: String, val layouts: List) class AndroidLayout(val resources: List) -sealed class AndroidResource(val id: ResourceIdentifier, val sourceElement: PsiElement?, val partiallyDefined: Boolean) { +sealed class AndroidResource( + val id: ResourceIdentifier, + val sourceElement: SmartPsiElementPointer?, + val partiallyDefined: Boolean +) { open fun sameClass(other: AndroidResource): Boolean = false open fun partiallyDefined(): AndroidResource = this class Widget( id: ResourceIdentifier, val xmlType: String, - sourceElement: PsiElement?, + sourceElement: SmartPsiElementPointer?, partiallyDefined: Boolean = false ) : AndroidResource(id, sourceElement, partiallyDefined) { override fun sameClass(other: AndroidResource) = other is Widget @@ -81,7 +86,7 @@ sealed class AndroidResource(val id: ResourceIdentifier, val sourceElement: PsiE class Fragment( id: ResourceIdentifier, - sourceElement: PsiElement?, + sourceElement: SmartPsiElementPointer?, partiallyDefined: Boolean = false ) : AndroidResource(id, sourceElement, partiallyDefined) { override fun sameClass(other: AndroidResource) = other is Fragment diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/res/syntheticDescriptorGeneration.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/res/syntheticDescriptorGeneration.kt index f81940f958f..ceeb5f4ce47 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/res/syntheticDescriptorGeneration.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/res/syntheticDescriptorGeneration.kt @@ -59,7 +59,7 @@ internal fun genPropertyForWidget( resolvedWidget: ResolvedWidget, context: SyntheticElementResolveContext ): PropertyDescriptor { - val sourceEl = resolvedWidget.widget.sourceElement?.let(::XmlSourceElement) ?: SourceElement.NO_SOURCE + val sourceEl = resolvedWidget.widget.sourceElement?.element?.let(::XmlSourceElement) ?: SourceElement.NO_SOURCE val classDescriptor = resolvedWidget.viewClassDescriptor val type = classDescriptor?.let { @@ -83,7 +83,7 @@ internal fun genPropertyForFragment( type: SimpleType, fragment: AndroidResource.Fragment ): PropertyDescriptor { - val sourceElement = fragment.sourceElement?.let(::XmlSourceElement) ?: SourceElement.NO_SOURCE + val sourceElement = fragment.sourceElement?.element?.let(::XmlSourceElement) ?: SourceElement.NO_SOURCE return genProperty(fragment, receiverType, type, packageFragmentDescriptor, sourceElement, null) }