[java, run configurations, jigsaw] take into account light modules when building run configurations IDEA-365889

GitOrigin-RevId: 6f010da9bd6bec02a947fe1f54bdd0fff7374989
This commit is contained in:
Aleksey Dobrynin
2025-05-28 21:22:08 +00:00
committed by intellij-monorepo-bot
parent 7b62c265ab
commit d717576b04
6 changed files with 58 additions and 10 deletions
@@ -1,4 +1,4 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.execution.application;
import com.intellij.codeInsight.daemon.impl.analysis.JavaModuleGraphUtil;
@@ -107,7 +107,7 @@ public abstract class ApplicationCommandLineState<T extends
if (mainModule != null) {
boolean inLibrary = mainModule instanceof PsiCompiledElement || mainModule instanceof LightJavaModule;
if (!inLibrary || ReadAction.compute(() -> JavaModuleGraphUtil.findNonAutomaticDescriptorByModule(module.getModule(), false)) != null) {
boolean isExcluded = CompilerConfiguration.getInstance(module.getProject())
boolean isExcluded = !(mainModule instanceof LightJavaModule) && CompilerConfiguration.getInstance(module.getProject())
.isExcludedFromCompilation(mainModule.getContainingFile().getVirtualFile());
if(!isExcluded) {
params.setModuleName(ReadAction.compute(() -> mainModule.getName()));
@@ -0,0 +1,3 @@
module my.module {
requires my.test.launcher;
}
@@ -0,0 +1,7 @@
package p;
public class Main {
public static void main(String[] args) {
}
}
@@ -20,6 +20,7 @@ import com.intellij.openapi.roots.ContentEntry;
import com.intellij.openapi.roots.ModuleRootModificationUtil;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiClass;
import com.intellij.testFramework.IdeaTestUtil;
@@ -28,6 +29,8 @@ import com.intellij.util.PathUtil;
import com.intellij.util.PathsList;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class ApplicationModulePathTest extends BaseConfigurationTestCase {
public void testAdditionalModules() throws Exception {
@@ -36,9 +39,9 @@ public class ApplicationModulePathTest extends BaseConfigurationTestCase {
ExecutionEnvironment environment =
ExecutionEnvironmentBuilder.create(myProject, DefaultRunExecutor.getRunExecutorInstance(), configuration).build();
Disposer.register(getTestRootDisposable(), environment);
JavaParameters params4Tests =
JavaParameters params4Tests =
new ApplicationConfiguration.JavaApplicationCommandLineState<>(configuration, environment).createJavaParameters4Test();
PathsList modulePath = params4Tests.getModulePath();
assertTrue("module path: " + modulePath.getPathsString(),
modulePath.getPathList().contains(getCompilerOutputPath(myModule)));
@@ -59,20 +62,20 @@ public class ApplicationModulePathTest extends BaseConfigurationTestCase {
public void testServices() throws ExecutionException {
Module module2 = createEmptyModule();
setupModule(getTestName(true) + "/dep", module2, getTestRootDisposable());
Module module3 = createEmptyModule();
setupModule(getTestName(true) + "/dep1", module3, getTestRootDisposable());
ApplicationConfiguration configuration = setupConfiguration(getTestName(true), myModule);
ModuleRootModificationUtil.updateModel(myModule, model -> model.addModuleOrderEntry(module2));
ModuleRootModificationUtil.updateModel(module2, model -> model.addModuleOrderEntry(module3));
ExecutionEnvironment environment =
ExecutionEnvironmentBuilder.create(myProject, DefaultRunExecutor.getRunExecutorInstance(), configuration).build();
Disposer.register(getTestRootDisposable(), environment);
JavaParameters params4Tests =
JavaParameters params4Tests =
new ApplicationConfiguration.JavaApplicationCommandLineState<>(configuration, environment).createJavaParameters4Test();
PathsList modulePath = params4Tests.getModulePath();
assertSize(3, modulePath.getPathList());
}
@@ -103,10 +106,34 @@ public class ApplicationModulePathTest extends BaseConfigurationTestCase {
!commandLine.contains("-p") && !commandLine.contains("--module-path"));
}
public void testLightModule() throws ExecutionException {
ApplicationConfiguration configuration = setupConfiguration(getTestName(true), myModule);
configuration.MAIN_CLASS_NAME = "my.test.launcher.Launcher";
VirtualFile moduleInfoFile = getContentRoot(getTestName(true))
.findFileByRelativePath("src/module-info.java");
assertNotNull("The file 'src/module-info.java' should exist", moduleInfoFile);
CompilerConfiguration compilerConfiguration = CompilerConfiguration.getInstance(myProject);
ExcludeEntryDescription excludeEntry = new ExcludeEntryDescription(moduleInfoFile, true, false, myProject);
WriteAction.runAndWait(() -> compilerConfiguration.getExcludedEntriesConfiguration().addExcludeEntryDescription(excludeEntry));
ExecutionEnvironment environment =
ExecutionEnvironmentBuilder.create(myProject, DefaultRunExecutor.getRunExecutorInstance(), configuration).build();
Disposer.register(getTestRootDisposable(), environment);
JavaParameters params4Tests = new ApplicationConfiguration.JavaApplicationCommandLineState<>(configuration, environment)
.createJavaParameters4Test();
String commandLine = params4Tests.toCommandLine().getCommandLineString();
assertEquals("my.test.launcher", params4Tests.getModuleName());
assertTrue("The command line should contain the launcher from a light module", commandLine.contains("-m my.test.launcher/my.test.launcher.Launcher"));
}
private ApplicationConfiguration setupConfiguration(String sources, Module module) {
setupModule(sources, module, getTestRootDisposable());
PsiClass aClass = findClass(module, "p.Main");
assertNotNull(aClass);
@@ -119,12 +146,23 @@ public class ApplicationModulePathTest extends BaseConfigurationTestCase {
ContentEntry contentEntry = model.addContentEntry(contentRoot);
contentEntry.addSourceFolder(contentRoot.getUrl() + "/src", false);
VirtualFile libDir = contentRoot.findChild("lib");
if (libDir != null) {
List<String> lib = new ArrayList<>();
for (VirtualFile jar : libDir.getChildren()) {
if (jar.isDirectory() || !jar.getName().endsWith(".jar")) continue;
lib.add(VfsUtil.getUrlForLibraryRoot(jar.toNioPath()));
}
ModuleRootModificationUtil.addModuleLibrary(module, "lib", lib, List.of());
}
CompilerModuleExtension moduleExtension = model.getModuleExtension(CompilerModuleExtension.class);
moduleExtension.inheritCompilerOutputPath(false);
moduleExtension.setCompilerOutputPath(contentRoot.findFileByRelativePath("out/production"));
});
Sdk jdk9 = IdeaTestUtil.getMockJdk9();
WriteAction.runAndWait(()-> ProjectJdkTable.getInstance().addJdk(jdk9, parentDisposable));
WriteAction.runAndWait(() -> ProjectJdkTable.getInstance().addJdk(jdk9, parentDisposable));
ModuleRootModificationUtil.setModuleSdk(module, jdk9);
IndexingTestUtil.waitUntilIndexesAreReady(module.getProject());
}