From 7bcc3dd875824dc7afa0aea4f71a6581a14bfe25 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Mon, 29 Jun 2015 21:17:53 +0200 Subject: [PATCH] correct place for enabling alternative resolve in library configurator --- .../KotlinWithLibraryConfigurator.java | 19 +++++++++++++++---- .../ConfigureKotlinNotification.java | 12 ++---------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithLibraryConfigurator.java b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithLibraryConfigurator.java index 070f9b983e7..66314f651a7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithLibraryConfigurator.java +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithLibraryConfigurator.java @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.idea.configuration; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; +import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.*; import com.intellij.openapi.roots.libraries.Library; @@ -76,7 +77,7 @@ public abstract class KotlinWithLibraryConfigurator implements KotlinProjectConf @Override public void configure(@NotNull Project project) { - String defaultPathToJar = getDefaultPathToJarFile(project); + final String defaultPathToJar = getDefaultPathToJarFile(project); boolean showPathToJarPanel = needToChooseJarPath(project); List nonConfiguredModules = @@ -102,9 +103,19 @@ public abstract class KotlinWithLibraryConfigurator implements KotlinProjectConf copyLibraryIntoPath = dialog.getCopyIntoPath(); } - for (Module module : modulesToConfigure) { - configureModuleWithLibrary(module, defaultPathToJar, copyLibraryIntoPath); - } + final List finalModulesToConfigure = modulesToConfigure; + final String finalCopyLibraryIntoPath = copyLibraryIntoPath; + + // The first root modification enters dumb mode, and we need to be able to perform isKotlinLibrary() checks + // after that, and those checks use findClass(). Therefore, we need to enable alternative resolve here. + DumbService.getInstance(project).withAlternativeResolveEnabled(new Runnable() { + @Override + public void run() { + for (Module module : finalModulesToConfigure) { + configureModuleWithLibrary(module, defaultPathToJar, finalCopyLibraryIntoPath); + } + } + }); } protected void configureModuleWithLibrary( diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/ui/notifications/ConfigureKotlinNotification.java b/idea/src/org/jetbrains/kotlin/idea/configuration/ui/notifications/ConfigureKotlinNotification.java index 1bc55b9c35b..66d56f1b47f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/ui/notifications/ConfigureKotlinNotification.java +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/ui/notifications/ConfigureKotlinNotification.java @@ -20,7 +20,6 @@ import com.intellij.notification.Notification; import com.intellij.notification.NotificationListener; import com.intellij.notification.NotificationType; import com.intellij.openapi.module.Module; -import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.Function; @@ -47,18 +46,11 @@ public class ConfigureKotlinNotification extends Notification { @Override public void hyperlinkUpdate(@NotNull Notification notification, @NotNull HyperlinkEvent event) { if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { - final KotlinProjectConfigurator configurator = ConfigureKotlinInProjectUtils.getConfiguratorByName(event.getDescription()); + KotlinProjectConfigurator configurator = ConfigureKotlinInProjectUtils.getConfiguratorByName(event.getDescription()); if (configurator == null) { throw new AssertionError("Missed action: " + event.getDescription()); } - // The user can often click the notification while building indices, and we want it to work right away, so we - // should enable alternative resolve. - DumbService.getInstance(project).withAlternativeResolveEnabled(new Runnable() { - @Override - public void run() { - configurator.configure(project); - } - }); + configurator.configure(project); notification.expire(); } }