From b21fd06310a58281e91d42352b641b6e8a7f3f54 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Wed, 16 Oct 2024 10:53:11 +0200 Subject: [PATCH] Java: don't expose implementation detail in API (cherry picked from commit 952d1b3c68f9a011ad7826cc8a1075f2ef990e6d) GitOrigin-RevId: 87445fc4969225a3a03befab8a5ce5640283cc53 --- .../com/siyeh/ig/psiutils/ImportUtils.java | 14 ++++++------ .../impl/quickfix/ImportClassFixBase.java | 2 +- .../impl/AddOnDemandStaticImportAction.java | 3 +-- .../impl/source/codeStyle/ImportHelper.java | 22 ++++++++++++++----- .../codeInsight/JavaFxImportsOptimizer.java | 13 +++++------ 5 files changed, 31 insertions(+), 23 deletions(-) diff --git a/java/java-analysis-impl/src/com/siyeh/ig/psiutils/ImportUtils.java b/java/java-analysis-impl/src/com/siyeh/ig/psiutils/ImportUtils.java index ee0a45cd296c..f26a14c45427 100644 --- a/java/java-analysis-impl/src/com/siyeh/ig/psiutils/ImportUtils.java +++ b/java/java-analysis-impl/src/com/siyeh/ig/psiutils/ImportUtils.java @@ -66,7 +66,7 @@ public final class ImportUtils { if (containingPackageName.equals(packageName) || importList.findSingleClassImportStatement(qualifiedName) != null) { return; } - if ((createImplicitImportChecker(javaFile).isImplicitlyImported(new Import(qualifiedName, false)) || + if ((createImplicitImportChecker(javaFile).isImplicitlyImported(qualifiedName, false) || importList.findOnDemandImportStatement(packageName) != null || ContainerUtil.exists(importList.getImportModuleStatements(), moduleStatement -> moduleStatement.findImportedPackage(packageName) != null)) @@ -549,7 +549,7 @@ public final class ImportUtils { } private static boolean hasImplicitStaticImport(@NotNull PsiJavaFile file, @NotNull String name) { - return createImplicitImportChecker(file).isImplicitlyImported(new Import(name, true)); + return createImplicitImportChecker(file).isImplicitlyImported(name, true); } @@ -591,10 +591,10 @@ public final class ImportUtils { } } - public boolean isImplicitlyImported(@NotNull Import name) { - String packageOrClassName = getPackageOrClassName(name.name); - String className = ClassUtil.extractClassName(name.name); - if (!name.isStatic) { + public boolean isImplicitlyImported(String qName, boolean isStatic) { + String packageOrClassName = getPackageOrClassName(qName); + String className = ClassUtil.extractClassName(qName); + if (!isStatic) { for (PsiImportModuleStatement psiImportModuleStatement : myModulesStatements) { PsiPackageAccessibilityStatement importedPackage = psiImportModuleStatement.findImportedPackage(packageOrClassName); if (importedPackage == null) continue; @@ -614,7 +614,7 @@ public final class ImportUtils { PsiJavaCodeReferenceElement reference = psiImportStaticStatement.getImportReference(); if (reference == null) return false; String qualifiedName = reference.getQualifiedName(); - return name.name.equals(qualifiedName); + return qName.equals(qualifiedName); } } return false; diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFixBase.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFixBase.java index 625fd354c0a3..9a7971112ff3 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFixBase.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFixBase.java @@ -237,7 +237,7 @@ public abstract class ImportClassFixBase { String classQualifiedName = aClass.getQualifiedName(); return classQualifiedName != null && !packageName.equals(StringUtil.getPackageName(classQualifiedName)); diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddOnDemandStaticImportAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddOnDemandStaticImportAction.java index f88ebf58aa40..6bafddead943 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddOnDemandStaticImportAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddOnDemandStaticImportAction.java @@ -150,8 +150,7 @@ public final class AddOnDemandStaticImportAction extends PsiUpdateModCommandActi } boolean alreadyImported = false; String qualifiedName = aClass.getQualifiedName(); - if (qualifiedName != null && - ImportUtils.createImplicitImportChecker(psiJavaFile).isImplicitlyImported(new ImportUtils.Import(qualifiedName + ".*", true))) { + if (qualifiedName != null && ImportUtils.createImplicitImportChecker(psiJavaFile).isImplicitlyImported(qualifiedName + ".*", true)) { alreadyImported = true; } if (!alreadyImported) { diff --git a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java index 092beed00225..489702b9037e 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java @@ -45,6 +45,7 @@ import com.siyeh.ig.psiutils.ImportUtils; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import one.util.streamex.StreamEx; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -212,7 +213,7 @@ public final class ImportHelper{ String name = anImport.name(); String prefix = getPackageOrClassName(name); if (prefix.isEmpty()) continue; - boolean isImplicitlyImported = checker.isImplicitlyImported(anImport); + boolean isImplicitlyImported = checker.isImplicitlyImported(name, anImport.isStatic()); if (!onDemandImports.contains(prefix) && !isImplicitlyImported) continue; String shortName = PsiNameHelper.getShortClassName(name); @@ -387,7 +388,7 @@ public final class ImportHelper{ String name = importedName.name(); boolean isStatic = importedName.isStatic(); String packageOrClassName = getPackageOrClassName(name); - boolean implicitlyImported = implicitImportContext.isImplicitlyImported(importedName); + boolean implicitlyImported = implicitImportContext.isImplicitlyImported(name, isStatic); boolean useOnDemand = implicitlyImported || packagesOrClassesToImportOnDemand.contains(packageOrClassName); Import current = new Import(packageOrClassName, isStatic); if (namesToUseSingle.remove(name)) { @@ -1069,21 +1070,30 @@ public final class ImportHelper{ if (psiClass == null) return false; String qualifiedName = psiClass.getQualifiedName(); if (qualifiedName == null) return false; - ImplicitImportChecker checker = createImplicitImportChecker(file); - return checker.isImplicitlyImported(new Import(qualifiedName, psiClass.hasModifierProperty(PsiModifier.STATIC))); + return createImplicitImportChecker(file).isImplicitlyImported(qualifiedName, psiClass.hasModifierProperty(PsiModifier.STATIC)); } private static boolean isImplicitlyImported(@Nullable PsiClass psiClass, @NotNull ImplicitImportChecker checker) { if (psiClass == null) return false; String qualifiedName = psiClass.getQualifiedName(); if (qualifiedName == null) return false; - return checker.isImplicitlyImported(new Import(qualifiedName, psiClass.hasModifierProperty(PsiModifier.STATIC))); + return checker.isImplicitlyImported(qualifiedName, psiClass.hasModifierProperty(PsiModifier.STATIC)); } - static boolean hasPackage(@NotNull String className, @NotNull String packageName){ + static boolean hasPackage(@NotNull String className, @NotNull String packageName) { if (!className.startsWith(packageName)) return false; if (className.length() == packageName.length()) return false; if (!packageName.isEmpty() && className.charAt(packageName.length()) != '.') return false; return className.indexOf('.', packageName.length() + 1) < 0; } + + /** + * An imported element, e.g. a fully qualified class name. + * This is an implementation detail, unfortunately public because of JavaFX, don't expose it in public API. + * + * @param name the fully qualified name of the element that should be imported. + * @param isStatic whether it should be imported statically. + */ + @ApiStatus.Internal + public record Import(@NotNull String name, boolean isStatic) {} } diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/codeInsight/JavaFxImportsOptimizer.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/codeInsight/JavaFxImportsOptimizer.java index 0a1b97494204..3cd1325816c1 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/codeInsight/JavaFxImportsOptimizer.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/codeInsight/JavaFxImportsOptimizer.java @@ -1,4 +1,4 @@ -// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// 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.plugins.javaFX.fxml.codeInsight; import com.intellij.ide.highlighter.XmlFileType; @@ -17,7 +17,6 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.xml.*; import com.intellij.xml.XmlAttributeDescriptor; import com.intellij.xml.XmlElementDescriptor; -import com.siyeh.ig.psiutils.ImportUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.javaFX.fxml.JavaFxFileTypeFactory; @@ -43,12 +42,12 @@ public final class JavaFxImportsOptimizer implements ImportOptimizer { if (vFile == null || !ProjectRootManager.getInstance(project).getFileIndex().isInSourceContent(vFile)) { return EmptyRunnable.INSTANCE; } - final @NotNull List names = new ArrayList<>(); + final @NotNull List names = new ArrayList<>(); final Set demandedForNested = new HashSet<>(); collectNamesToImport(names, demandedForNested, (XmlFile)file); names.sort((o1, o2) -> StringUtil.compare(o1.name(), o2.name(), true)); final JavaCodeStyleSettings settings = JavaCodeStyleSettings.getInstance(file); - final @NotNull List sortedNames = ImportHelper.sortItemsAccordingToSettings(names, settings); + final @NotNull List sortedNames = ImportHelper.sortItemsAccordingToSettings(names, settings); final Map onDemand = new HashMap<>(); ImportHelper.collectOnDemandImports(sortedNames, settings, onDemand); for (String s : demandedForNested) { @@ -56,7 +55,7 @@ public final class JavaFxImportsOptimizer implements ImportOptimizer { } final Set imported = new HashSet<>(); final List imports = new ArrayList<>(); - for (ImportUtils.Import anImport : sortedNames) { + for (ImportHelper.Import anImport : sortedNames) { final String qName = anImport.name(); final String packageName = StringUtil.getPackageName(qName); if (imported.contains(packageName) || imported.contains(qName)) { @@ -95,13 +94,13 @@ public final class JavaFxImportsOptimizer implements ImportOptimizer { }; } - private static void collectNamesToImport(final @NotNull List names, + private static void collectNamesToImport(final @NotNull List names, final @NotNull Collection demandedForNested, @NotNull XmlFile file) { file.accept(new JavaFxUsedClassesVisitor() { @Override protected void appendClassName(String fqn) { - names.add(new ImportUtils.Import(fqn, false)); + names.add(new ImportHelper.Import(fqn, false)); } @Override