From 1de3337ef5374f2e73c5e769ff88aaa4837cee77 Mon Sep 17 00:00:00 2001 From: Sergei Vorobyov Date: Tue, 10 Dec 2019 20:24:49 +0300 Subject: [PATCH] [gradle-npw] refresh new project immediately after creation GitOrigin-RevId: c6249fc8120fbb3dbee5eea8cb075dac08de3601 --- .../wizard/AbstractGradleModuleBuilder.java | 125 +++++++++--------- 1 file changed, 62 insertions(+), 63 deletions(-) diff --git a/plugins/gradle/java/src/service/project/wizard/AbstractGradleModuleBuilder.java b/plugins/gradle/java/src/service/project/wizard/AbstractGradleModuleBuilder.java index 41bcfad0a0ba..a0f19f4cf3f6 100644 --- a/plugins/gradle/java/src/service/project/wizard/AbstractGradleModuleBuilder.java +++ b/plugins/gradle/java/src/service/project/wizard/AbstractGradleModuleBuilder.java @@ -9,22 +9,16 @@ import com.intellij.ide.projectWizard.ProjectSettingsStep; import com.intellij.ide.util.EditorHelper; import com.intellij.ide.util.projectWizard.*; import com.intellij.openapi.Disposable; -import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.components.StorageScheme; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.externalSystem.ExternalStateComponent; import com.intellij.openapi.externalSystem.ExternalSystemModulePropertyManager; -import com.intellij.openapi.externalSystem.importing.ImportSpec; import com.intellij.openapi.externalSystem.importing.ImportSpecBuilder; -import com.intellij.openapi.externalSystem.model.DataNode; import com.intellij.openapi.externalSystem.model.ExternalSystemDataKeys; -import com.intellij.openapi.externalSystem.model.ProjectKeys; -import com.intellij.openapi.externalSystem.model.internal.InternalExternalProjectInfo; import com.intellij.openapi.externalSystem.model.project.ProjectData; import com.intellij.openapi.externalSystem.model.project.ProjectId; -import com.intellij.openapi.externalSystem.service.project.manage.ExternalProjectsManagerImpl; import com.intellij.openapi.externalSystem.service.project.wizard.AbstractExternalModuleBuilder; import com.intellij.openapi.externalSystem.settings.AbstractExternalSystemSettings; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; @@ -66,6 +60,7 @@ import java.util.HashMap; import java.util.Map; import static com.intellij.ide.util.newProjectWizard.AbstractProjectWizard.getNewProjectJdk; +import static com.intellij.openapi.externalSystem.service.execution.ProgressExecutionMode.MODAL_SYNC; import static com.intellij.openapi.externalSystem.service.project.manage.ExternalProjectsManagerImpl.setupCreatedProject; import static org.jetbrains.plugins.gradle.service.project.open.GradleProjectImportUtil.setupGradleSettings; @@ -201,26 +196,7 @@ public abstract class AbstractGradleModuleBuilder extends AbstractExternalModule super.setupModule(module); assert rootProjectPath != null; - VirtualFile buildScriptFile = null; - final BuildScriptDataBuilder buildScriptDataBuilder = getBuildScriptData(module); - try { - if (buildScriptDataBuilder != null) { - buildScriptFile = buildScriptDataBuilder.getBuildScriptFile(); - String lineSeparator = lineSeparator(buildScriptFile); - String imports = StringUtil.convertLineSeparators(buildScriptDataBuilder.buildImports(), lineSeparator); - String configurationPart = StringUtil.convertLineSeparators(buildScriptDataBuilder.buildConfigurationPart(), lineSeparator); - String existingText = StringUtil.trimTrailing(VfsUtilCore.loadText(buildScriptFile)); - String content = (!imports.isEmpty() ? imports + lineSeparator : "") + - (!configurationPart.isEmpty() ? configurationPart + lineSeparator : "") + - (!existingText.isEmpty() ? existingText + lineSeparator : "") + - lineSeparator + - StringUtil.convertLineSeparators(buildScriptDataBuilder.buildMainPart(), lineSeparator); - VfsUtil.saveText(buildScriptFile, content); - } - } - catch (IOException e) { - LOG.warn("Unexpected exception on applying frameworks templates", e); - } + VirtualFile buildScriptFile = createAndConfigureBuildScriptFile(module); // it will be set later in any case, but save is called immediately after project creation, so, to ensure that it will be properly saved as external system module ExternalSystemModulePropertyManager modulePropertyManager = ExternalSystemModulePropertyManager.getInstance(module); @@ -231,50 +207,73 @@ public abstract class AbstractGradleModuleBuilder extends AbstractExternalModule moduleState.setLinkedProjectPath(rootProjectPath); final Project project = module.getProject(); - final Sdk projectSdk = getNewProjectJdk(myWizardContext); - final GradleProjectSettings gradleProjectSettings = getExternalProjectSettings(); + FileDocumentManager.getInstance().saveAllDocuments(); + GradleProjectSettings projectSettings = getOrCreateCurrentSettings(project); if (myWizardContext.isCreatingNewProject()) { - setupGradleSettings(gradleProjectSettings, rootProjectPath, project, projectSdk); - AbstractExternalSystemSettings settings = ExternalSystemApiUtil.getSettings(project, GradleConstants.SYSTEM_ID); project.putUserData(ExternalSystemDataKeys.NEWLY_CREATED_PROJECT, Boolean.TRUE); - //noinspection unchecked - settings.linkProject(gradleProjectSettings); + // Needed to ignore postponed project refresh + project.putUserData(ExternalSystemDataKeys.NEWLY_IMPORTED_PROJECT, Boolean.TRUE); // update external projects data to be able to add child modules before the initial import finish - ProjectData projectData = new ProjectData(GradleConstants.SYSTEM_ID, project.getName(), myWizardContext.getProjectFileDirectory(), - gradleProjectSettings.getExternalProjectPath()); - DataNode projectDataNode = new DataNode<>(ProjectKeys.PROJECT, projectData, null); - ExternalProjectsManagerImpl.getInstance(project).updateExternalProjectData( - new InternalExternalProjectInfo(GradleConstants.SYSTEM_ID, gradleProjectSettings.getExternalProjectPath(), projectDataNode)); + ImportSpecBuilder previewSpec = new ImportSpecBuilder(project, GradleConstants.SYSTEM_ID).usePreviewMode().use(MODAL_SYNC); + ExternalSystemUtil.refreshProject(rootProjectPath, previewSpec); } - else { - FileDocumentManager.getInstance().saveAllDocuments(); - final VirtualFile finalBuildScriptFile = buildScriptFile; - Runnable runnable = () -> { - if (myParentProject == null) { - setupGradleSettings(gradleProjectSettings, rootProjectPath, project, projectSdk); - AbstractExternalSystemSettings settings = ExternalSystemApiUtil.getSettings(project, GradleConstants.SYSTEM_ID); - //noinspection unchecked - settings.linkProject(gradleProjectSettings); - } - ImportSpec importSpec = new ImportSpecBuilder(project, GradleConstants.SYSTEM_ID) - .createDirectoriesForEmptyContentRoots() - .build(); - ExternalSystemUtil.refreshProject(rootProjectPath, importSpec); + // execute when current dialog is closed + ApplicationManager.getApplication().invokeLater(() -> { + ImportSpecBuilder importSpec = new ImportSpecBuilder(project, GradleConstants.SYSTEM_ID).createDirectoriesForEmptyContentRoots(); + ExternalSystemUtil.refreshProject(rootProjectPath, importSpec); + openBuildScriptFile(project, buildScriptFile); + }, ModalityState.NON_MODAL, project.getDisposed()); + } - final PsiFile psiFile; - if (finalBuildScriptFile != null) { - psiFile = PsiManager.getInstance(project).findFile(finalBuildScriptFile); - if (psiFile != null) { - EditorHelper.openInEditor(psiFile); - } - } - }; - - // execute when current dialog is closed - Application application = ApplicationManager.getApplication(); - application.invokeLater(runnable, ModalityState.NON_MODAL, project.getDisposed()); + private GradleProjectSettings getOrCreateCurrentSettings(@NotNull Project project) { + if (myParentProject != null) { + return getSystemSettings(project).getLinkedProjectSettings(rootProjectPath); } + Sdk projectSdk = getNewProjectJdk(myWizardContext); + GradleProjectSettings projectSettings = getExternalProjectSettings(); + setupGradleSettings(projectSettings, rootProjectPath, project, projectSdk); + getSystemSettings(project).linkProject(projectSettings); + return projectSettings; + } + + private static AbstractExternalSystemSettings getSystemSettings(@NotNull Project project) { + //noinspection unchecked + return ExternalSystemApiUtil.getSettings(project, GradleConstants.SYSTEM_ID); + } + + @Nullable + private static VirtualFile createAndConfigureBuildScriptFile(@NotNull Module module) { + final BuildScriptDataBuilder buildScriptDataBuilder = getBuildScriptData(module); + if (buildScriptDataBuilder == null) return null; + try { + VirtualFile buildScriptFile = buildScriptDataBuilder.getBuildScriptFile(); + String lineSeparator = lineSeparator(buildScriptFile); + String imports = StringUtil.convertLineSeparators(buildScriptDataBuilder.buildImports(), lineSeparator); + String configurationPart = StringUtil.convertLineSeparators(buildScriptDataBuilder.buildConfigurationPart(), lineSeparator); + String existingText = StringUtil.trimTrailing(VfsUtilCore.loadText(buildScriptFile)); + String content = (!imports.isEmpty() ? imports + lineSeparator : "") + + (!configurationPart.isEmpty() ? configurationPart + lineSeparator : "") + + (!existingText.isEmpty() ? existingText + lineSeparator : "") + + lineSeparator + + StringUtil.convertLineSeparators(buildScriptDataBuilder.buildMainPart(), lineSeparator); + VfsUtil.saveText(buildScriptFile, content); + return buildScriptFile; + } + catch (IOException e) { + LOG.warn("Unexpected exception on applying frameworks templates", e); + } + return null; + } + + private static void openBuildScriptFile(@NotNull Project project, VirtualFile buildScriptFile) { + ApplicationManager.getApplication().invokeLater(() -> { + if (buildScriptFile == null) return; + PsiManager psiManager = PsiManager.getInstance(project); + PsiFile psiFile = psiManager.findFile(buildScriptFile); + if (psiFile == null) return; + EditorHelper.openInEditor(psiFile); + }, ModalityState.NON_MODAL, project.getDisposed()); } protected void setWizardContext(@NotNull WizardContext wizardContext) {