diff --git a/java/java-impl-inspections/src/com/intellij/codeInspection/java19api/Java9GenerateModuleDescriptorsAction.java b/java/java-impl-inspections/src/com/intellij/codeInspection/java19api/Java9GenerateModuleDescriptorsAction.java index 785702eae020..a3975649ac84 100644 --- a/java/java-impl-inspections/src/com/intellij/codeInspection/java19api/Java9GenerateModuleDescriptorsAction.java +++ b/java/java-impl-inspections/src/com/intellij/codeInspection/java19api/Java9GenerateModuleDescriptorsAction.java @@ -1,4 +1,4 @@ -// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.codeInspection.java19api; import com.intellij.codeInsight.daemon.impl.analysis.JavaModuleGraphUtil; @@ -14,7 +14,7 @@ import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ReadAction; -import com.intellij.openapi.application.ex.ApplicationEx; +import com.intellij.openapi.application.ex.ApplicationManagerEx; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.compiler.CompileScope; import com.intellij.openapi.compiler.CompilerManager; @@ -27,6 +27,7 @@ import com.intellij.openapi.module.ModuleUtilCore; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.Task; +import com.intellij.openapi.progress.impl.CoreProgressManager; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.JavaSdkVersion; @@ -251,14 +252,20 @@ public final class Java9GenerateModuleDescriptorsAction extends AnAction { } private void createFilesLater(List moduleInfos) { - ApplicationManager.getApplication().invokeLater(() -> { - if (!myProject.isDisposed()) { - CommandProcessor.getInstance().executeCommand(myProject, () -> - ((ApplicationEx)ApplicationManager.getApplication()).runWriteActionWithCancellableProgressInDispatchThread( - getCommandTitle(), myProject, null, - indicator -> createFiles(myProject, moduleInfos, indicator)), getCommandTitle(), null); - } - }); + Runnable createFiles = () -> { + if (myProject.isDisposed()) return; + CommandProcessor.getInstance().executeCommand(myProject, () -> + ApplicationManagerEx.getApplicationEx().runWriteActionWithCancellableProgressInDispatchThread( + getCommandTitle(), myProject, null, + indicator -> createFiles(myProject, moduleInfos, indicator)), getCommandTitle(), null); + }; + + if (CoreProgressManager.shouldKeepTasksAsynchronous()) { + ApplicationManager.getApplication().invokeLater(createFiles); + } + else { + ApplicationManager.getApplication().invokeAndWait(createFiles); + } } private Map> collectDependencies(Map> classFiles) { diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/.idea/misc.xml b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/.idea/misc.xml new file mode 100644 index 000000000000..d4ef29a2bedd --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/.idea/modules.xml b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/.idea/modules.xml new file mode 100644 index 000000000000..c3e8a8f7acd7 --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/.idea/modules.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/A/proj-a.iml b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/A/proj-a.iml new file mode 100644 index 000000000000..90ef326fcb8c --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/A/proj-a.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/A/src/module-info.java b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/A/src/module-info.java new file mode 100644 index 000000000000..864e34253a5b --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/A/src/module-info.java @@ -0,0 +1,3 @@ +module proj.a { + requires proj.b; +} \ No newline at end of file diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/A/src/org/client/Browser.java b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/A/src/org/client/Browser.java new file mode 100644 index 000000000000..40528ffd92c8 --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/A/src/org/client/Browser.java @@ -0,0 +1,9 @@ +package org.client; + +import org.driver.Monitor; + +public class Browser { + public static void main(String[] args) { + new Monitor().exec(); + } +} diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/B/proj-b.iml b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/B/proj-b.iml new file mode 100644 index 000000000000..f15263a7596c --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/B/proj-b.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/B/src/module-info.java b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/B/src/module-info.java new file mode 100644 index 000000000000..7eb512301f6e --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/B/src/module-info.java @@ -0,0 +1,5 @@ +module proj.b { + requires proj.c; + + exports org.driver; +} \ No newline at end of file diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/B/src/org/driver/Monitor.java b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/B/src/org/driver/Monitor.java new file mode 100644 index 000000000000..c82098da4792 --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/B/src/org/driver/Monitor.java @@ -0,0 +1,9 @@ +package org.driver; + +import org.driver.factory.ApiFactory; + +public class Monitor { + public void exec() { + System.out.println(ApiFactory.create().name()); + } +} diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/B/src/org/driver/factory/ApiFactory.java b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/B/src/org/driver/factory/ApiFactory.java new file mode 100644 index 000000000000..0faea578b8ce --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/B/src/org/driver/factory/ApiFactory.java @@ -0,0 +1,10 @@ +package org.driver.factory; + +import org.declaration.API; +import org.declaration.impl.DummyApi; + +public class ApiFactory { + public static API create() { + return new DummyApi(); + } +} diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/C/proj-c.iml b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/C/proj-c.iml new file mode 100644 index 000000000000..c90834f2d607 --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/C/proj-c.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/C/src/module-info.java b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/C/src/module-info.java new file mode 100644 index 000000000000..b15027071896 --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/C/src/module-info.java @@ -0,0 +1,4 @@ +module proj.c { + exports org.declaration; + exports org.declaration.impl; +} \ No newline at end of file diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/C/src/org/declaration/API.java b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/C/src/org/declaration/API.java new file mode 100644 index 000000000000..bd58712a1b35 --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/C/src/org/declaration/API.java @@ -0,0 +1,5 @@ +package org.declaration; + +public interface API { + String name(); +} diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/C/src/org/declaration/impl/DummyApi.java b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/C/src/org/declaration/impl/DummyApi.java new file mode 100644 index 000000000000..64bceb0458b6 --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/C/src/org/declaration/impl/DummyApi.java @@ -0,0 +1,10 @@ +package org.declaration.impl; + +import org.declaration.API; + +public class DummyApi implements API { + @Override + public String name() { + return "dummy"; + } +} diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/target/production/proj-a/org/client/Browser.class b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/target/production/proj-a/org/client/Browser.class new file mode 100644 index 000000000000..425a593b2e8c Binary files /dev/null and b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/target/production/proj-a/org/client/Browser.class differ diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/target/production/proj-b/org/driver/Monitor.class b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/target/production/proj-b/org/driver/Monitor.class new file mode 100644 index 000000000000..4822574a48f8 Binary files /dev/null and b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/target/production/proj-b/org/driver/Monitor.class differ diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/target/production/proj-b/org/driver/factory/ApiFactory.class b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/target/production/proj-b/org/driver/factory/ApiFactory.class new file mode 100644 index 000000000000..c245a6620ae4 Binary files /dev/null and b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/target/production/proj-b/org/driver/factory/ApiFactory.class differ diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/target/production/proj-c/org/declaration/API.class b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/target/production/proj-c/org/declaration/API.class new file mode 100644 index 000000000000..0ae1b5edaffa Binary files /dev/null and b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/target/production/proj-c/org/declaration/API.class differ diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/target/production/proj-c/org/declaration/impl/DummyApi.class b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/target/production/proj-c/org/declaration/impl/DummyApi.class new file mode 100644 index 000000000000..aab033cfd686 Binary files /dev/null and b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/after/target/production/proj-c/org/declaration/impl/DummyApi.class differ diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/.idea/misc.xml b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/.idea/misc.xml new file mode 100644 index 000000000000..d4ef29a2bedd --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/.idea/modules.xml b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/.idea/modules.xml new file mode 100644 index 000000000000..c3e8a8f7acd7 --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/.idea/modules.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/A/proj-a.iml b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/A/proj-a.iml new file mode 100644 index 000000000000..90ef326fcb8c --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/A/proj-a.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/A/src/org/client/Browser.java b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/A/src/org/client/Browser.java new file mode 100644 index 000000000000..40528ffd92c8 --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/A/src/org/client/Browser.java @@ -0,0 +1,9 @@ +package org.client; + +import org.driver.Monitor; + +public class Browser { + public static void main(String[] args) { + new Monitor().exec(); + } +} diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/B/proj-b.iml b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/B/proj-b.iml new file mode 100644 index 000000000000..f15263a7596c --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/B/proj-b.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/B/src/org/driver/Monitor.java b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/B/src/org/driver/Monitor.java new file mode 100644 index 000000000000..c82098da4792 --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/B/src/org/driver/Monitor.java @@ -0,0 +1,9 @@ +package org.driver; + +import org.driver.factory.ApiFactory; + +public class Monitor { + public void exec() { + System.out.println(ApiFactory.create().name()); + } +} diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/B/src/org/driver/factory/ApiFactory.java b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/B/src/org/driver/factory/ApiFactory.java new file mode 100644 index 000000000000..0faea578b8ce --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/B/src/org/driver/factory/ApiFactory.java @@ -0,0 +1,10 @@ +package org.driver.factory; + +import org.declaration.API; +import org.declaration.impl.DummyApi; + +public class ApiFactory { + public static API create() { + return new DummyApi(); + } +} diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/C/proj-c.iml b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/C/proj-c.iml new file mode 100644 index 000000000000..c90834f2d607 --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/C/proj-c.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/C/src/org/declaration/API.java b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/C/src/org/declaration/API.java new file mode 100644 index 000000000000..bd58712a1b35 --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/C/src/org/declaration/API.java @@ -0,0 +1,5 @@ +package org.declaration; + +public interface API { + String name(); +} diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/C/src/org/declaration/impl/DummyApi.java b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/C/src/org/declaration/impl/DummyApi.java new file mode 100644 index 000000000000..64bceb0458b6 --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/C/src/org/declaration/impl/DummyApi.java @@ -0,0 +1,10 @@ +package org.declaration.impl; + +import org.declaration.API; + +public class DummyApi implements API { + @Override + public String name() { + return "dummy"; + } +} diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/target/production/proj-a/org/client/Browser.class b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/target/production/proj-a/org/client/Browser.class new file mode 100644 index 000000000000..425a593b2e8c Binary files /dev/null and b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/target/production/proj-a/org/client/Browser.class differ diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/target/production/proj-b/org/driver/Monitor.class b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/target/production/proj-b/org/driver/Monitor.class new file mode 100644 index 000000000000..4822574a48f8 Binary files /dev/null and b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/target/production/proj-b/org/driver/Monitor.class differ diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/target/production/proj-b/org/driver/factory/ApiFactory.class b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/target/production/proj-b/org/driver/factory/ApiFactory.class new file mode 100644 index 000000000000..c245a6620ae4 Binary files /dev/null and b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/target/production/proj-b/org/driver/factory/ApiFactory.class differ diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/target/production/proj-c/org/declaration/API.class b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/target/production/proj-c/org/declaration/API.class new file mode 100644 index 000000000000..0ae1b5edaffa Binary files /dev/null and b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/target/production/proj-c/org/declaration/API.class differ diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/target/production/proj-c/org/declaration/impl/DummyApi.class b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/target/production/proj-c/org/declaration/impl/DummyApi.class new file mode 100644 index 000000000000..aab033cfd686 Binary files /dev/null and b/java/java-tests/testData/actions/generateModuleDescriptors/dependentModules/before/target/production/proj-c/org/declaration/impl/DummyApi.class differ diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/after/.idea/misc.xml b/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/after/.idea/misc.xml new file mode 100644 index 000000000000..d4ef29a2bedd --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/after/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/after/.idea/modules.xml b/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/after/.idea/modules.xml new file mode 100644 index 000000000000..d7bc4c246dfb --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/after/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/after/proj-a.iml b/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/after/proj-a.iml new file mode 100644 index 000000000000..c90834f2d607 --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/after/proj-a.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/after/src/module-info.java b/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/after/src/module-info.java new file mode 100644 index 000000000000..7674163c3e55 --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/after/src/module-info.java @@ -0,0 +1,2 @@ +module proj.a { +} \ No newline at end of file diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/after/src/org/client/Main.java b/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/after/src/org/client/Main.java new file mode 100644 index 000000000000..436b2e01e5d5 --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/after/src/org/client/Main.java @@ -0,0 +1,7 @@ +package org.client; + +public class Main { + public static void main(String[] args) { + System.out.println("main"); + } +} diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/after/target/production/proj-a/org/client/Main.class b/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/after/target/production/proj-a/org/client/Main.class new file mode 100644 index 000000000000..d4c51c0af50a Binary files /dev/null and b/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/after/target/production/proj-a/org/client/Main.class differ diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/before/.idea/misc.xml b/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/before/.idea/misc.xml new file mode 100644 index 000000000000..d4ef29a2bedd --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/before/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/before/.idea/modules.xml b/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/before/.idea/modules.xml new file mode 100644 index 000000000000..d7bc4c246dfb --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/before/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/before/proj-a.iml b/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/before/proj-a.iml new file mode 100644 index 000000000000..c90834f2d607 --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/before/proj-a.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/before/src/org/client/Main.java b/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/before/src/org/client/Main.java new file mode 100644 index 000000000000..436b2e01e5d5 --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/before/src/org/client/Main.java @@ -0,0 +1,7 @@ +package org.client; + +public class Main { + public static void main(String[] args) { + System.out.println("main"); + } +} diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/before/target/production/proj-a/org/client/Main.class b/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/before/target/production/proj-a/org/client/Main.class new file mode 100644 index 000000000000..d4c51c0af50a Binary files /dev/null and b/java/java-tests/testData/actions/generateModuleDescriptors/singleModule/before/target/production/proj-a/org/client/Main.class differ diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/after/.idea/annotations.jar b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/after/.idea/annotations.jar new file mode 100644 index 000000000000..993cf004e71c Binary files /dev/null and b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/after/.idea/annotations.jar differ diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/after/.idea/misc.xml b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/after/.idea/misc.xml new file mode 100644 index 000000000000..59cfa3bef1e7 --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/after/.idea/misc.xml @@ -0,0 +1,15 @@ + + + + + + + + + + \ No newline at end of file diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/after/.idea/modules.xml b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/after/.idea/modules.xml new file mode 100644 index 000000000000..5fe87d7e413a --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/after/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/after/maven-project.iml b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/after/maven-project.iml new file mode 100644 index 000000000000..4d5d3462693e --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/after/maven-project.iml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/after/pom.xml b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/after/pom.xml new file mode 100644 index 000000000000..b37d40d12ccd --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/after/pom.xml @@ -0,0 +1,21 @@ + + 4.0.0 + + org.jetbrains + client + 1.0 + + + 9 + 9 + + + + + org.jetbrains + annotations + 24.1.0 + + + diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/after/src/main/java/module-info.java b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/after/src/main/java/module-info.java new file mode 100644 index 000000000000..2921a4bcc1f4 --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/after/src/main/java/module-info.java @@ -0,0 +1,3 @@ +module maven.project { + requires org.jetbrains.annotations; +} \ No newline at end of file diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/after/src/main/java/org/client/Main.java b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/after/src/main/java/org/client/Main.java new file mode 100644 index 000000000000..2f0b59c9a27f --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/after/src/main/java/org/client/Main.java @@ -0,0 +1,9 @@ +package org.client; + +import org.jetbrains.annotations.NotNull; + +public class Main { + public static void main(@NotNull String[] args) { + System.out.println("main"); + } +} diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/after/target/classes/org/client/Main.class b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/after/target/classes/org/client/Main.class new file mode 100644 index 000000000000..4888fe134337 Binary files /dev/null and b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/after/target/classes/org/client/Main.class differ diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/before/.idea/annotations.jar b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/before/.idea/annotations.jar new file mode 100644 index 000000000000..993cf004e71c Binary files /dev/null and b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/before/.idea/annotations.jar differ diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/before/.idea/misc.xml b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/before/.idea/misc.xml new file mode 100644 index 000000000000..59cfa3bef1e7 --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/before/.idea/misc.xml @@ -0,0 +1,15 @@ + + + + + + + + + + \ No newline at end of file diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/before/.idea/modules.xml b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/before/.idea/modules.xml new file mode 100644 index 000000000000..5fe87d7e413a --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/before/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/before/maven-project.iml b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/before/maven-project.iml new file mode 100644 index 000000000000..4d5d3462693e --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/before/maven-project.iml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/before/pom.xml b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/before/pom.xml new file mode 100644 index 000000000000..b37d40d12ccd --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/before/pom.xml @@ -0,0 +1,21 @@ + + 4.0.0 + + org.jetbrains + client + 1.0 + + + 9 + 9 + + + + + org.jetbrains + annotations + 24.1.0 + + + diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/before/src/main/java/org/client/Main.java b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/before/src/main/java/org/client/Main.java new file mode 100644 index 000000000000..2f0b59c9a27f --- /dev/null +++ b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/before/src/main/java/org/client/Main.java @@ -0,0 +1,9 @@ +package org.client; + +import org.jetbrains.annotations.NotNull; + +public class Main { + public static void main(@NotNull String[] args) { + System.out.println("main"); + } +} diff --git a/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/before/target/classes/org/client/Main.class b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/before/target/classes/org/client/Main.class new file mode 100644 index 000000000000..4888fe134337 Binary files /dev/null and b/java/java-tests/testData/actions/generateModuleDescriptors/singleModuleWithDependency/before/target/classes/org/client/Main.class differ diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/actions/Java9GenerateModuleDescriptorsActionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/actions/Java9GenerateModuleDescriptorsActionTest.java new file mode 100644 index 000000000000..6e71ae4fb8a8 --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/actions/Java9GenerateModuleDescriptorsActionTest.java @@ -0,0 +1,255 @@ +// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.java.codeInsight.actions; + +import com.intellij.JavaTestUtil; +import com.intellij.compiler.CompilerManagerImpl; +import com.intellij.conversion.ModuleSettings; +import com.intellij.openapi.Disposable; +import com.intellij.openapi.actionSystem.ActionManager; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.CommonDataKeys; +import com.intellij.openapi.application.WriteAction; +import com.intellij.openapi.compiler.CompileScope; +import com.intellij.openapi.compiler.CompilerManager; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleManager; +import com.intellij.openapi.module.ModuleWithNameAlreadyExists; +import com.intellij.openapi.project.DumbService; +import com.intellij.openapi.project.DumbServiceImpl; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.project.impl.ProjectImpl; +import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.openapi.roots.*; +import com.intellij.openapi.util.JDOMUtil; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.VirtualFileManager; +import com.intellij.openapi.vfs.pointers.VirtualFilePointer; +import com.intellij.openapi.vfs.pointers.VirtualFilePointerManager; +import com.intellij.pom.java.LanguageLevel; +import com.intellij.refactoring.LightMultiFileTestCase; +import com.intellij.testFramework.*; +import com.intellij.testFramework.fixtures.DefaultLightProjectDescriptor; +import kotlinx.coroutines.CoroutineScopeKt; +import kotlinx.coroutines.JobKt; +import org.jdom.Element; +import org.jdom.JDOMException; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.model.java.JavaSourceRootType; +import org.jetbrains.jps.model.module.JpsModuleSourceRootType; +import org.jetbrains.jps.model.serialization.JDomSerializationUtil; +import org.jetbrains.jps.model.serialization.JpsProjectLoader; + +import java.io.IOException; +import java.net.URL; +import java.nio.file.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.function.BiConsumer; +import java.util.function.Predicate; +import java.util.stream.Stream; + +import static org.jetbrains.jps.model.serialization.module.JpsModuleRootModelSerializer.*; + +public class Java9GenerateModuleDescriptorsActionTest extends LightMultiFileTestCase { + @Override + protected @NotNull LightProjectDescriptor getProjectDescriptor() { + return new FakeModuleDescriptor(Paths.get(getTestDataPath() + "/" + getTestName(true))); + } + + @Override + protected String getTestDataPath() { + return JavaTestUtil.getJavaTestDataPath() + "/actions/generateModuleDescriptors"; + } + + public void testSingleModule() throws IOException { + performReformatAction(); + } + + public void testSingleModuleWithDependency() throws IOException { + performReformatAction(); + } + + public void testDependentModules() throws IOException { + performReformatAction(); + } + + protected void performReformatAction() throws IOException { + // INIT + final AnAction action = ActionManager.getInstance().getAction("GenerateModuleDescriptors"); + final AnActionEvent event = AnActionEvent.createFromAnAction(action, null, "", dataId -> { + if (CommonDataKeys.VIRTUAL_FILE_ARRAY.is(dataId)) return Collections.emptyList(); + if (CommonDataKeys.PROJECT.is(dataId)) return getProject(); + return null; + }); + + // EXEC + action.actionPerformed(event); + + // CHECK + final FakeModuleDescriptor descriptor = (FakeModuleDescriptor)getProjectDescriptor(); + + PlatformTestUtil.assertDirectoriesEqual(LocalFileSystem.getInstance().findFileByNioFile(descriptor.myAfterPath), + LocalFileSystem.getInstance().findFileByPath(getProject().getBasePath())); + } + + private static class FakeModuleDescriptor extends DefaultLightProjectDescriptor { + private final Path myBeforePath; + private final Path myAfterPath; + private final Path myProjectPath; + + FakeModuleDescriptor(@NotNull Path path) { + myBeforePath = path.resolve("before"); + myAfterPath = path.resolve("after"); + myProjectPath = TemporaryDirectory.generateTemporaryPath(ProjectImpl.LIGHT_PROJECT_NAME); + } + + @Override + public @NotNull Path getProjectPath() { + return myProjectPath; + } + + @Override + public Sdk getSdk() { + return IdeaTestUtil.getMockJdk11(); // TODO + } + + @Override + public void setUpProject(@NotNull Project project, @NotNull SetupHandler handler) throws Exception { + WriteAction.run(() -> { + final Path basePath = Paths.get(project.getBasePath()); + FileUtil.copyDir(myBeforePath.toFile(), basePath.toFile()); + VfsUtil.markDirtyAndRefresh(false, true, true, basePath.toFile()); + + final Element miscXml = JDomSerializationUtil.findComponent(JDOMUtil.load(basePath.resolve(".idea").resolve("misc.xml")), + "ProjectRootManager"); + final String outputUrl = miscXml.getChild("output").getAttributeValue("url").replace("$PROJECT_DIR$", basePath.toString()); + final CompilerProjectExtension compilerProjectExtension = CompilerProjectExtension.getInstance(project); + + compilerProjectExtension.setCompilerOutputUrl(outputUrl); + final VirtualFilePointer pointer = VirtualFilePointerManager.getInstance() + .create(outputUrl, (Disposable)compilerProjectExtension, null); + compilerProjectExtension.setCompilerOutputPointer(pointer); + //CompilerModuleExtension + //ModuleElementsEditor + ServiceContainerUtil.replaceService(project, DumbService.class, + new DumbServiceImpl(project, CoroutineScopeKt.CoroutineScope(JobKt.Job(null))) { + @Override + public void smartInvokeLater(@NotNull Runnable runnable) { + runnable.run(); + } + }, project); + ServiceContainerUtil.replaceService(project, CompilerManager.class, new CompilerManagerImpl(project) { + @Override + public boolean isUpToDate(@NotNull CompileScope scope) { + return true; + } + }, project); + + final Element modulesXml = JDomSerializationUtil.findComponent(JDOMUtil.load(basePath.resolve(".idea").resolve("modules.xml")), + JpsProjectLoader.MODULE_MANAGER_COMPONENT); + final Element modulesElement = modulesXml.getChild(JpsProjectLoader.MODULES_TAG); + final List moduleElements = modulesElement.getChildren(JpsProjectLoader.MODULE_TAG); + for (Element moduleAttr : moduleElements) { + Path modulePath = Paths.get(moduleAttr.getAttributeValue(JpsProjectLoader.FILE_PATH_ATTRIBUTE) + .replace("$PROJECT_DIR$", basePath.toString())); + final ModuleDescriptor descriptor = new ModuleDescriptor(modulePath); + final Module module = makeModule(project, descriptor); + handler.moduleCreated(module); + final VirtualFile vSrc = VirtualFileManager.getInstance().refreshAndFindFileByNioPath(descriptor.src()); + handler.sourceRootCreated(vSrc); + createContentEntry(module, vSrc); + } + }); + } + + @NotNull + private Module makeModule(@NotNull Project project, @NotNull ModuleDescriptor descriptor) + throws ModuleWithNameAlreadyExists, IOException { + final Module module; + Path iml = getIml(descriptor.basePath); + if (iml != null && Files.exists(iml)) { + module = ModuleManager.getInstance(project).loadModule(iml); + } + else { + iml = descriptor.basePath.resolve(descriptor.basePath.getFileName() + ".iml"); + module = createModule(project, iml); + } + ModuleRootModificationUtil.updateModel(module, model -> configureModule(module, model, descriptor)); + return module; + } + + private void configureModule(@NotNull Module module, @NotNull ModifiableRootModel model, @NotNull ModuleDescriptor descriptor) { + model.getModuleExtension(LanguageLevelModuleExtension.class).setLanguageLevel(descriptor.languageLevel()); + model.setSdk(IdeaTestUtil.getMockJdk(descriptor.languageLevel().toJavaVersion())); + final BiConsumer> register = (path, type) -> { + if (path == null) return; + final VirtualFile src = Files.exists(path) + ? VirtualFileManager.getInstance().refreshAndFindFileByNioPath(path) + : createSourceRoot(module, path.toString()); + registerSourceRoot(module.getProject(), src); + model.addContentEntry(src).addSourceFolder(src, type); + }; + register.accept(descriptor.src(), JavaSourceRootType.SOURCE); + register.accept(descriptor.testSrc(), JavaSourceRootType.TEST_SOURCE); + //JavaResourceRootType.RESOURCE + //JavaResourceRootType.TEST_RESOURCE + + // Maven + final Path mavenOutputPath = Paths.get(module.getModuleFilePath()).getParent().resolve("target").resolve("classes"); + if (Files.exists(mavenOutputPath)) { + final CompilerModuleExtension compiler = model.getModuleExtension(CompilerModuleExtension.class); + compiler.setCompilerOutputPath(mavenOutputPath.toString()); + compiler.inheritCompilerOutputPath(false); + } + } + + private record ModuleDescriptor(@NotNull String name, @NotNull Path basePath, @NotNull Path src, @Nullable Path testSrc, + @NotNull LanguageLevel languageLevel) { + @SuppressWarnings("SwitchStatementWithTooFewBranches") + private ModuleDescriptor(@NotNull Path iml) throws IOException, JDOMException { + this(iml.getFileName().toString().replace(".iml", ""), iml.getParent(), + Paths.get(new URL(getData(iml, List.of(CONTENT_TAG, SOURCE_FOLDER_TAG), e -> switch (e.getName()) { + case SOURCE_FOLDER_TAG -> e.getAttributeValue(IS_TEST_SOURCE_ATTRIBUTE).equals("false"); + default -> true; + }).stream().findFirst().orElseThrow().getAttributeValue(URL_ATTRIBUTE) + .replace("$MODULE_DIR$", iml.getParent().toString())).getPath()), null, LanguageLevel.JDK_11); + } + + private static List getData(@NotNull Path iml, List tags, @NotNull Predicate condition) + throws IOException, JDOMException { + final Element component = JDomSerializationUtil.findComponent(JDOMUtil.load(iml), ModuleSettings.MODULE_ROOT_MANAGER_COMPONENT); + List elements = List.of(component); + for (String tag : tags) { + List newElements = new ArrayList<>(); + for (Element element : elements) { + newElements.addAll(element.getChildren(tag).stream().filter(condition).toList()); + } + elements = newElements; + } + return elements; + } + } + } + + @Nullable + private static Path getIml(@NotNull Path path) { + return findFiles(path, "glob:**/*.iml").stream().findFirst().orElse(null); + } + + @NotNull + private static List findFiles(@NotNull Path path, @NotNull String mask) { + final PathMatcher matcher = FileSystems.getDefault().getPathMatcher(mask); + try (final Stream stream = Files.walk(path)) { + return stream.filter(matcher::matches).sorted().toList(); + } + catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java b/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java index 78f05a7f9047..26f0e16a9a43 100644 --- a/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java +++ b/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java @@ -1,11 +1,10 @@ -// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.testFramework; import com.intellij.application.options.CodeStyle; import com.intellij.codeInspection.InspectionProfileEntry; import com.intellij.codeInspection.LocalInspectionTool; import com.intellij.codeInspection.ex.InspectionToolWrapper; -import com.intellij.ide.highlighter.ProjectFileType; import com.intellij.ide.startup.StartupManagerEx; import com.intellij.idea.IdeaLogger; import com.intellij.lang.Language; @@ -171,7 +170,7 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da } ApplicationManager.getApplication().runWriteAction(() -> cleanPersistedVFSContent()); - Path tempDirectory = TemporaryDirectory.generateTemporaryPath(ProjectImpl.LIGHT_PROJECT_NAME + ProjectFileType.DOT_DEFAULT_EXTENSION); + Path tempDirectory = descriptor.getProjectPath(); ourProject = Objects.requireNonNull(ProjectManagerEx.getInstanceEx().newProject(tempDirectory, descriptor.getOpenProjectOptions())); HeavyPlatformTestCase.synchronizeTempDirVfs(tempDirectory); ourPsiManager = null; diff --git a/platform/testFramework/src/com/intellij/testFramework/LightProjectDescriptor.java b/platform/testFramework/src/com/intellij/testFramework/LightProjectDescriptor.java index 0902ce988c68..4f7101ef64ea 100644 --- a/platform/testFramework/src/com/intellij/testFramework/LightProjectDescriptor.java +++ b/platform/testFramework/src/com/intellij/testFramework/LightProjectDescriptor.java @@ -1,6 +1,7 @@ -// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.testFramework; +import com.intellij.ide.highlighter.ProjectFileType; import com.intellij.ide.impl.OpenProjectTask; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.WriteAction; @@ -8,6 +9,7 @@ import com.intellij.openapi.module.EmptyModuleType; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.project.impl.ProjectImpl; import com.intellij.openapi.projectRoots.ProjectJdkTable; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.ContentEntry; @@ -35,6 +37,11 @@ public class LightProjectDescriptor { public static final LightProjectDescriptor EMPTY_PROJECT_DESCRIPTOR = new LightProjectDescriptor(); public static final String TEST_MODULE_NAME = "light_idea_test_case"; + private final Path myProjectPath; + + public LightProjectDescriptor() { + myProjectPath = TemporaryDirectory.generateTemporaryPath(ProjectImpl.LIGHT_PROJECT_NAME + ProjectFileType.DOT_DEFAULT_EXTENSION); + } public void setUpProject(@NotNull Project project, @NotNull SetupHandler handler) throws Exception { WriteAction.run(() -> { @@ -176,6 +183,11 @@ public class LightProjectDescriptor { } } + @NotNull + public Path getProjectPath() { + return myProjectPath; + } + protected void configureModule(@NotNull Module module, @NotNull ModifiableRootModel model, @NotNull ContentEntry contentEntry) { } public interface SetupHandler {