From c26cc8248642f4fb807ed88597683f223a9f9b5f Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 16 Sep 2015 16:55:22 +0300 Subject: [PATCH] notify about refs to foreign types (IDEA-145186) --- .../codeInspection/reference/RefJavaUtil.java | 2 ++ .../reference/RefFieldImpl.java | 18 +---------- .../reference/RefJavaUtilImpl.java | 31 +++++++++++++------ .../reference/RefMethodImpl.java | 21 +------------ .../usedJunitFromField/expected.xml | 3 ++ .../usedJunitFromField/src/MyTest.java | 4 +++ .../UnusedLibraryInspectionTest.java | 4 ++- 7 files changed, 35 insertions(+), 48 deletions(-) create mode 100644 java/java-tests/testData/inspection/unusedLibrary/usedJunitFromField/expected.xml create mode 100644 java/java-tests/testData/inspection/unusedLibrary/usedJunitFromField/src/MyTest.java diff --git a/java/java-analysis-api/src/com/intellij/codeInspection/reference/RefJavaUtil.java b/java/java-analysis-api/src/com/intellij/codeInspection/reference/RefJavaUtil.java index 02621a3ca0fc..55a242c44655 100644 --- a/java/java-analysis-api/src/com/intellij/codeInspection/reference/RefJavaUtil.java +++ b/java/java-analysis-api/src/com/intellij/codeInspection/reference/RefJavaUtil.java @@ -22,6 +22,7 @@ package com.intellij.codeInspection.reference; import com.intellij.openapi.components.ServiceManager; import com.intellij.psi.*; +import com.intellij.psi.util.PsiUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -72,4 +73,5 @@ public abstract class RefJavaUtil { public abstract boolean isCallToSuperMethod(PsiExpression expression, PsiMethod method); public abstract void addTypeReference(PsiElement psiElement, PsiType psiType, RefManager refManager); + public abstract void addTypeReference(PsiElement psiElement, PsiType psiType, RefManager refManager, @Nullable RefJavaElement refElement); } diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefFieldImpl.java b/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefFieldImpl.java index d2de19b5aac5..cc31cddd6b98 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefFieldImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefFieldImpl.java @@ -133,23 +133,7 @@ public class RefFieldImpl extends RefJavaElementImpl implements RefField { setFlag(true, USED_FOR_WRITING_MASK); } } - PsiType psiType = psiField.getType(); - RefClass ownerClass = refUtil.getOwnerClass(getRefManager(), psiField); - - if (ownerClass != null) { - psiType = psiType.getDeepComponentType(); - if (psiType instanceof PsiClassType) { - PsiClass psiClass = PsiUtil.resolveClassInType(psiType); - if (psiClass != null && getRefManager().belongsToScope(psiClass)) { - RefClassImpl refClass = (RefClassImpl)getRefManager().getReference(psiClass); - if (refClass != null) { - refClass.addTypeReference(ownerClass); - refClass.addClassExporter(this); - } - } - } - - } + refUtil.addTypeReference(psiField, psiField.getType(), getRefManager(), this); getRefManager().fireBuildReferences(this); } } diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefJavaUtilImpl.java b/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefJavaUtilImpl.java index da24eb09b85d..ba105015a0f7 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefJavaUtilImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefJavaUtilImpl.java @@ -485,17 +485,28 @@ public class RefJavaUtilImpl extends RefJavaUtil{ @Override public void addTypeReference(PsiElement psiElement, PsiType psiType, RefManager refManager) { - RefClass ownerClass = getOwnerClass(refManager, psiElement); + addTypeReference(psiElement, psiType, refManager, null); + } - if (ownerClass != null) { - psiType = psiType.getDeepComponentType(); - - if (psiType instanceof PsiClassType) { - PsiClass psiClass = PsiUtil.resolveClassInType(psiType); - if (psiClass != null && refManager.belongsToScope(psiClass)) { - RefClassImpl refClass = (RefClassImpl)refManager.getReference(psiClass); - if (refClass != null) { - refClass.addTypeReference(ownerClass); + @Override + public void addTypeReference(PsiElement psiElement, PsiType psiType, RefManager refManager, @Nullable RefJavaElement refMethod) { + if (psiType != null) { + final RefClass ownerClass = getOwnerClass(refManager, psiElement); + if (ownerClass != null) { + psiType = psiType.getDeepComponentType(); + if (psiType instanceof PsiClassType) { + PsiClass psiClass = PsiUtil.resolveClassInType(psiType); + if (psiClass != null && refManager.belongsToScope(psiClass)) { + RefClassImpl refClass = (RefClassImpl)refManager.getReference(psiClass); + if (refClass != null) { + refClass.addTypeReference(ownerClass); + if (refMethod != null) { + refClass.addClassExporter(refMethod); + } + } + } + else { + ((RefManagerImpl)refManager).fireNodeMarkedReferenced(psiClass, psiElement, false); } } } diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefMethodImpl.java b/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefMethodImpl.java index 778b6b47d94a..b7d9337b90fe 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefMethodImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefMethodImpl.java @@ -287,26 +287,7 @@ public class RefMethodImpl extends RefJavaElementImpl implements RefMethod { setBodyEmpty(isOnlyCallsSuper() || !isExternalOverride() && (body == null || body.getStatements().length == 0)); - PsiType retType = method.getReturnType(); - if (retType != null) { - PsiType psiType = retType; - RefClass ownerClass = refUtil.getOwnerClass(getRefManager(), method); - - if (ownerClass != null) { - psiType = psiType.getDeepComponentType(); - - if (psiType instanceof PsiClassType) { - PsiClass psiClass = PsiUtil.resolveClassInType(psiType); - if (psiClass != null && getRefManager().belongsToScope(psiClass)) { - RefClassImpl refClass = (RefClassImpl) getRefManager().getReference(psiClass); - if (refClass != null) { - refClass.addTypeReference(ownerClass); - refClass.addClassExporter(this); - } - } - } - } - } + refUtil.addTypeReference(method, method.getReturnType(), getRefManager(), this); for (RefParameter parameter : getParameters()) { refUtil.setIsFinal(parameter, parameter.getElement().hasModifierProperty(PsiModifier.FINAL)); diff --git a/java/java-tests/testData/inspection/unusedLibrary/usedJunitFromField/expected.xml b/java/java-tests/testData/inspection/unusedLibrary/usedJunitFromField/expected.xml new file mode 100644 index 000000000000..ec272abeaa3a --- /dev/null +++ b/java/java-tests/testData/inspection/unusedLibrary/usedJunitFromField/expected.xml @@ -0,0 +1,3 @@ + + + diff --git a/java/java-tests/testData/inspection/unusedLibrary/usedJunitFromField/src/MyTest.java b/java/java-tests/testData/inspection/unusedLibrary/usedJunitFromField/src/MyTest.java new file mode 100644 index 000000000000..e8f4de1bb01a --- /dev/null +++ b/java/java-tests/testData/inspection/unusedLibrary/usedJunitFromField/src/MyTest.java @@ -0,0 +1,4 @@ +import junit.framework.TestCase; +public class MyTest { + TestCase myTestCase; +} diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/UnusedLibraryInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/UnusedLibraryInspectionTest.java index 938a86da7587..7409e200e86a 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/UnusedLibraryInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/UnusedLibraryInspectionTest.java @@ -49,7 +49,7 @@ public class UnusedLibraryInspectionTest extends InspectionTestCase { @Override protected void setupRootModel(String testDir, VirtualFile[] sourceDir, String sdkName) { super.setupRootModel(testDir, sourceDir, sdkName); - PsiTestUtil.addLibrary(getModule(), "JUnit", getTestDataPath() + "/junit.jar"); + PsiTestUtil.addLibrary(getModule(), "JUnit", getTestDataPath(), "/junit.jar"); } private void doTest() throws Exception { @@ -63,4 +63,6 @@ public class UnusedLibraryInspectionTest extends InspectionTestCase { } public void testSimple() throws Exception { doTest(); } + public void testUsedJunit() throws Exception { doTest(); } + public void testUsedJunitFromField() throws Exception { doTest(); } }