Java: don't expose implementation detail in API

(cherry picked from commit 952d1b3c68f9a011ad7826cc8a1075f2ef990e6d)

GitOrigin-RevId: 87445fc4969225a3a03befab8a5ce5640283cc53
This commit is contained in:
Bas Leijdekkers
2024-10-16 10:53:11 +02:00
committed by intellij-monorepo-bot
parent 340fe61f67
commit b21fd06310
5 changed files with 31 additions and 23 deletions

View File

@@ -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;

View File

@@ -237,7 +237,7 @@ public abstract class ImportClassFixBase<T extends PsiElement, R extends PsiRefe
String packageName = StringUtil.getPackageName(qualifiedName);
if (!packageName.isEmpty() &&
file instanceof PsiJavaFile javaFile &&
!ImportUtils.createImplicitImportChecker(javaFile).isImplicitlyImported(new ImportUtils.Import(qualifiedName, false))) {
!ImportUtils.createImplicitImportChecker(javaFile).isImplicitlyImported(qualifiedName, false)) {
classList.removeIf(aClass -> {
String classQualifiedName = aClass.getQualifiedName();
return classQualifiedName != null && !packageName.equals(StringUtil.getPackageName(classQualifiedName));

View File

@@ -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) {

View File

@@ -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) {}
}

View File

@@ -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<ImportUtils.Import> names = new ArrayList<>();
final @NotNull List<ImportHelper.Import> names = new ArrayList<>();
final Set<String> 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<ImportUtils.Import> sortedNames = ImportHelper.sortItemsAccordingToSettings(names, settings);
final @NotNull List<ImportHelper.Import> sortedNames = ImportHelper.sortItemsAccordingToSettings(names, settings);
final Map<String, Boolean> onDemand = new HashMap<>();
ImportHelper.collectOnDemandImports(sortedNames, settings, onDemand);
for (String s : demandedForNested) {
@@ -56,7 +55,7 @@ public final class JavaFxImportsOptimizer implements ImportOptimizer {
}
final Set<String> imported = new HashSet<>();
final List<String> 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<ImportUtils.Import> names,
private static void collectNamesToImport(final @NotNull List<ImportHelper.Import> names,
final @NotNull Collection<String> 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