[java-core] Split JavaServiceUtil

JavaServiceProviderUtil -> codeserver.core
JavaServiceLineMarkerUtil -> java-impl

GitOrigin-RevId: 65c42cdce19ab257ffd18143cc32ff4bd4aeacf7
This commit is contained in:
Tagir Valeev
2025-02-11 18:46:42 +00:00
committed by intellij-monorepo-bot
parent d083806610
commit 6fc7a8b6e5
8 changed files with 67 additions and 44 deletions
@@ -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<String> 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);
}
}
@@ -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;
@@ -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());
}
@@ -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);
@@ -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;
@@ -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));
}
}
@@ -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<String> 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<LineMarkerInfo<PsiElement>> collectServiceProviderMethod(@NotNull PsiMethod method) {
PsiClass containingClass = method.getContainingClass();
@@ -68,7 +48,7 @@ public final class JavaServiceUtil {
}
static @NotNull List<LineMarkerInfo<PsiElement>> 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);
}
@@ -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