IJ-CR-134196 [java-highlighting]IDEA-352727 Incomplete model with lombok

- skip unused import in incomplete mode

GitOrigin-RevId: 537fa533381ca5db2cba1e19cae3ca402c31f8e6
This commit is contained in:
Mikhail Pyltsin
2024-05-23 11:08:54 +02:00
committed by intellij-monorepo-bot
parent 9cdce615e7
commit 9ff8676d0f
4 changed files with 41 additions and 2 deletions

View File

@@ -199,7 +199,12 @@ final class IncompleteModelUtil {
PsiImportList list = file.getImportList();
List<PsiImportStatementBase> 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);
}
}

View File

@@ -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<Boolean> result = Ref.create();
forEach(psiImport.getProject(), provider -> {
boolean augmentedForIncompleteMode = provider.mightBeUsedImportForIncompleteMode(psiImport);
result.set(augmentedForIncompleteMode);
return !augmentedForIncompleteMode;
});
return result.get();
}
}

View File

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

View File

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