summaryrefslogtreecommitdiff
path: root/android
diff options
context:
space:
mode:
authorAndrew Shulaev <ddrone@google.com>2015-08-03 21:42:37 +0100
committerAndrew Shulaev <ddrone@google.com>2015-08-03 21:42:37 +0100
commitc38ec1c6ffdbb56d08ae25cd38f8a8d780d0b874 (patch)
tree511d1ae7178bb258e06b4522331c616fe60f265e /android
parent6781757dcb88c1d7ef1c910f2aeccc9460d47ff4 (diff)
downloadidea-c38ec1c6ffdbb56d08ae25cd38f8a8d780d0b874.tar.gz
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
Diffstat (limited to 'android')
-rw-r--r--android/src/com/android/tools/idea/configurations/ActivityMenuAction.java20
1 files changed, 18 insertions, 2 deletions
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<PsiReference> 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;