From c38ec1c6ffdbb56d08ae25cd38f8a8d780d0b874 Mon Sep 17 00:00:00 2001 From: Andrew Shulaev Date: Mon, 3 Aug 2015 21:42:37 +0100 Subject: Fix IndexNotReadyException in layout editor Way to reproduce an exception: 1. Open "Design" tab of a layout file 2. Run "Sync Project with Gradle Files" 3. Click on activity selector in top panel (a lot). 4. A click done straight after project sync is completed causes ActivityMenuAction#createPopupActionGroup to throw an exception. Going to dumb mode manually (by using internal action) doesn't give an ability to trigger the exception: popup just doesn't open. Steps described above trigger the exception reliably though. Change-Id: If2c92b3cd9d4686c50374a13937373b76ea654a5 --- .../idea/configurations/ActivityMenuAction.java | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'android') diff --git a/android/src/com/android/tools/idea/configurations/ActivityMenuAction.java b/android/src/com/android/tools/idea/configurations/ActivityMenuAction.java index bc2c8705100..aecc8af6c0f 100644 --- a/android/src/com/android/tools/idea/configurations/ActivityMenuAction.java +++ b/android/src/com/android/tools/idea/configurations/ActivityMenuAction.java @@ -28,6 +28,7 @@ import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.fileEditor.OpenFileDescriptor; import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.IndexNotReadyException; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; @@ -153,9 +154,9 @@ public class ActivityMenuAction extends FlatComboAction { String layoutName = ResourceHelper.getResourceName(file); Project project = module.getProject(); String rLayoutFqcn = StringUtil.notNullize(pkg) + '.' + R_CLASS + '.' + ResourceType.LAYOUT.getName(); - PsiClass layoutClass = JavaPsiFacade.getInstance(project).findClass(rLayoutFqcn, GlobalSearchScope.projectScope(project)); + PsiClass layoutClass = findClassSafe(JavaPsiFacade.getInstance(project), rLayoutFqcn, GlobalSearchScope.projectScope(project)); if (layoutClass != null) { - PsiClass activityBase = JavaPsiFacade.getInstance(project).findClass(CLASS_ACTIVITY, GlobalSearchScope.allScope(project)); + PsiClass activityBase = findClassSafe(JavaPsiFacade.getInstance(project), CLASS_ACTIVITY, GlobalSearchScope.allScope(project)); PsiField field = layoutClass.findFieldByName(layoutName, false); if (field != null && activityBase != null) { Iterable allReferences = SearchUtils.findAllReferences(field, GlobalSearchScope.projectScope(project)); @@ -195,6 +196,21 @@ public class ActivityMenuAction extends FlatComboAction { return group; } + /** + * Try to look up class by name and scope using JavaPsiFacade, return null if IndexNotReadyException is thrown. + */ + @Nullable + private static PsiClass findClassSafe(@NotNull JavaPsiFacade facade, @NotNull String qualifiedName, GlobalSearchScope scope) { + PsiClass result; + try { + result = facade.findClass(qualifiedName, scope); + } + catch (IndexNotReadyException e) { + result = null; + } + return result; + } + private static class ChooseActivityAction extends AnAction { private final RenderContext myRenderContext; private String myActivity; -- cgit v1.2.3