From 37411c823df28b43a83b4b517e9aee77f312550f Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Fri, 13 Jul 2018 16:29:24 +0300 Subject: [PATCH] Android Extensions: Check the backing 'virtualFile' validity before calling 'findFile()' (EA-124028) --- .../idea/res/IDEAndroidLayoutXmlFileManager.kt | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/synthetic/idea/res/IDEAndroidLayoutXmlFileManager.kt b/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/synthetic/idea/res/IDEAndroidLayoutXmlFileManager.kt index 752c11b4a30..84eee6c5c43 100644 --- a/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/synthetic/idea/res/IDEAndroidLayoutXmlFileManager.kt +++ b/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/synthetic/idea/res/IDEAndroidLayoutXmlFileManager.kt @@ -18,7 +18,10 @@ package org.jetbrains.kotlin.android.synthetic.idea.res import com.intellij.openapi.module.Module 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.PsiFile import com.intellij.psi.PsiManager import com.intellij.psi.impl.PsiTreeChangePreprocessor 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.resolve.descriptorUtil.fqNameUnsafe import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance +import java.io.File class IDEAndroidLayoutXmlFileManager(val module: Module) : AndroidLayoutXmlFileManager(module.project) { override val androidModule: AndroidModule? @@ -66,7 +70,7 @@ class IDEAndroidLayoutXmlFileManager(val module: Module) : AndroidLayoutXmlFileM val psiManager = PsiManager.getInstance(project) 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, - 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() layout?.accept(AndroidXmlVisitor { id, widgetType, attribute -> @@ -78,6 +82,13 @@ class IDEAndroidLayoutXmlFileManager(val module: Module) : AndroidLayoutXmlFileM 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 { val fqPath = propertyDescriptor.fqNameUnsafe.pathSegments() if (fqPath.size <= SYNTHETIC_PACKAGE_PATH_LENGTH) return listOf()