[build-scripts] Move PathManager.getArchivedCompliedClassesLocation()/.getArchivedCompliedClassesMapping() to a new ArchivedCompilationContextUtil (IJI-3011)

Also renames ArchivedCompilationContextUtil.getArchivedCompiledClassesLocation()/.getArchivedCompiledClassesLocationIfIsRunningFromBazelOut().

GitOrigin-RevId: dd5d8b65f46ead13e53f0fdf9b99a6e999b3a9e7
This commit is contained in:
Ilia Kirianovskii
2025-09-11 19:55:10 +03:00
committed by intellij-monorepo-bot
parent 1613e79e2d
commit 741459a2ef
19 changed files with 181 additions and 150 deletions

View File

@@ -1,7 +1,7 @@
package com.intellij.tools.launch.ide
import com.intellij.execution.CommandLineWrapperUtil
import com.intellij.openapi.application.PathManager
import com.intellij.openapi.application.ArchivedCompilationContextUtil
import com.intellij.openapi.util.io.FileUtil
import com.intellij.tools.launch.PathsProvider
import com.intellij.util.SystemProperties
@@ -66,7 +66,7 @@ class ClassPathBuilder(private val paths: PathsProvider, private val modulesToSc
JpsProjectLoader.loadProject(model.project, pathVariables, paths.sourcesRootFolder.toPath())
val productionOutput = paths.outputRootFolder.resolve("production")
if (!productionOutput.isDirectory && PathManager.getArchivedCompiledClassesMapping() == null) {
if (!productionOutput.isDirectory && ArchivedCompilationContextUtil.getArchivedCompiledClassesMapping() == null) {
error("Production classes output directory is missing: $productionOutput")
}
@@ -113,7 +113,7 @@ class ClassPathBuilder(private val paths: PathsProvider, private val modulesToSc
}
private fun Collection<Path>.replaceWithArchivedIfNeeded(): Collection<Path> {
val mapping = PathManager.getArchivedCompiledClassesMapping() ?: return this
val mapping = ArchivedCompilationContextUtil.getArchivedCompiledClassesMapping() ?: return this
return flatMap { path ->
if (Files.isRegularFile(path)) listOf(path)
// path is absolute, mapping contains only the last two path elements

View File

@@ -10,6 +10,7 @@ import com.intellij.ide.plugins.IdeaPluginDescriptor
import com.intellij.ide.plugins.PluginManagerCore
import com.intellij.idea.AppMode
import com.intellij.openapi.Disposable
import com.intellij.openapi.application.ArchivedCompilationContextUtil
import com.intellij.openapi.application.PathManager
import com.intellij.openapi.application.PluginPathManager
import com.intellij.openapi.diagnostic.logger
@@ -158,7 +159,7 @@ private fun findClassesRoots(relativePath: String, plugin: IdeaPluginDescriptor,
val fileName = FileUtilRt.getNameWithoutExtension(PathUtilRt.getFileName(relativePath))
//try restoring module name from JAR name automatically generated by BaseLayout.convertModuleNameToFileName
val moduleName = if (relativePath.startsWith("modules/")) fileName else "intellij." + fileName.replace('-', '.')
val mapping = PathManager.getArchivedCompiledClassesMapping()
val mapping = ArchivedCompilationContextUtil.getArchivedCompiledClassesMapping()
if (mapping != null) {
// baseFile is ".../idea-compile-parts-v2/production/<module-name>/"
// We should take ".../idea-compile-parts-v2/production/<module-name-2>/<hash>.jar"

View File

@@ -6,6 +6,7 @@ import com.github.benmanes.caffeine.cache.Caffeine;
import com.google.gson.Gson;
import com.google.protobuf.Message;
import com.intellij.compiler.notNullVerification.NotNullVerifyingInstrumenter;
import com.intellij.openapi.application.ArchivedCompilationContextUtil;
import com.intellij.openapi.application.ClassPathUtil;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.diagnostic.Logger;
@@ -304,8 +305,8 @@ public final class ClasspathBootstrap {
return Arrays.asList(instrumentationUtilPath, new File(instrumentationUtil.getParentFile(), "intellij.java.compiler.instrumentationUtil.java8").getAbsolutePath());
}
else {
var relevantJarsRoot = PathManager.getArchivedCompliedClassesLocation();
Map<String, List<String>> mapping = PathManager.getArchivedCompiledClassesMapping();
var relevantJarsRoot = ArchivedCompilationContextUtil.getArchivedCompiledClassesLocation();
Map<String, List<String>> mapping = ArchivedCompilationContextUtil.getArchivedCompiledClassesMapping();
if (relevantJarsRoot != null && mapping != null && instrumentationUtilPath.startsWith(relevantJarsRoot)) {
List<String> result = new ArrayList<>();
result.add(instrumentationUtilPath);

View File

@@ -1,7 +1,7 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.intellij.build.impl
import com.intellij.openapi.application.PathManager
import com.intellij.openapi.application.ArchivedCompilationContextUtil
import com.intellij.util.containers.MultiMap
import com.intellij.util.xml.dom.XmlElement
import com.intellij.util.xml.dom.readXmlAsModel
@@ -323,7 +323,7 @@ class ModuleStructureValidator(private val context: BuildContext, private val al
* Works both when module output is located in a directory and when it's packed in a JAR.
*/
private fun <T> JpsModule.processProductionOutput(processor: (outputRoots: List<Path>) -> T): T {
val archivedCompiledClassesMapping = PathManager.getArchivedCompiledClassesMapping()
val archivedCompiledClassesMapping = ArchivedCompilationContextUtil.getArchivedCompiledClassesMapping()
val outputJarPaths = archivedCompiledClassesMapping?.get("production/$name")
if (outputJarPaths == null) {
val outputDirectoryPath = JpsJavaExtensionService.getInstance().getOutputDirectoryPath(this, false)

View File

@@ -1,7 +1,7 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.intellij.build.impl.compilation
import com.intellij.openapi.application.PathManager
import com.intellij.openapi.application.ArchivedCompilationContextUtil
import com.intellij.openapi.util.io.NioFiles
import com.intellij.util.currentJavaVersion
import com.intellij.util.io.Decompressor
@@ -129,7 +129,7 @@ internal suspend fun reuseOrCompile(context: CompilationContext, moduleNames: Co
val pathToCompiledClassArchiveMetadata = context.options.pathToCompiledClassesArchivesMetadata
when {
context.options.useCompiledClassesFromProjectOutput -> {
check(isBazelTestRun() || context.classesOutputDirectory.exists() || PathManager.getArchivedCompiledClassesMapping() != null || isRunningFromBazelOut()) {
check(isBazelTestRun() || context.classesOutputDirectory.exists() || ArchivedCompilationContextUtil.getArchivedCompiledClassesMapping() != null || isRunningFromBazelOut()) {
"${BuildOptions.USE_COMPILED_CLASSES_PROPERTY} is enabled but the classes output directory ${context.classesOutputDirectory} doesn't exist"
}
val production = context.classesOutputDirectory.resolve("production")

View File

@@ -6,6 +6,7 @@
package com.intellij.ide.plugins
import com.intellij.idea.AppMode
import com.intellij.openapi.application.ArchivedCompilationContextUtil
import com.intellij.openapi.application.PathManager
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.extensions.PluginId
@@ -1243,7 +1244,7 @@ private fun loadDescriptorFromResource(
closeable = resolver as? Closeable
val loader = ImmutableZipFileDataLoader(resolver = resolver, zipPath = file)
val relevantJarsRoot = PathManager.getArchivedCompliedClassesLocation()
val relevantJarsRoot = ArchivedCompilationContextUtil.getArchivedCompiledClassesLocation()
if (pathResolver.isRunningFromSourcesWithoutDevBuild || (relevantJarsRoot != null && file.startsWith(relevantJarsRoot))) {
// support for archived compile outputs (each module in a separate jar)
basePath = file.parent

View File

@@ -15,6 +15,7 @@ import com.intellij.ide.plugins.cl.PluginAwareClassLoader
import com.intellij.ide.plugins.cl.PluginClassLoader
import com.intellij.idea.AppMode
import com.intellij.openapi.application.ApplicationInfo
import com.intellij.openapi.application.ArchivedCompilationContextUtil
import com.intellij.openapi.application.PathManager
import com.intellij.openapi.application.impl.ApplicationInfoImpl
import com.intellij.openapi.diagnostic.Logger
@@ -1009,7 +1010,7 @@ fun getPluginDistDirByClass(aClass: Class<*>): Path? {
val jarInsideLib = PathManager.getJarForClass(aClass) ?: error("Can't find plugin dist home for ${aClass.simpleName}")
if (jarInsideLib.fileName.toString().endsWith("jar", ignoreCase = true)) {
PathManager.getArchivedCompliedClassesLocation()?.let {
ArchivedCompilationContextUtil.getArchivedCompiledClassesLocation()?.let {
if (jarInsideLib.startsWith(it)) return null
}
return jarInsideLib

View File

@@ -2,6 +2,7 @@
package com.intellij.execution.eel
import com.intellij.application.options.PathMacrosImpl
import com.intellij.openapi.application.ArchivedCompilationContextUtil
import com.intellij.openapi.application.PathManager
import com.intellij.openapi.diagnostic.fileLogger
import com.intellij.openapi.util.NlsSafe
@@ -79,7 +80,7 @@ internal class JavaMainClassExecutor(clazz: Class<*>, vararg args: String) {
private fun getJpsModuleNameForClass(clazz: Class<*>): String {
val jarPathForClass = PathUtil.getJarPathForClass(clazz)
val path = Path.of(jarPathForClass)
val relevantJarsRoot = PathManager.getArchivedCompliedClassesLocation()
val relevantJarsRoot = ArchivedCompilationContextUtil.getArchivedCompiledClassesLocation()
if (Files.isDirectory(path)) {
// plain compilation output
@@ -87,7 +88,7 @@ internal class JavaMainClassExecutor(clazz: Class<*>, vararg args: String) {
}
else if (relevantJarsRoot != null && jarPathForClass.startsWith(relevantJarsRoot)) {
// archived compilation output
val mapping = PathManager.getArchivedCompiledClassesMapping()
val mapping = ArchivedCompilationContextUtil.getArchivedCompiledClassesMapping()
checkNotNull(mapping) { "Mapping cannot be null at this point" }
val key = mapping.entries.firstOrNull { (_, value) -> value.contains(jarPathForClass) }?.key
if (key == null) {
@@ -104,7 +105,7 @@ internal class JavaMainClassExecutor(clazz: Class<*>, vararg args: String) {
private fun getJpsModulesOutput(clazz: Class<*>, moduleNames: List<@NlsSafe String>): List<Path> {
val jarPathForClass = PathUtil.getJarPathForClass(clazz)
val path = Path.of(jarPathForClass)
val relevantJarsRoot = PathManager.getArchivedCompliedClassesLocation()
val relevantJarsRoot = ArchivedCompilationContextUtil.getArchivedCompiledClassesLocation()
if (Files.isDirectory(path)) {
// plain compilation output
@@ -112,7 +113,7 @@ internal class JavaMainClassExecutor(clazz: Class<*>, vararg args: String) {
}
else if (relevantJarsRoot != null && jarPathForClass.startsWith(relevantJarsRoot)) {
// archived compilation output, assume we need 'production' output
val mapping = PathManager.getArchivedCompiledClassesMapping()
val mapping = ArchivedCompilationContextUtil.getArchivedCompiledClassesMapping()
checkNotNull(mapping) { "Mapping cannot be null at this point" }
return moduleNames.flatMap {
val key = "production/$it"

View File

@@ -5,7 +5,7 @@ import com.intellij.idea.ExcludeFromTestDiscovery;
import com.intellij.idea.IJIgnore;
import com.intellij.idea.IgnoreJUnit3;
import com.intellij.nastradamus.NastradamusClient;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.application.ArchivedCompilationContextUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.testFramework.*;
import com.intellij.testFramework.bucketing.*;
@@ -619,7 +619,7 @@ public class TestCaseLoader {
if (myGetClassesCalled) {
throw new IllegalStateException("Cannot fill more classes after 'getClasses' was already called");
}
String relevantJarsRoot = PathManager.getArchivedCompliedClassesLocation();
String relevantJarsRoot = ArchivedCompilationContextUtil.getArchivedCompiledClassesLocation();
boolean noRelevantJarsRoot = StringUtil.isEmptyOrSpaces(relevantJarsRoot);
long t = System.nanoTime();

View File

@@ -2,7 +2,7 @@
package com.intellij.platform.testFramework.monorepo
import com.intellij.openapi.application.PathManager
import com.intellij.openapi.application.ArchivedCompilationContextUtil
import com.intellij.project.IntelliJProjectConfiguration
import com.intellij.testFramework.PlatformTestUtil
import org.jetbrains.jps.model.JpsProject
@@ -37,7 +37,7 @@ fun JpsModule.hasProductionSources(): Boolean = getSourceRoots(JavaSourceRootTyp
* Works both when module output is located in a directory and when it's packed in JARs.
*/
fun <T> JpsModule.processProductionOutputs(processor: (outputRoots: List<Path>) -> T): T {
val archivedCompiledClassesMapping = PathManager.getArchivedCompiledClassesMapping()
val archivedCompiledClassesMapping = ArchivedCompilationContextUtil.getArchivedCompiledClassesMapping()
val outputJarPaths = archivedCompiledClassesMapping?.get("production/$name")
if (outputJarPaths == null) {
val outputDirectoryPath = JpsJavaExtensionService.getInstance().getOutputDirectoryPath(this, false)
@@ -58,7 +58,7 @@ fun <T> JpsModule.processProductionOutputs(processor: (outputRoots: List<Path>)
val JpsModule.productionOutputPaths: List<Path>
get() {
val archivedCompiledClassesMapping = PathManager.getArchivedCompiledClassesMapping()
val archivedCompiledClassesMapping = ArchivedCompilationContextUtil.getArchivedCompiledClassesMapping()
val outputJarPath = archivedCompiledClassesMapping?.get("production/$name")
return outputJarPath?.map(Path::of) ?: listOf(JpsJavaExtensionService.getInstance().getOutputDirectoryPath(this, false)
?: error("Output directory is not specified for '$name'"))
@@ -66,7 +66,7 @@ val JpsModule.productionOutputPaths: List<Path>
val JpsModule.testOutputPaths: List<Path>
get() {
val archivedCompiledClassesMapping = PathManager.getArchivedCompiledClassesMapping()
val archivedCompiledClassesMapping = ArchivedCompilationContextUtil.getArchivedCompiledClassesMapping()
val outputJarPath = archivedCompiledClassesMapping?.get("test/$name")
return outputJarPath?.map(Path::of) ?: listOf(JpsJavaExtensionService.getInstance().getOutputDirectoryPath(this, true)
?: error("Test output directory is not specified for '$name'"))

View File

@@ -1,6 +1,7 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.openapi.application.ex;
import com.intellij.openapi.application.ArchivedCompilationContextUtil;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.JDOMUtil;
@@ -324,8 +325,8 @@ public final class PathManagerEx {
throw new IllegalStateException("Classes root " + root + " doesn't exist");
}
if (!root.isDirectory()) {
String relevantJarsRoot = PathManager.getArchivedCompliedClassesLocation();
Map<String, List<String>> mapping = PathManager.getArchivedCompiledClassesMapping();
String relevantJarsRoot = ArchivedCompilationContextUtil.getArchivedCompiledClassesLocation();
Map<String, List<String>> mapping = ArchivedCompilationContextUtil.getArchivedCompiledClassesMapping();
if (relevantJarsRoot != null && mapping != null && root.toPath().toAbsolutePath().startsWith(relevantJarsRoot)) {
// .../idea-compile-parts-v2/test/intellij.java.compiler.tests/$sha256.jar
String moduleName = root.getParentFile().getName();

View File

@@ -0,0 +1,136 @@
// 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.openapi.application;
import com.google.gson.Gson;
import com.intellij.openapi.util.text.StringUtilRt;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.UnmodifiableView;
import java.io.BufferedReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ApiStatus.Internal
public class ArchivedCompilationContextUtil {
private static Map<String, List<String>> ourArchivedCompiledClassesMapping;
/**
* NB: actual jars might be in subdirectories
*/
public static @Nullable String getArchivedCompiledClassesLocation() {
String relevantJarsRoot = System.getProperty("intellij.test.jars.location");
if (relevantJarsRoot != null) {
return relevantJarsRoot;
}
relevantJarsRoot = getArchivedCompiledClassesLocationIfIsRunningFromBazelOut();
boolean isRunningFromBazelOut = relevantJarsRoot != null;
if (isRunningFromBazelOut) {
return relevantJarsRoot;
}
return null;
}
private static @Nullable String getArchivedCompiledClassesLocationIfIsRunningFromBazelOut() {
String utilJar = PathManager.getJarPathForClass(PathManager.class);
String bazelOutPattern = Paths.get("bazel-out", "jvm-fastbuild").toString();
int index = utilJar != null ? utilJar.indexOf(bazelOutPattern) : -1;
boolean isRunningFromBazelOut = index != -1 && utilJar.endsWith(".jar");
return isRunningFromBazelOut ? utilJar.substring(0, index + bazelOutPattern.length()) : null;
}
/**
* Returns a map of IntelliJ modules to .jar absolute paths, e.g.:
* "production/intellij.platform.util" => ".../production/intellij.platform.util/$hash.jar"
*/
public static @Nullable Map<String, List<String>> getArchivedCompiledClassesMapping() {
if (ourArchivedCompiledClassesMapping == null) {
ourArchivedCompiledClassesMapping = computeArchivedCompiledClassesMapping();
}
return ourArchivedCompiledClassesMapping;
}
private static @Nullable Map<String, List<String>> computeArchivedCompiledClassesMapping() {
final String filePath = System.getProperty("intellij.test.jars.mapping.file");
if (StringUtilRt.isEmptyOrSpaces(filePath)) {
if (getArchivedCompiledClassesLocationIfIsRunningFromBazelOut() != null) {
return computeArchivedCompiledClassesMappingIfIsRunningFromBazelOut();
}
return null;
}
final List<String> lines;
try {
lines = Files.readAllLines(Paths.get(filePath));
}
catch (Exception e) {
log("Failed to load jars mappings from " + filePath);
return null;
}
final Map<String, List<String>> mapping = new HashMap<>(lines.size());
for (String line : lines) {
String[] split = line.split("=", 2);
if (split.length < 2) {
log("Ignored jars mapping line: " + line);
continue;
}
mapping.put(split[0], Collections.singletonList(split[1]));
}
return Collections.unmodifiableMap(mapping);
}
private static @Nullable @UnmodifiableView Map<String, List<String>> computeArchivedCompiledClassesMappingIfIsRunningFromBazelOut() {
final BazelTargetsInfo.TargetsFile targetsFile;
try {
targetsFile = BazelTargetsInfo.loadTargetsFileFromBazelTargetsJson(PathManager.getHomeDir());
}
catch (IOException e) {
log("Failed to load targets info from bazel-targets.json");
return null;
}
final Map<String, List<String>> result = new HashMap<>();
targetsFile.modules.forEach((moduleName, desc) -> {
if (!desc.productionJars.isEmpty()) {
result.put("production/" + moduleName, ContainerUtil.map(desc.productionJars, s -> PathManager.getHomeDir().resolve(s).toString()));
}
if (!desc.testJars.isEmpty()) {
result.put("test/" + moduleName, ContainerUtil.map(desc.testJars, s -> PathManager.getHomeDir().resolve(s).toString()));
}
});
return Collections.unmodifiableMap(result);
}
@SuppressWarnings("UseOfSystemOutOrSystemErr")
private static void log(String x) {
System.err.println(x);
}
private static final class BazelTargetsInfo {
public static TargetsFile loadTargetsFileFromBazelTargetsJson(@NotNull Path projectRoot) throws IOException {
final Path bazelTargetsJsonFile = projectRoot.resolve("build").resolve("bazel-targets.json");
try (BufferedReader bufferedReader = Files.newBufferedReader(bazelTargetsJsonFile)) {
return new Gson().fromJson(bufferedReader, TargetsFile.class);
}
}
public static final class TargetsFileModuleDescription {
public List<String> productionJars;
public List<String> testJars;
}
public static final class TargetsFile {
public Map<String, TargetsFileModuleDescription> modules;
}
}
}

View File

@@ -1,16 +1,13 @@
// 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.openapi.application;
import com.google.gson.Gson;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.text.StringUtilRt;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.io.URLUtil;
import com.intellij.util.system.CpuArch;
import com.intellij.util.system.OS;
import org.jetbrains.annotations.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.io.UncheckedIOException;
@@ -70,7 +67,6 @@ public final class PathManager {
private static Path ourOriginalConfigDir;
private static Path ourOriginalSystemDir;
private static Path ourOriginalLogDir;
private static Map<String, List<String>> ourArchivedCompiledClassesMapping;
private PathManager() { }
@@ -215,7 +211,7 @@ public final class PathManager {
}
// classes compiled to .jar and passed as archived compiled classes
String relevantJarsRoot = getArchivedCompliedClassesLocation();
String relevantJarsRoot = ArchivedCompilationContextUtil.getArchivedCompiledClassesLocation();
if (relevantJarsRoot != null && rootPath.startsWith(relevantJarsRoot)) {
String home = System.getProperty(PROPERTY_HOME_PATH);
if (home != null) {
@@ -1059,112 +1055,4 @@ public final class PathManager {
}
return property;
}
/**
* NB: actual jars might be in subdirectories
*/
@ApiStatus.Internal
public static @Nullable String getArchivedCompliedClassesLocation() {
String relevantJarsRoot = System.getProperty("intellij.test.jars.location");
if (relevantJarsRoot != null) {
return relevantJarsRoot;
}
relevantJarsRoot = getArchivedCompliedClassesLocationIfIsRunningFromBazelOut();
boolean isRunningFromBazelOut = relevantJarsRoot != null;
if (isRunningFromBazelOut) {
return relevantJarsRoot;
}
return null;
}
private static @Nullable String getArchivedCompliedClassesLocationIfIsRunningFromBazelOut() {
String utilJar = getJarPathForClass(PathManager.class);
String bazelOutPattern = Paths.get("bazel-out", "jvm-fastbuild").toString();
int index = utilJar != null ? utilJar.indexOf(bazelOutPattern) : -1;
boolean isRunningFromBazelOut = index != -1 && utilJar.endsWith(".jar");
return isRunningFromBazelOut ? utilJar.substring(0, index + bazelOutPattern.length()) : null;
}
/**
* Returns a map of IntelliJ modules to .jar absolute paths, e.g.:
* "production/intellij.platform.util" => ".../production/intellij.platform.util/$hash.jar"
*/
@ApiStatus.Internal
public static @Nullable Map<String, List<String>> getArchivedCompiledClassesMapping() {
if (ourArchivedCompiledClassesMapping == null) {
ourArchivedCompiledClassesMapping = computeArchivedCompiledClassesMapping();
}
return ourArchivedCompiledClassesMapping;
}
private static @Nullable Map<String, List<String>> computeArchivedCompiledClassesMapping() {
final String filePath = System.getProperty("intellij.test.jars.mapping.file");
if (StringUtilRt.isEmptyOrSpaces(filePath)) {
if (getArchivedCompliedClassesLocationIfIsRunningFromBazelOut() != null) {
return computeArchivedCompiledClassesMappingIfIsRunningFromBazelOut();
}
return null;
}
final List<String> lines;
try {
lines = Files.readAllLines(Paths.get(filePath));
}
catch (Exception e) {
log("Failed to load jars mappings from " + filePath);
return null;
}
final Map<String, List<String>> mapping = new HashMap<>(lines.size());
for (String line : lines) {
String[] split = line.split("=", 2);
if (split.length < 2) {
log("Ignored jars mapping line: " + line);
continue;
}
mapping.put(split[0], Collections.singletonList(split[1]));
}
return Collections.unmodifiableMap(mapping);
}
private static @Nullable @UnmodifiableView Map<String, List<String>> computeArchivedCompiledClassesMappingIfIsRunningFromBazelOut() {
final BazelTargetsInfo.TargetsFile targetsFile;
try {
targetsFile = BazelTargetsInfo.loadTargetsFileFromBazelTargetsJson(getHomeDir());
}
catch (IOException e) {
log("Failed to load targets info from bazel-targets.json");
return null;
}
final Map<String, List<String>> result = new HashMap<>();
targetsFile.modules.forEach((moduleName, desc) -> {
if (!desc.productionJars.isEmpty()) {
result.put("production/" + moduleName, ContainerUtil.map(desc.productionJars, s -> getHomeDir().resolve(s).toString()));
}
if (!desc.testJars.isEmpty()) {
result.put("test/" + moduleName, ContainerUtil.map(desc.testJars, s -> getHomeDir().resolve(s).toString()));
}
});
return Collections.unmodifiableMap(result);
}
private static final class BazelTargetsInfo {
public static TargetsFile loadTargetsFileFromBazelTargetsJson(@NotNull Path projectRoot) throws IOException {
final Path bazelTargetsJsonFile = projectRoot.resolve("build").resolve("bazel-targets.json");
try (BufferedReader bufferedReader = Files.newBufferedReader(bazelTargetsJsonFile)) {
return new Gson().fromJson(bufferedReader, TargetsFile.class);
}
}
public static final class TargetsFileModuleDescription {
public List<String> productionJars;
public List<String> testJars;
}
public static final class TargetsFile {
public Map<String, TargetsFileModuleDescription> modules;
}
}
}

View File

@@ -1,7 +1,7 @@
// 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.devkit.workspaceModel
import com.intellij.openapi.application.PathManager
import com.intellij.openapi.application.ArchivedCompilationContextUtil
import com.intellij.openapi.roots.ModifiableRootModel
import com.intellij.openapi.roots.OrderRootType
import com.intellij.openapi.roots.libraries.Library.ModifiableModel
@@ -126,7 +126,7 @@ private fun addDependencyFromCompilationOutput(model: ModifiableRootModel, libra
val classpathRootVirtualFiles = mutableListOf<VirtualFile>()
val mapping = PathManager.getArchivedCompiledClassesMapping()
val mapping = ArchivedCompilationContextUtil.getArchivedCompiledClassesMapping()
if (mapping != null) {
(mapping["production/$classpathFolder"] ?: error("No jars found for $classpathFolder production classes")).mapTo(classpathRootVirtualFiles) { jar ->
val classpathRootVirtualFile = VirtualFileManager.getInstance().refreshAndFindFileByUrl(VfsUtil.pathToUrl(jar))

View File

@@ -4,6 +4,7 @@ package org.jetbrains.plugins.groovy.dsl;
import com.intellij.ide.trustedProjects.TrustedProjects;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ArchivedCompilationContextUtil;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileEditor.impl.LoadTextUtil;
@@ -292,7 +293,7 @@ public final class GroovyDslFileIndex {
for (Class<?> aClass : classes) {
File jarPath = new File(PathUtil.getJarPathForClass(aClass));
if (jarPath.isFile()) {
String relevantJarsRoot = PathManager.getArchivedCompliedClassesLocation();
String relevantJarsRoot = ArchivedCompilationContextUtil.getArchivedCompiledClassesLocation();
if (relevantJarsRoot != null && jarPath.toPath().startsWith(relevantJarsRoot)) {
// compilation output jar
jarPath = switch (jarPath.getParentFile().getName()) {

View File

@@ -1,7 +1,7 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.jps.incremental.groovy;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.application.ArchivedCompilationContextUtil;
import java.io.File;
import java.util.ArrayList;
@@ -30,10 +30,10 @@ public final class GroovyRtJarPaths {
List<String> to) {
File parentDir = jpsPluginClassesRoot.getParentFile();
if (jpsPluginClassesRoot.isFile()) {
String relevantJarsRoot = PathManager.getArchivedCompliedClassesLocation();
String relevantJarsRoot = ArchivedCompilationContextUtil.getArchivedCompiledClassesLocation();
if (relevantJarsRoot != null && jpsPluginClassesRoot.getAbsolutePath().startsWith(relevantJarsRoot)) {
// running from archived compilation output
Map<String, List<String>> mapping = PathManager.getArchivedCompiledClassesMapping();
Map<String, List<String>> mapping = ArchivedCompilationContextUtil.getArchivedCompiledClassesMapping();
if (mapping == null) {
throw new IllegalStateException("Mapping cannot be null at this point. 'intellij.test.jars.location' is not null");
}

View File

@@ -10,7 +10,7 @@ import com.intellij.execution.configurations.RunProfile;
import com.intellij.execution.executors.DefaultDebugExecutor;
import com.intellij.execution.runners.JavaProgramPatcher;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.application.ArchivedCompilationContextUtil;
import com.intellij.openapi.application.PluginPathManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.LanguageLevelUtil;
@@ -118,7 +118,7 @@ final class GroovyHotSwapper extends JavaProgramPatcher {
if (ourJar.isDirectory()) { //development mode
return PluginPathManager.getPluginHomePath("groovy") + "/hotswap/gragent.jar";
}
final String relevantJarsRoot = PathManager.getArchivedCompliedClassesLocation();
final String relevantJarsRoot = ArchivedCompilationContextUtil.getArchivedCompiledClassesLocation();
if (relevantJarsRoot != null && ourJar.toPath().startsWith(relevantJarsRoot)) {
return PluginPathManager.getPluginHomePath("groovy") + "/hotswap/gragent.jar";
}

View File

@@ -18,7 +18,7 @@ import com.intellij.java.JavaBundle;
import com.intellij.junit4.JUnit4IdeaTestRunner;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.application.ArchivedCompilationContextUtil;
import com.intellij.openapi.application.ReadAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
@@ -269,8 +269,8 @@ public abstract class TestObject extends JavaTestFrameworkRunnableState<JUnitCon
junit5Name = junit4Name.replace("junit", "junit.v5");
}
else {
var relevantJarsRoot = PathManager.getArchivedCompliedClassesLocation();
Map<String, List<String>> mapping = PathManager.getArchivedCompiledClassesMapping();
var relevantJarsRoot = ArchivedCompilationContextUtil.getArchivedCompiledClassesLocation();
Map<String, List<String>> mapping = ArchivedCompilationContextUtil.getArchivedCompiledClassesMapping();
if (relevantJarsRoot != null && junit4Rt.toPath().startsWith(relevantJarsRoot) && mapping != null) {
return ContainerUtil.map(mapping.get("production/intellij.junit.v5.rt"), File::new);
}

View File

@@ -1955,8 +1955,8 @@ object MavenUtil {
/**
* Static state to calculate module output when running IDEA from sources
*/
private val archivedClassesLocation = PathManager.getArchivedCompliedClassesLocation()
private val mapping = PathManager.getArchivedCompiledClassesMapping()
private val archivedClassesLocation = ArchivedCompilationContextUtil.getArchivedCompiledClassesLocation()
private val mapping = ArchivedCompilationContextUtil.getArchivedCompiledClassesMapping()
private val path = PathManager.getJarForClass(MavenServerManager::class.java)?.parent
/**