diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/IncompleteModelUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/IncompleteModelUtil.java index 979d13616d34..53c9835720e7 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/IncompleteModelUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/IncompleteModelUtil.java @@ -199,7 +199,12 @@ final class IncompleteModelUtil { PsiImportList list = file.getImportList(); List imports = new ArrayList<>(); if (list != null) { + boolean incompleteModel = isIncompleteModel(file); for (PsiImportStatementBase statement : list.getAllImportStatements()) { + if (incompleteModel && canBeUsedImportImplicitly(statement)) { + imports.add(statement); + continue; + } if (statement instanceof PsiImportStaticStatement staticImport && staticImport.resolveTargetClass() != null) continue; if (!statement.isOnDemand()) { PsiJavaCodeReferenceElement reference = statement.getImportReference(); @@ -280,4 +285,9 @@ final class IncompleteModelUtil { return CachedValuesManager.getProjectPsiDependentCache(targetClass, psiClass -> PsiAugmentProvider.canBeAugmentedForIncompleteMode(psiClass)); } + + static boolean canBeUsedImportImplicitly(@Nullable PsiImportStatementBase importStatementBase) { + if (importStatementBase == null) return false; + return PsiAugmentProvider.canBeUsedImportForIncompleteMode(importStatementBase); + } } diff --git a/java/java-psi-api/src/com/intellij/psi/augment/PsiAugmentProvider.java b/java/java-psi-api/src/com/intellij/psi/augment/PsiAugmentProvider.java index 564d423efaa0..1063de6451fc 100644 --- a/java/java-psi-api/src/com/intellij/psi/augment/PsiAugmentProvider.java +++ b/java/java-psi-api/src/com/intellij/psi/augment/PsiAugmentProvider.java @@ -279,6 +279,18 @@ public abstract class PsiAugmentProvider implements PossiblyDumbAware { return false; } + + /** + * Checks if the given PsiImportStatementBase might be used. + * This method is usually called in incomplete mode. + * + * @param psiImport the PsiImportStatementBase to be checked + * @return true if the import might be used, false otherwise + */ + protected boolean mightBeUsedImportForIncompleteMode(@NotNull PsiImportStatementBase psiImport) { + return false; + } + /** * Checks if the given PsiClass might be augmented. * This method is usually called in incomplete mode. @@ -296,4 +308,14 @@ public abstract class PsiAugmentProvider implements PossiblyDumbAware { }); return result.get(); } + + public static boolean canBeUsedImportForIncompleteMode(@NotNull PsiImportStatementBase psiImport) { + Ref result = Ref.create(); + forEach(psiImport.getProject(), provider -> { + boolean augmentedForIncompleteMode = provider.mightBeUsedImportForIncompleteMode(psiImport); + result.set(augmentedForIncompleteMode); + return !augmentedForIncompleteMode; + }); + return result.get(); + } } \ No newline at end of file diff --git a/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAugmentProvider.java b/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAugmentProvider.java index bfa77d5367d1..628c8c842c8e 100644 --- a/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAugmentProvider.java +++ b/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAugmentProvider.java @@ -215,11 +215,16 @@ public final class LombokAugmentProvider extends PsiAugmentProvider implements P ContainerUtil.exists(extensibleClass.getOwnFields(), field -> hasAnyLombokAnnotation(field.getAnnotations())) || (file.getImportList() != null && ContainerUtil.exists(file.getImportList().getAllImportStatements(), statement -> { - PsiJavaCodeReferenceElement reference = statement.getImportReference(); - return reference != null && reference.getText().startsWith("lombok"); + return mightBeUsedImportForIncompleteMode(statement); })); } + @Override + protected boolean mightBeUsedImportForIncompleteMode(@NotNull PsiImportStatementBase psiImport) { + if (psiImport instanceof PsiImportStaticStatement) return false; + PsiJavaCodeReferenceElement reference = psiImport.getImportReference(); + return reference != null && reference.getText().startsWith("lombok"); + } /** * Checks if the given PsiModifierListOwner has any Lombok annotation. diff --git a/plugins/lombok/src/test/java/com/intellij/java/lomboktest/LombokIncompleteModeHighlightingTest.java b/plugins/lombok/src/test/java/com/intellij/java/lomboktest/LombokIncompleteModeHighlightingTest.java index 49c29d1e6a96..c53667bc082b 100644 --- a/plugins/lombok/src/test/java/com/intellij/java/lomboktest/LombokIncompleteModeHighlightingTest.java +++ b/plugins/lombok/src/test/java/com/intellij/java/lomboktest/LombokIncompleteModeHighlightingTest.java @@ -1,6 +1,7 @@ package com.intellij.java.lomboktest; import com.intellij.codeInsight.daemon.LightDaemonAnalyzerTestCase; +import com.intellij.codeInspection.unusedImport.UnusedImportInspection; import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.project.IncompleteDependenciesService; import com.intellij.testFramework.PlatformTestUtil; @@ -22,6 +23,7 @@ public class LombokIncompleteModeHighlightingTest extends LightDaemonAnalyzerTes } private void doTest(String fileName) { + enableInspectionTools(new UnusedImportInspection()); IncompleteDependenciesService service = getProject().getService(IncompleteDependenciesService.class); try (var ignored = asAutoCloseable(WriteAction.compute(() -> service.enterIncompleteState()))) { doTest("/plugins/lombok/testData/highlightingIncompleteMode/" + fileName, true, true);