mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-04-20 13:31:28 +07:00
[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:
committed by
intellij-monorepo-bot
parent
1613e79e2d
commit
741459a2ef
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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'"))
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user