From 6fc7a8b6e5b3f7f67cc8c0534de8a607665c991d Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Tue, 11 Feb 2025 15:09:22 +0100 Subject: [PATCH] [java-core] Split JavaServiceUtil JavaServiceProviderUtil -> codeserver.core JavaServiceLineMarkerUtil -> java-impl GitOrigin-RevId: 65c42cdce19ab257ffd18143cc32ff4bd4aeacf7 --- .../core/JavaServiceProviderUtil.java | 42 +++++++++++++++++++ .../impl/analysis/ModuleHighlightUtil.java | 4 +- .../java19modules/Java9ModuleEntryPoint.java | 4 +- .../reference/RefJavaModuleImpl.java | 4 +- ...Java9UndeclaredServiceUsageInspection.java | 2 +- .../daemon/impl/JavaLineMarkerProvider.java | 11 ++--- .../impl/JavaServiceLineMarkerUtil.java} | 42 +++++-------------- .../daemon/impl/ServiceLineMarkerTest.kt | 2 +- 8 files changed, 67 insertions(+), 44 deletions(-) create mode 100644 java/codeserver/core/src/com/intellij/java/codeserver/core/JavaServiceProviderUtil.java rename java/{java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/JavaServiceUtil.java => java-impl/src/com/intellij/codeInsight/daemon/impl/JavaServiceLineMarkerUtil.java} (87%) diff --git a/java/codeserver/core/src/com/intellij/java/codeserver/core/JavaServiceProviderUtil.java b/java/codeserver/core/src/com/intellij/java/codeserver/core/JavaServiceProviderUtil.java new file mode 100644 index 000000000000..2b91222fcacd --- /dev/null +++ b/java/codeserver/core/src/com/intellij/java/codeserver/core/JavaServiceProviderUtil.java @@ -0,0 +1,42 @@ +// 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.java.codeserver.core; + +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiMethod; +import com.intellij.psi.PsiModifier; +import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Set; + +/** + * Utility for working with Java services (jigsaw) + */ +public final class JavaServiceProviderUtil { + public static final String PROVIDER = "provider"; + public static final Set JAVA_UTIL_SERVICE_LOADER_METHODS = Set.of("load", "loadInstalled"); + + /** + * Checks if the given method is a service provider method. + * + * @param method for checking + * @return true if the method is a service provider method, false otherwise + */ + public static boolean isServiceProviderMethod(@NotNull PsiMethod method) { + return PROVIDER.equals(method.getName()) && + method.getParameterList().isEmpty() && + method.hasModifierProperty(PsiModifier.PUBLIC) && + method.hasModifierProperty(PsiModifier.STATIC); + } + + /** + * Finds a service provider method within a given PsiClass. + * + * @param psiClass to search for the service provider method + * @return service provider method, or null if not found + */ + public static @Nullable PsiMethod findServiceProviderMethod(@NotNull PsiClass psiClass) { + return ContainerUtil.find(psiClass.findMethodsByName("provider", false), JavaServiceProviderUtil::isServiceProviderMethod); + } +} diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/ModuleHighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/ModuleHighlightUtil.java index b4b7582ee46e..5850bc121cdd 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/ModuleHighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/ModuleHighlightUtil.java @@ -6,12 +6,12 @@ import com.intellij.codeInsight.daemon.JavaErrorBundle; import com.intellij.codeInsight.daemon.QuickFixBundle; import com.intellij.codeInsight.daemon.impl.HighlightInfo; import com.intellij.codeInsight.daemon.impl.HighlightInfoType; -import com.intellij.codeInsight.daemon.impl.JavaServiceUtil; import com.intellij.codeInsight.daemon.impl.quickfix.AddExportsDirectiveFix; import com.intellij.codeInsight.daemon.impl.quickfix.AddUsesDirectiveFix; import com.intellij.codeInsight.daemon.impl.quickfix.QuickFixAction; import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.codeInsight.intention.QuickFixFactory; +import com.intellij.java.codeserver.core.JavaServiceProviderUtil; import com.intellij.modcommand.ModCommandAction; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.module.Module; @@ -272,7 +272,7 @@ final class ModuleHighlightUtil { errorSink.accept(info); } - PsiMethod provider = JavaServiceUtil.findServiceProviderMethod(implClass); + PsiMethod provider = JavaServiceProviderUtil.findServiceProviderMethod(implClass); if (provider != null) { PsiType type = provider.getReturnType(); PsiClass typeClass = type instanceof PsiClassType classType ? classType.resolve() : null; diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/java19modules/Java9ModuleEntryPoint.java b/java/java-analysis-impl/src/com/intellij/codeInspection/java19modules/Java9ModuleEntryPoint.java index cb50f37c6ee2..8935f8d6934a 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/java19modules/Java9ModuleEntryPoint.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/java19modules/Java9ModuleEntryPoint.java @@ -1,11 +1,11 @@ // 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.codeInspection.java19modules; -import com.intellij.codeInsight.daemon.impl.JavaServiceUtil; import com.intellij.codeInspection.reference.*; import com.intellij.codeInspection.visibility.EntryPointWithVisibilityLevel; import com.intellij.java.analysis.JavaAnalysisBundle; import com.intellij.java.codeserver.core.JavaPsiModuleUtil; +import com.intellij.java.codeserver.core.JavaServiceProviderUtil; import com.intellij.openapi.util.DefaultJDOMExternalizer; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.WriteExternalException; @@ -53,7 +53,7 @@ public final class Java9ModuleEntryPoint extends EntryPointWithVisibilityLevel { return isServiceOrExported(psiClass); } return psiElement instanceof PsiMethod method && - (isDefaultConstructor(method) || JavaServiceUtil.isServiceProviderMethod(method)) && + (isDefaultConstructor(method) || JavaServiceProviderUtil.isServiceProviderMethod(method)) && isServiceOrExported(method.getContainingClass()); } diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefJavaModuleImpl.java b/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefJavaModuleImpl.java index 77959f345ffe..be01a9093dbe 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefJavaModuleImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefJavaModuleImpl.java @@ -1,8 +1,8 @@ // 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.codeInspection.reference; -import com.intellij.codeInsight.daemon.impl.JavaServiceUtil; import com.intellij.icons.AllIcons; +import com.intellij.java.codeserver.core.JavaServiceProviderUtil; import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.module.ModuleUtilCore; import com.intellij.openapi.project.Project; @@ -136,7 +136,7 @@ public final class RefJavaModuleImpl extends RefElementImpl implements RefJavaMo final PsiElement implementationClass = implementationReference.resolve(); if (implementationClass instanceof PsiClass psiClass) { RefElement refTargetElement = null; - PsiElement targetElement = JavaServiceUtil.findServiceProviderMethod(psiClass); + PsiElement targetElement = JavaServiceProviderUtil.findServiceProviderMethod(psiClass); if (targetElement == null) { final RefElement refElement = getRefManager().getReference(psiClass); diff --git a/java/java-impl-inspections/src/com/intellij/codeInspection/java19api/Java9UndeclaredServiceUsageInspection.java b/java/java-impl-inspections/src/com/intellij/codeInspection/java19api/Java9UndeclaredServiceUsageInspection.java index d1256994a3fb..5f033d0e34ab 100644 --- a/java/java-impl-inspections/src/com/intellij/codeInspection/java19api/Java9UndeclaredServiceUsageInspection.java +++ b/java/java-impl-inspections/src/com/intellij/codeInspection/java19api/Java9UndeclaredServiceUsageInspection.java @@ -13,7 +13,7 @@ import org.jetbrains.annotations.NotNull; import java.util.Set; -import static com.intellij.codeInsight.daemon.impl.JavaServiceUtil.JAVA_UTIL_SERVICE_LOADER_METHODS; +import static com.intellij.java.codeserver.core.JavaServiceProviderUtil.JAVA_UTIL_SERVICE_LOADER_METHODS; import static com.intellij.psi.CommonClassNames.JAVA_UTIL_SERVICE_LOADER; import static com.intellij.psi.impl.source.resolve.reference.impl.JavaReflectionReferenceUtil.ReflectiveType; diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/JavaLineMarkerProvider.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/JavaLineMarkerProvider.java index 1c3ac48f47dd..8e845d4a3160 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/JavaLineMarkerProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/JavaLineMarkerProvider.java @@ -6,6 +6,7 @@ import com.intellij.codeInsight.daemon.*; import com.intellij.concurrency.JobLauncher; import com.intellij.icons.AllIcons; import com.intellij.java.JavaBundle; +import com.intellij.java.codeserver.core.JavaServiceProviderUtil; import com.intellij.openapi.actionSystem.IdeActions; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.colors.EditorColorsManager; @@ -211,18 +212,18 @@ public class JavaLineMarkerProvider extends LineMarkerProviderDescriptor impleme if (mySiblingsOption.isEnabled() && FindSuperElementsHelper.canHaveSiblingSuper(method, containingClass)) { canHaveSiblings.putValue(containingClass, method); } - if (JavaServiceUtil.isServiceProviderMethod(method)) { - tasks.add(() -> JavaServiceUtil.collectServiceProviderMethod(method)); + if (JavaServiceProviderUtil.isServiceProviderMethod(method)) { + tasks.add(() -> JavaServiceLineMarkerUtil.collectServiceProviderMethod(method)); } } else if (parent instanceof PsiClass && !(parent instanceof PsiTypeParameter)) { tasks.add(() -> collectInheritingClasses((PsiClass)parent)); - tasks.add(() -> JavaServiceUtil.collectServiceImplementationClass((PsiClass)parent)); + tasks.add(() -> JavaServiceLineMarkerUtil.collectServiceImplementationClass((PsiClass)parent)); } else if (parent instanceof PsiReferenceExpression && parent.getParent() instanceof PsiMethodCallExpression parentCall && - JavaServiceUtil.SERVICE_LOADER_LOAD.test(parentCall)) { - tasks.add(() -> JavaServiceUtil.collectServiceLoaderLoadCall((PsiIdentifier)element, parentCall)); + JavaServiceLineMarkerUtil.SERVICE_LOADER_LOAD.test(parentCall)) { + tasks.add(() -> JavaServiceLineMarkerUtil.collectServiceLoaderLoadCall((PsiIdentifier)element, parentCall)); } } diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/JavaServiceUtil.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/JavaServiceLineMarkerUtil.java similarity index 87% rename from java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/JavaServiceUtil.java rename to java/java-impl/src/com/intellij/codeInsight/daemon/impl/JavaServiceLineMarkerUtil.java index 38f8115f243f..5bbbbead20f8 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/JavaServiceUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/JavaServiceLineMarkerUtil.java @@ -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.codeInsight.daemon.impl; import com.intellij.codeInsight.daemon.GutterIconNavigationHandler; @@ -6,6 +6,7 @@ import com.intellij.codeInsight.daemon.LineMarkerInfo; import com.intellij.icons.AllIcons; import com.intellij.java.analysis.JavaAnalysisBundle; import com.intellij.java.codeserver.core.JavaPsiModuleUtil; +import com.intellij.java.codeserver.core.JavaServiceProviderUtil; import com.intellij.navigation.NavigationItem; import com.intellij.openapi.editor.markup.GutterIconRenderer; import com.intellij.openapi.util.NlsSafe; @@ -24,42 +25,21 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.awt.event.MouseEvent; -import java.util.*; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.Optional; import static com.intellij.psi.CommonClassNames.JAVA_UTIL_SERVICE_LOADER; /** - * Utility for working with Java services (jigsaw) + * Utility for generating JPMS service provider line markers */ -public final class JavaServiceUtil { - public static final String PROVIDER = "provider"; - public static final Set JAVA_UTIL_SERVICE_LOADER_METHODS = Set.of("load", "loadInstalled"); +final class JavaServiceLineMarkerUtil { static final CallMatcher SERVICE_LOADER_LOAD = CallMatcher.staticCall(JAVA_UTIL_SERVICE_LOADER, - ArrayUtil.toStringArray(JAVA_UTIL_SERVICE_LOADER_METHODS)); - - /** - * Checks if the given method is a service provider method. - * - * @param method for checking - * @return true if the method is a service provider method, false otherwise - */ - public static boolean isServiceProviderMethod(@NotNull PsiMethod method) { - return PROVIDER.equals(method.getName()) && - method.getParameterList().isEmpty() && - method.hasModifierProperty(PsiModifier.PUBLIC) && - method.hasModifierProperty(PsiModifier.STATIC); - } - - /** - * Finds a service provider method within a given PsiClass. - * - * @param psiClass to search for the service provider method - * @return service provider method, or null if not found - */ - public static @Nullable PsiMethod findServiceProviderMethod(@NotNull PsiClass psiClass) { - return ContainerUtil.find(psiClass.findMethodsByName("provider", false), JavaServiceUtil::isServiceProviderMethod); - } + ArrayUtil.toStringArray( + JavaServiceProviderUtil.JAVA_UTIL_SERVICE_LOADER_METHODS)); static @NotNull List> collectServiceProviderMethod(@NotNull PsiMethod method) { PsiClass containingClass = method.getContainingClass(); @@ -68,7 +48,7 @@ public final class JavaServiceUtil { } static @NotNull List> collectServiceImplementationClass(@NotNull PsiClass psiClass) { - if (findServiceProviderMethod(psiClass) != null) return Collections.emptyList(); + if (JavaServiceProviderUtil.findServiceProviderMethod(psiClass) != null) return Collections.emptyList(); for (PsiMethod constructor : psiClass.getConstructors()) { if (!constructor.hasParameters()) return createJavaServiceLineMarkerInfo(constructor.getNameIdentifier(), psiClass, psiClass); } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/ServiceLineMarkerTest.kt b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/ServiceLineMarkerTest.kt index c2802d463d62..8c5fc2b19d27 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/ServiceLineMarkerTest.kt +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/ServiceLineMarkerTest.kt @@ -2,7 +2,7 @@ package com.intellij.codeInsight.daemon.impl import com.intellij.codeInsight.daemon.LineMarkerInfo -import com.intellij.codeInsight.daemon.impl.JavaServiceUtil.ServiceNavigationHandler +import com.intellij.codeInsight.daemon.impl.JavaServiceLineMarkerUtil.ServiceNavigationHandler import com.intellij.icons.AllIcons import com.intellij.psi.* import com.intellij.psi.util.PsiTreeUtil