mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-06 03:21:12 +07:00
[java-highlighting] refactor MultiReleaseUtil.kt; merge with JavaMultiReleaseUtil
Part of IDEA-365344 Create a new Java error highlighter with minimal dependencies (PSI only) GitOrigin-RevId: 05487a43bb4277cef0d96ecf9f6fce789d292091
This commit is contained in:
committed by
intellij-monorepo-bot
parent
25ed837a4a
commit
65dbbd5a3a
@@ -42,8 +42,6 @@
|
||||
beanClass="com.intellij.codeInsight.daemon.impl.analysis.InjectedLanguageJavaReferenceSupplier" dynamic="true"/>
|
||||
<extensionPoint qualifiedName="com.intellij.lang.jvm.annotations.marker.suppressor"
|
||||
interface="com.intellij.codeInsight.NonCodeAnnotationsMarkerSuppressor" dynamic="true"/>
|
||||
|
||||
<extensionPoint qualifiedName="com.intellij.lang.jvm.multiReleaseSupport" interface="com.intellij.codeInsight.daemon.impl.analysis.MultiReleaseSupport" dynamic="true"/>
|
||||
</extensionPoints>
|
||||
|
||||
<extensions defaultExtensionNs="com.intellij">
|
||||
|
||||
@@ -23,6 +23,7 @@ import com.intellij.psi.PsiPackageAccessibilityStatement.Role;
|
||||
import com.intellij.psi.impl.IncompleteModelUtil;
|
||||
import com.intellij.psi.util.ClassUtil;
|
||||
import com.intellij.psi.util.InheritanceUtil;
|
||||
import com.intellij.psi.util.JavaMultiReleaseUtil;
|
||||
import com.intellij.psi.util.PsiUtil;
|
||||
import com.intellij.util.ArrayUtil;
|
||||
import com.intellij.util.ObjectUtils;
|
||||
@@ -155,7 +156,7 @@ final class ModuleHighlightUtil {
|
||||
if (target instanceof PsiPackage psiPackage) {
|
||||
boolean inTests = ModuleRootManager.getInstance(module).getFileIndex().isInTestSourceContent(file.getVirtualFile());
|
||||
directories = psiPackage.getDirectories(module.getModuleScope(inTests));
|
||||
Module mainMultiReleaseModule = MultiReleaseUtil.getMainMultiReleaseModule(module);
|
||||
Module mainMultiReleaseModule = JavaMultiReleaseUtil.getMainMultiReleaseModule(module);
|
||||
if (mainMultiReleaseModule != null) {
|
||||
directories = ArrayUtil.mergeArrays(directories, psiPackage.getDirectories(mainMultiReleaseModule.getModuleScope(inTests)));
|
||||
}
|
||||
@@ -220,7 +221,7 @@ final class ModuleHighlightUtil {
|
||||
if (implTarget instanceof PsiClass implClass) {
|
||||
Module fileModule = ModuleUtilCore.findModuleForFile(file);
|
||||
Module implModule = ModuleUtilCore.findModuleForFile(implClass.getContainingFile());
|
||||
if (fileModule != implModule && !MultiReleaseUtil.areMainAndAdditionalMultiReleaseModules(implModule, fileModule)) {
|
||||
if (fileModule != implModule && !JavaMultiReleaseUtil.areMainAndAdditionalMultiReleaseModules(implModule, fileModule)) {
|
||||
String message = JavaErrorBundle.message("module.service.alien");
|
||||
HighlightInfo.Builder info =
|
||||
HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(range(implRef)).descriptionAndTooltip(message);
|
||||
|
||||
@@ -1,46 +0,0 @@
|
||||
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
@file:JvmName("MultiReleaseUtil")
|
||||
package com.intellij.codeInsight.daemon.impl.analysis
|
||||
|
||||
import com.intellij.openapi.extensions.ExtensionPointName
|
||||
import com.intellij.openapi.module.Module
|
||||
import org.jetbrains.annotations.ApiStatus.Internal
|
||||
import java.util.regex.Pattern
|
||||
|
||||
private const val MAIN = "main"
|
||||
private val javaVersionPattern: Pattern by lazy { Pattern.compile("java\\d+") }
|
||||
|
||||
@Internal
|
||||
fun areMainAndAdditionalMultiReleaseModules(mainModule: Module, additionalModule: Module): Boolean {
|
||||
if (getMainMultiReleaseModule(additionalModule) == mainModule) {
|
||||
return true
|
||||
}
|
||||
|
||||
// Fallback: Gradle and JPS
|
||||
val mainModuleName = mainModule.name
|
||||
if (mainModuleName.endsWith(".$MAIN")) {
|
||||
val baseModuleName = mainModuleName.substringBeforeLast(MAIN)
|
||||
return javaVersionPattern.matcher(additionalModule.name.substringAfter(baseModuleName)).matches()
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
@Internal
|
||||
fun getMainMultiReleaseModule(additionalModule: Module): Module? {
|
||||
MultiReleaseSupport.EP_NAME.extensionList.forEach {
|
||||
val result = it.getMainMultiReleaseModule(additionalModule)
|
||||
if (null != result) {
|
||||
return result
|
||||
}
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
interface MultiReleaseSupport {
|
||||
fun getMainMultiReleaseModule(additionalModule: Module): Module?
|
||||
|
||||
companion object {
|
||||
@JvmField
|
||||
val EP_NAME: ExtensionPointName<MultiReleaseSupport> = ExtensionPointName("com.intellij.lang.jvm.multiReleaseSupport")
|
||||
}
|
||||
}
|
||||
@@ -30,6 +30,7 @@ import com.intellij.psi.*
|
||||
import com.intellij.psi.JavaModuleSystem.*
|
||||
import com.intellij.psi.impl.light.LightJavaModule
|
||||
import com.intellij.psi.search.GlobalSearchScope
|
||||
import com.intellij.psi.util.JavaMultiReleaseUtil
|
||||
import com.intellij.psi.util.PsiUtil
|
||||
import com.intellij.util.indexing.DumbModeAccessType
|
||||
import org.jetbrains.annotations.NonNls
|
||||
@@ -312,7 +313,7 @@ internal class JavaPlatformModuleSystem : JavaModuleSystemEx {
|
||||
private fun inSameMultiReleaseModule(current: ModuleInfo, target: ModuleInfo): Boolean {
|
||||
val placeModule = current.jpsModule ?: return false
|
||||
val targetModule = target.jpsModule ?: return false
|
||||
return com.intellij.codeInsight.daemon.impl.analysis.areMainAndAdditionalMultiReleaseModules(targetModule, placeModule)
|
||||
return JavaMultiReleaseUtil.areMainAndAdditionalMultiReleaseModules(targetModule, placeModule)
|
||||
}
|
||||
|
||||
private fun detectAutomaticModule(current: ModuleInfo): PsiJavaModule? {
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
<extensionPoint qualifiedName="com.intellij.javaMainMethodProvider" interface="com.intellij.codeInsight.runner.JavaMainMethodProvider" dynamic="true"/>
|
||||
<extensionPoint qualifiedName="com.intellij.superMethodsSearch" interface="com.intellij.util.QueryExecutor" dynamic="true"/>
|
||||
<extensionPoint qualifiedName="com.intellij.deepestSuperMethodsSearch" interface="com.intellij.util.QueryExecutor" dynamic="true"/>
|
||||
<extensionPoint qualifiedName="com.intellij.lang.jvm.multiReleaseSupport" interface="com.intellij.psi.util.JavaMultiReleaseModuleSupport" dynamic="true"/>
|
||||
<extensionPoint qualifiedName="com.intellij.generation.topLevelFactory" beanClass="com.intellij.lang.LanguageExtensionPoint" dynamic="true">
|
||||
<with attribute="implementationClass" implements="com.intellij.psi.JVMElementFactoryProvider"/>
|
||||
</extensionPoint>
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
// 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.psi.util;
|
||||
|
||||
import com.intellij.openapi.extensions.ExtensionPointName;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/**
|
||||
* An extension point that allows getting the mapping from an additional multi-release module to a main multi-release module.
|
||||
* Such a mapping is extra-linguistic (not mandated by Java specification) and could be mandated by the build system used.
|
||||
*/
|
||||
public interface JavaMultiReleaseModuleSupport {
|
||||
ExtensionPointName<JavaMultiReleaseModuleSupport> EP_NAME = new ExtensionPointName<>("com.intellij.lang.jvm.multiReleaseSupport");
|
||||
|
||||
/**
|
||||
* @param additionalModule additional module (where release-specific code resides)
|
||||
* @return main module (where common code for different releases resides); null if the supplied module is not recognized as
|
||||
* an additional module, or the module uses a different build system.
|
||||
*/
|
||||
@Nullable Module getMainMultiReleaseModule(@NotNull Module additionalModule);
|
||||
}
|
||||
@@ -2,14 +2,20 @@
|
||||
package com.intellij.psi.util;
|
||||
|
||||
import com.intellij.ide.highlighter.ArchiveFileType;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.openapi.vfs.VfsUtilCore;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.pom.java.LanguageLevel;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.util.ObjectUtils;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.Contract;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* Utility methods to support Multi-Release JARs (MR-JARs, <a href="https://openjdk.org/jeps/238">JEP 238</a>)
|
||||
*/
|
||||
@@ -23,6 +29,47 @@ public final class JavaMultiReleaseUtil {
|
||||
* Minimal JDK version which supports multi-release Jars
|
||||
*/
|
||||
public static final LanguageLevel MIN_MULTI_RELEASE_VERSION = LanguageLevel.JDK_1_9;
|
||||
private static final String MAIN = "main";
|
||||
private static final Pattern javaVersionPattern = Pattern.compile("java\\d+");
|
||||
|
||||
/**
|
||||
* @param mainModule main module candidate (where common code for different releases resides)
|
||||
* @param additionalModule additional module candidate (where release-specific code resides)
|
||||
* @return true if the supplied modules are indeed main module and additional module
|
||||
*/
|
||||
@Contract("null, _ -> false; !null, null -> false")
|
||||
@ApiStatus.Internal
|
||||
public static boolean areMainAndAdditionalMultiReleaseModules(@Nullable Module mainModule, @Nullable Module additionalModule) {
|
||||
if (mainModule == null || additionalModule == null) return false;
|
||||
if (getMainMultiReleaseModule(additionalModule) == mainModule) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Fallback: Gradle and JPS
|
||||
String mainModuleName = mainModule.getName();
|
||||
if (mainModuleName.endsWith("." + MAIN)) {
|
||||
String baseModuleName = StringUtil.substringBeforeLast(mainModuleName, MAIN);
|
||||
String moduleName = additionalModule.getName();
|
||||
return javaVersionPattern.matcher(ObjectUtils.coalesce(StringUtil.substringAfter(moduleName, baseModuleName), moduleName)).matches();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param additionalModule additional module (where release-specific code resides)
|
||||
* @return main module (where common code for different releases resides); null if the supplied module is not recognized as
|
||||
* an additional module
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
public static @Nullable Module getMainMultiReleaseModule(@NotNull Module additionalModule) {
|
||||
for (JavaMultiReleaseModuleSupport support : JavaMultiReleaseModuleSupport.EP_NAME.getExtensionList()) {
|
||||
Module result = support.getMainMultiReleaseModule(additionalModule);
|
||||
if (result != null) {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static class VersionRootInfo {
|
||||
final @NotNull LanguageLevel level;
|
||||
|
||||
@@ -1,18 +1,17 @@
|
||||
// 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.idea.maven.utils
|
||||
|
||||
import com.intellij.codeInsight.daemon.impl.analysis.MultiReleaseSupport
|
||||
import com.intellij.openapi.module.Module
|
||||
import com.intellij.openapi.module.ModuleManager
|
||||
|
||||
import com.intellij.platform.backend.workspace.workspaceModel
|
||||
import com.intellij.platform.workspace.jps.entities.ModuleId
|
||||
import com.intellij.platform.workspace.jps.entities.exModuleOptions
|
||||
import com.intellij.psi.util.JavaMultiReleaseModuleSupport
|
||||
import org.jetbrains.idea.maven.importing.MavenImportUtil.MAIN_SUFFIX
|
||||
import org.jetbrains.idea.maven.importing.StandardMavenModuleType
|
||||
import org.jetbrains.jps.model.serialization.SerializationConstants.MAVEN_EXTERNAL_SOURCE_ID
|
||||
|
||||
private class MavenMultiReleaseSupport : MultiReleaseSupport {
|
||||
private class MavenMultiReleaseSupport : JavaMultiReleaseModuleSupport {
|
||||
override fun getMainMultiReleaseModule(additionalModule: Module): Module? {
|
||||
// Maven
|
||||
val project = additionalModule.project
|
||||
|
||||
Reference in New Issue
Block a user