Android Extensions: Check the backing 'virtualFile' validity before calling 'findFile()' (EA-124028)
This commit is contained in:
+12
-1
@@ -18,7 +18,10 @@ package org.jetbrains.kotlin.android.synthetic.idea.res
|
|||||||
|
|
||||||
import com.intellij.openapi.module.Module
|
import com.intellij.openapi.module.Module
|
||||||
import com.intellij.openapi.roots.ProjectRootModificationTracker
|
import com.intellij.openapi.roots.ProjectRootModificationTracker
|
||||||
|
import com.intellij.openapi.vfs.LocalFileSystem
|
||||||
|
import com.intellij.openapi.vfs.VirtualFile
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
|
import com.intellij.psi.PsiFile
|
||||||
import com.intellij.psi.PsiManager
|
import com.intellij.psi.PsiManager
|
||||||
import com.intellij.psi.impl.PsiTreeChangePreprocessor
|
import com.intellij.psi.impl.PsiTreeChangePreprocessor
|
||||||
import com.intellij.psi.util.CachedValue
|
import com.intellij.psi.util.CachedValue
|
||||||
@@ -34,6 +37,7 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
|||||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe
|
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance
|
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
class IDEAndroidLayoutXmlFileManager(val module: Module) : AndroidLayoutXmlFileManager(module.project) {
|
class IDEAndroidLayoutXmlFileManager(val module: Module) : AndroidLayoutXmlFileManager(module.project) {
|
||||||
override val androidModule: AndroidModule?
|
override val androidModule: AndroidModule?
|
||||||
@@ -66,7 +70,7 @@ class IDEAndroidLayoutXmlFileManager(val module: Module) : AndroidLayoutXmlFileM
|
|||||||
val psiManager = PsiManager.getInstance(project)
|
val psiManager = PsiManager.getInstance(project)
|
||||||
val layouts = layoutGroup.layouts.map { psiFile ->
|
val layouts = layoutGroup.layouts.map { psiFile ->
|
||||||
// Sometimes due to a race of later-invoked runnables, the PsiFile can be invalidated; make sure to refresh if possible,
|
// Sometimes due to a race of later-invoked runnables, the PsiFile can be invalidated; make sure to refresh if possible,
|
||||||
val layout = if (psiFile.isValid) psiFile else psiManager.findFile(psiFile.virtualFile)
|
val layout = if (psiFile.isValid) psiFile else psiManager.findFileSafe(psiFile.virtualFile)
|
||||||
|
|
||||||
val resources = arrayListOf<AndroidResource>()
|
val resources = arrayListOf<AndroidResource>()
|
||||||
layout?.accept(AndroidXmlVisitor { id, widgetType, attribute ->
|
layout?.accept(AndroidXmlVisitor { id, widgetType, attribute ->
|
||||||
@@ -78,6 +82,13 @@ class IDEAndroidLayoutXmlFileManager(val module: Module) : AndroidLayoutXmlFileM
|
|||||||
return AndroidLayoutGroup(layoutGroup.name, layouts)
|
return AndroidLayoutGroup(layoutGroup.name, layouts)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun PsiManager.findFileSafe(virtualFile: VirtualFile): PsiFile? {
|
||||||
|
if (virtualFile.isValid)
|
||||||
|
return findFile(virtualFile)
|
||||||
|
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
override fun propertyToXmlAttributes(propertyDescriptor: PropertyDescriptor): List<PsiElement> {
|
override fun propertyToXmlAttributes(propertyDescriptor: PropertyDescriptor): List<PsiElement> {
|
||||||
val fqPath = propertyDescriptor.fqNameUnsafe.pathSegments()
|
val fqPath = propertyDescriptor.fqNameUnsafe.pathSegments()
|
||||||
if (fqPath.size <= SYNTHETIC_PACKAGE_PATH_LENGTH) return listOf()
|
if (fqPath.size <= SYNTHETIC_PACKAGE_PATH_LENGTH) return listOf()
|
||||||
|
|||||||
Reference in New Issue
Block a user